1. 程式人生 > >Network學習1_localhost、127.0.0.1 和 本機IP 三者的區別

Network學習1_localhost、127.0.0.1 和 本機IP 三者的區別

網路java IP地址的記法: IP地址由四個位元組構成,為了方便閱讀和書寫,每個位元組用0-255的數字表示,位元組之間用’.'分割,如: 10.10.152.235 有時候我們會看到這樣的IP: 10.10.152.235/24, 後面的/24表示子網掩碼,24表示子網掩碼上有24個1,等價於255.255.255.0 。 IP地址和子網掩碼按位 與,得到的是 網路號(Network ID), 剩餘的部分是子網內的 主機號(host ID,當然,這個名字小有問題,因為現在有IP的可不僅僅是主機,暫且這麼稱呼吧), 特殊的IP地址段: 127.x.x.x 這是大家最熟悉不過的本地loopback地址,在windows和linux上等價於localhost。 我們習慣於使用127.0.0.1,實際上, 如果你在命令列下ping 127.0.0.1-127.255.255.254之間的任意地址,結果都是一樣的,它們是等價的。 正常的網路包從ip層進入鏈路層,然後傳送到網路上, 而發向loopback地址的包,直接在IP層短路了,也就是發到IP層的包直接被IP層接收了,不再向下發送。 私網地址段: 10.x.x.x、192.168.x.x、172.16.x.x~172.31.x.x、169.254.x.x 這些私網地址段是不允許出現在Internet上的,主用保留用於企業內部組網使用, 這可以在一定程度上緩解IP地址不夠用的問題。 大型企業的OA網用10地址段的比較多,因為這是一個A類地址段,包含的IP很多。 小公司用192.168.0地址段的比較多。 而169.254則主要是分配給DHCP服務使用的。 保留地址段: 128.0.x.x、191.255.x.x、192.0.0.x、233.255.255.x 這些地址被保留起來,不做分配且沒有明確的用途。 其它特殊IP: 255.255.255.255是全域性廣播地址, 主機號全部為1的地址是子網廣播地址,如:192.168.1.255 主機號全部為0的地址是代表該子網的網路地址,如:192.168.1.0 一個非常特殊的IP:0.0.0.0 這個IP相當於java中的this,代表當前裝置的IP。 我們在java程式設計中使用ServerSocket做網路偵聽,通常只需要如下程式碼: ServerSocket serverSock=new ServerSocket(8888); serverSock.accept(); 假如我的主機ip為:10.10.152.8, 用以上程式碼做偵聽,127.0.0.1:8888或者10.10.152.8:8888都可以連上, 但大家有沒有想過過,這個ServerSocket到底使用哪個IP在做偵聽? 如果我們將以上程式碼改成顯式繫結: ServerSocket ss=new ServerSocket(); String ip=“10.10.152.8″; int port=8888; InetSocketAddress addr=new InetSocketAddress(ip,port); ss.bind(addr); ss.accept(); 你會發現,127.0.0.1:8888是無法訪問的, 而如果將ip改成127.0.0.1,那麼10.10.152.8:8888是無法訪問的。 實際上,背後的祕密就在與0.0.0.0這個IP,他可以代表本機的所有IP地址, 但這個IP並不是真是存在的,我們ping不通它,如果將ip改成0.0.0.0: ServerSocket ss=new ServerSocket(); String ip=“0.0.0.0″; int port=8888; InetSocketAddress addr=new InetSocketAddress(ip,port); ss.bind(addr); ss.accept(); 我們會發現,這和預設行為是一樣的,127.0.0.1:8888或者10.10.152.8:8888都可以連上。 原文來自:http://www.2cto.com/net/201310/253427.html 1. 127.0.0.1/8整個都是環回地址,用來測試本機的TCP/IP協議棧,發往這段A類地址資料包不會出網絡卡,網路裝置不會對其做路由。

2. localhost 就是個指向本機環回口的域名,方便記憶與輸入,/etc/hosts第一行就是"127.0.0.1 localhost..." 第二行的[::1]是IPv6

3. 本機IP看你是有幾張網絡卡幾個介面了多網絡卡可能還得分內外網 環回口不需要網絡卡up,協議棧正常就能通

4. 還有個地址段169.254.0.0/16,可以看成一個B類私網地址,專門用來在DHCP獲取失敗時自動配置的介面地址,windows上肯定有,Linux上倒是沒見過。。
localhost 就是一個域名,域名指向 127.0.0.1 ,兩者是一樣的。

