在unix系統下可以通過ifconfig命令來查詢和設置網絡接口的運行參數,在各個unix系統下,它的絕大多數功能是一樣的,不過今天我發現了一個在Linux和Solaris下不一致的地方。那就是ifconfig的up命令。
在Solaris下執行如下兩個命令
#ifconfig ifname down
#ifconfig ifname up
把ifname替換成相應的網絡接口的名稱。這兩個名稱執行完以後,相應的網絡接口的網絡連接不會發生變公。這就是說ifconfig的“up”命令完成的剛好是“down”命令相反的功能,這個是正確的。但是在Linux下就不一樣了,在Linux下同樣執行上面兩條命令後,相應網絡接口的網絡連接就會產生差異了。比如我的機子上只有一個連接的接口eth0,執行如下操作:
#ifconfig eth0 down
#ifconfig eth0 up
這時候再來連接google就會連不上,ping也ping不通。但是如果ping某一個外網的IP地址(比如66.249.89.99)就能ping得通。但是在Solaris下不光能ping得通IP地址,還能ping通域名並且能通過域名進行連接。如果把上面的第二條命令
#ifconfig eth0 up
換成下面的命令
#ifup eth0
那麼在Linux下命令執行前後的網絡連接就是一致的。從這裡可以推斷出在Linux下完成與ifconfig eth0 down命令相反功能的命令是ifup eth0 而不是ifconfig eth0 up。這可能是Linux下ifconfig命令實現得不完善的一個地方。
從源碼分析發現兩個系統下的ifconfig的up命令都是通過調用ioctl的SIOCSIFFLAGS命令來完成這個工作的。我也寫了一個測試ioctl()函數的程序來測試,發現在Linux下通過ioctl()的SIOCSIFFLAGS命令來設置網口的IFF_UP標志後,只能夠通過IP地址訪問遠程主機,並不能通過域名訪問遠程主機。但是在Solaris下這是沒問題的。難道這是Linux下的ioctl()函數的bug引起的。