ip地址0.0.0.0與127.0.0.1的區別(轉載)

最近在項目開發中發現一個奇怪的問題,當服務器與客戶端在同一臺機器上時,用服務器ip(本地主機ip)192.168.1.xxx、127.0.0.1以及0.0.0.0都能登陸服務器,於是找點資料研究一下。 
其實,最開始是發現服務器ip填0能登陸成功,後來知道了系統自動補全ip地址,什麼意思呢,就是如果你填0或0.0或0.0.0,系統都會自動補全ip爲0.0.0.0。下面就簡要介紹一下這三種ip的區別。 
相信讀者都知道,ipv4是點分十進制模式,每個ip地址都有特殊的含義。首先說一下ip地址:127.0.0.1,這是大家最熟悉不過的本地loopback(迴環)地址,代表本地主機,在windows和Linux上等價於localhost,可在C:\Windows\System32\drivers\etc\hosts文件中修改主機名或定義ipv6地址(# ::1 localhost)。 
正常的網絡包從ip層進入鏈路層,然後發送到網絡上, 
而發向loopback地址的包,直接在IP層短路了,也就是發到IP層的包直接被IP層接收了,不再向下發送。 
192.168.1.x,是公網ip地址,這些是在網絡中代表本機的ip地址,可通過此ip地址遠程訪問或控制主機。 
0.0.0.0,最特殊的一個ip地址,代表的是本機所有ip地址,不管你有多少個網口,多少個ip,如果監聽本機的0.0.0.0上的端口,就等於監聽機器上的所有ip端口。換句話說,就是隻要數據報目的地址是你機器上的一個ip地址,那麼就能被接受。這個ip相當於Java中的this,代表當前設備的IP。 

下面再來說說這三種地址的區別。在Java開發中,服務器端如果沒有顯示綁定ip地址,如:

ServerSocket serverSock = new ServerSocket(8888);
serverSock.accept();
系統默認的ip地址是0.0.0.0,此時用以上3種ip都能連接成功。 
如果顯示綁定ip,如:

ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress("127.0.0.1",8888));
serverSock.accept();

此時ip192.168.1.x將連接不上,而ip127.0.0.1和0.0.0.0仍然可以連接。同理,也可以顯示指定ip192.168.1.x
在java服務器開發中,一般不需指定ip,因爲這種情況只會出現在服務器和客戶端在一臺主機上。當然,如果想屏蔽某個ip,可在服務器中顯示指定,也可在客戶端登錄時直接屏蔽。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章