至於本機 IP,你可以理解為本機有三塊網絡卡,一塊網絡卡叫做 loopback(這是一塊虛擬網絡卡),另外一塊網絡卡叫做 ethernet (這是你的有線網絡卡),另外一塊網絡卡叫做 wlan(這是你的無線網絡卡)。


你的本機 IP 是你真實網絡卡的 IP,具體來說有線無線各有一個,而 127.0.0.1 是那塊叫做 loopback 的虛擬網絡卡的 IP。
排名第一的答案還沒說的太完整。
首先 localhost 是一個域名,在過去它指向 127.0.0.1 這個IP地址。在作業系統支援 ipv6 後,它同時還指向ipv6 的地址 [::1]
在 Windows 中,這個域名是預定義的,從 hosts 檔案中可以看出:
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
而在 Linux 中,其定義位於 /etc/hosts 中:

127.0.0.1 localhost
注意這個值是可修改的,比如我把它改成
192.068.206.1 localhost
然後再去 ping localhost,提示就變成了
PING localhost (192.168.206.1) 56(84) bytes of data.
當然一般人不會像我這麼蛋疼。
————分割線—說完localhost再說127.0.0.1————
127.0.0.1 這個地址通常分配給 loopback 介面。loopback 是一個特殊的網路介面(可理解成虛擬網絡卡),用於本機中各個應用之間的網路互動。只要作業系統的網路元件是正常的,loopback 就能工作。Windows 中看不到這個介面,Linux中這個介面叫 lo:
#ifconfig
eth0 Link encap:Ethernet hwaddr 00:00:00:00:00:00
inet addr :192.168.0.1 Bcase:192.168.0.255 Mask:255.255.255.0
......
lo Link encap:Local Loopback
inetaddr: 127.0.0.1 Mask: 255.0.0.0
......
可以看出 lo 介面的地址是 127.0.0.1。事實上整個 127.* 網段都算能夠使用,比如你 ping 127.0.0.2 也是通的。
但是使用127.0.0.1作為loopback介面的預設地址只是一個慣例,比如下面這樣:
#ifconfig lo 192.168.128.1
#ping localhost #糟糕,ping不通了
#ping 192.128.128.1 # 可以通
#ifconfig lo
lo Link encap:Local Loopback
inetaddr: 192.168.128.1 Mask: 255.255.255.0
......
當然,一般人更不會像我這樣蛋疼。如果隨便改這些配置,可能導致很多隻認 127.0.0.1 的軟體掛掉。
————分割線—說完127.0.0.1再說本機地址————
確切地說,“本機地址”並不是一個規範的名詞。通常情況下,指的是“本機物理網絡卡所繫結的網路協議地址”。由於目前常用網路協議只剩下了IPV4,IPX/Apple Tak消失了,IPV6還沒普及,所以通常僅指IP地址甚至ipv4地址。一般情況下,並不會把 127.0.0.1當作本機地址——因為沒必要特別說明,大家都知道。
本機地址是與具體的網路介面繫結的。比如乙太網卡、無線網絡卡或者PPP/PPPoE撥號網路的虛擬網絡卡,想要正常工作都要繫結一個地址,否則其他裝置就不知道如何訪問它。

————最後總結一下區別————
  • localhost 是個域名,不是地址,它可以被配置為任意的 IP 地址,不過通常情況下都指向 127.0.0.1(ipv4)和 [::1](ipv6)
  • 整個127.* 網段通常被用作 loopback 網路介面的預設地址,按慣例通常設定為 127.0.0.1。這個地址在其他計算機上不能訪問,就算你想訪問,訪問的也是自己,因為每臺帶有TCP/IP協議棧的裝置基本上都有 localhost/127.0.0.1。
  • 本機地址通常指的是繫結在物理或虛擬網路介面上的IP地址,可供其他裝置訪問到。
  • 最後,從開發度來看
    • localhost是個域名,性質跟 “www.baidu.com” 差不多。不能直接繫結套接字,必須先gethostbyname轉成IP才能繫結。
    • 127.0.0.1 是繫結在 loopback 介面上的地址,如果服務端套接字繫結在它上面,你的客戶端程式就只能在本機訪問。
    • 如果主機中存在多個網絡卡,分別連線不同的物理網路,比如 192.168.0.1/255.255.255.0 和 192.168.1.1/255.255.255.0,那麼當你的服務端套接字綁到 192.168.0.1 這個地址上時,位於 192.168.1.* 網段的其他計算機是無法連線的,只有位於192.168.0.* 網段的計算機才能訪問你的服務端程式。

原文來自:http://www.zhihu.com/question/23940717