????????之前用?nginx
?的時候,發現用這幾個?IP
,都能正常訪問到?nginx
?的歡迎網頁。一度認為這幾個?IP
?都是一樣的。
但本質上還是有些區別的。
首先?localhost
?就不叫?IP
,它是一個域名,就跟?"baidu.com"
,是一個形式的東西,只不過默認會把它解析為?127.0.0.1
?,當然這可以在?/etc/hosts
?文件下進行修改。
所以默認情況下,使用?localhost
?跟使用?127.0.0.1
?確實是沒區別的。
其次就是?0.0.0.0
,執行 ping 0.0.0.0 ,是會失敗的,因為它在IPV4
中表示的是無效的目標地址。
1 2 3 4 | $ ping 0.0.0.0 PING 0.0.0.0 (0.0.0.0): 56 data bytes ping: sendto: No route to host ping: sendto: No route to host |
但它還是很有用處的,回想下,我們啟動服務器的時候,一般會?listen
?一個 IP 和端口,等待客戶端的連接。
如果此時?listen
?的是本機的?0.0.0.0
?, 那么它表示本機上的所有 IPV4 地址。
1 2 | /* Address to accept any incoming messages. */ #define INADDR_ANY ((unsigned long int) 0x00000000) /* 0.0.0.0 */ |
舉個例子。剛剛提到的?127.0.0.1
?和?192.168.31.6
?,都是本機的 IPV4 地址,如果監聽?0.0.0.0
?,那么用上面兩個地址,都能訪問到這個服務器。
當然, 客戶端?connect
?時,不能使用?0.0.0.0
?。必須指明要連接哪個服務器 IP。
總結
-
127.0.0.1
?是回環地址。localhost
是域名,但默認等于?127.0.0.1
。 -
ping
?回環地址和?ping
?本機地址,是一樣的,走的是lo0 “假網卡”,都會經過網絡層和數據鏈路層等邏輯,最后在快要出網卡前狠狠拐了個彎, 將數據插入到一個鏈表后就軟中斷通知?ksoftirqd?來進行收數據的邏輯,壓根就不出網絡。所以斷網了也能?ping
?通回環地址。 -
如果服務器?
listen
?的是?0.0.0.0
,那么此時用127.0.0.1
和本機地址都可以訪問到服務。