本文由“小姐姐養的狗”原創發佈於“小姐姐味道”公眾號,原題《127.0.0.1和0.0.0.0地址的區別》,收錄時有優化和改動。感謝原作者的分享。
一、引言
對於後端程序員來說,127.0.0.1和0.0.0.0這兩個IP地址再熟悉不過了,看起來好像就那麼回事,但真正較起真來,這兩個IP地址到底有什麼作用以及到底有什麼不同?貌似誰可以輕鬆回答,但張嘴卻又不知從何說起。。。(這要是面視,估計真會被這搞砸...)
本文將系統地總結127.0.0.1和0.0.0.0這兩個IP地址的作用,以及它們之間的區別,希望能為你解惑。
* 推薦:本文作者的另一篇文章《八問WebSocket協議:為你快速解答WebSocket熱門疑問》,你或許也感興趣。
(本文同步發佈於:http://www.52im.net/thread-2928-1-1.html)
2、系列文章
本文是系列文章中的第7篇,本系列大綱如下:
《腦殘式網絡編程入門(一):跟著動畫來學TCP三次握手和四次揮手》
《腦殘式網絡編程入門(二):我們在讀寫Socket時,究竟在讀寫什麼?》
《腦殘式網絡編程入門(三):HTTP協議必知必會的一些知識》
《腦殘式網絡編程入門(四):快速理解HTTP/2的服務器推送(Server Push)》
《腦殘式網絡編程入門(五):每天都在用的Ping命令,它到底是什麼?》
《腦殘式網絡編程入門(六):什麼是公網IP和內網IP?NAT轉換又是什麼鬼?》
《腦殘式網絡編程入門(七):面視必備,史上最通俗計算機網絡分層詳解》
《腦殘式網絡編程入門(八):你真的瞭解127.0.0.1和0.0.0.0的區別?》(本文)
3、IP地址分類
我們先回顧一下IP地址的基礎知識(本節內容僅作快速概覽,如您對IP地址知識一無所知,建議首先閱讀《TCP/IP詳解 卷1:協議 - 第3章 IP:網際協議》)。
3.1 IP地址表示
IP地址由兩個部分組成,net-id和host-id,即網絡號和主機號:
1)net-id:表示ip地址所在的網絡號;
2)host-id:表示ip地址所在網絡中的某個主機號碼。
即:
IP-address ::= { <network-id>, <host-id> }/<host-id>/<network-id>
就像下圖這樣:
3.2 IP地址分類
IP地址一共分為5類,即A~E,它們分類的依據是其net-id所佔的字節長度以及網絡號前幾位。
大致分類如下:
1)A類地址:網絡號佔1個字節,網絡號的第一位固定為0;
2)B類地址:網絡號佔2個字節,網絡號的前兩位固定為10;
3)C類地址:網絡號佔3個字節,網絡號的前三位固定位110;
4)D類地址:前四位是1110,用於多播(multicast),即一對多通信;
5)E類地址:前四位是1111,保留為以後使用。
其中,ABC三類地址為單播地址(unicast),用於一對一通信,是最常用的。
IP地址分類看下面這張圖,可能更直接一些:
(上圖來源於《IP地址和子網劃分學習筆記之《IP地址詳解》》)
這裡還有一張IP地址分類的思維導圖:
(上圖來源於《IP地址和子網劃分學習筆記之《IP地址詳解》》)
3.3 特殊IP地址
特殊IP地址就是用來做一些特殊的事情。RFC1700中定義了以下特殊IP地址:
1){0,0}:網絡號和主機號都全部為0,表示“本網絡上的本主機”,只能用作源地址;
2){0,host-id}:本網絡上的某臺主機。只能用作源地址;
3){-1,-1}:表示網絡號和主機號的所有位上都是1(二進制),用於本網絡上的廣播,只能用作目的地址,發到該地址的數據包不能轉發到源地址所在網絡之外;
4){net-id,-1}:直接廣播到指定的網絡上。只能用作目的地址;
5){net-id,subnet-id,-1}:直接廣播到指定網絡的指定子網絡上。只用作目的地址;
6){net-id,-1,-1}:直接廣播到指定網絡的所有子網絡上。只能用作目的地址;
7){127,}:即網絡號為127的任意ip地址。都是內部主機迴環地址(loopback),永遠都不能出現在主機外部的網絡中。
具體來說,特殊的IP地址,主要是以下這些:
1)0.0.0.0:
嚴格說來,0.0.0.0已經不是一個真正意義上的IP地址了。它表示的是這樣一個集合:所有不清楚的主機和目的網絡。這裡的“不清楚”是指在本機的路由表裡沒有特定條目指明如何到達。對本機來說,它就是一個“收容所”,所有不認識的“三無”人員,一律送進去。如果你在網絡設置中設置了缺省網關,那麼Windows系統會自動產生一個目的地址為0.0.0.0的缺省路由。
2)255.255.255.255:
限制廣播地址。對本機來說,這個地址指本網段內(同一廣播域)的所有主機。如果翻譯成人類的語言,應該是這樣:“這個房間裡的所有人都注意了!”這個地址不能被路由器轉發。
3)127.0.0.1:
本機地址,主要用於測試。用漢語表示,就是“我自己”。在Windows系統中,這個地址有一個別名“Localhost”。尋址這樣一個地址,是不能把它發到網絡接口的。除非出錯,否則在傳輸介質上永遠不應該出現目的地址為“127.0.0.1”的數據包。
4)224.0.0.1:
組播地址,注意它和廣播的區別。從224.0.0.0到239.255.255.255都是這樣的地址。224.0.0.1特指所有主機,224.0.0.2特指所有路由器。這樣的地址多用於一些特定的程序以及多媒體程序。如果你的主機開啟了IRDP (Internet路由發現協議,使用組播功能)功能,那麼你的主機路由表中應該有這樣一條路由。
5)169.254.x.x:
如果你的主機使用了DHCP功能自動獲得一個IP地址,那麼當你的DHCP服務器發生故障,或響應時間太長而超出了一個系統規定的時間,Wingdows系統會為你分配這樣一個地址。如果你發現你的主機IP地址是一個諸如此類的地址,很不幸,十有八九是你的網絡不能正常運行了。
6)10.x.x.x、172.16.x.x~172.31.x.x、192.168.x.x:
私有地址,這些地址被大量用於企業內部網絡中。一些寬帶路由器,也往往使用192.168.1.1作為缺省地址。私有網絡由於不與外部互連,因而可能使用隨意的IP地址。保留這樣的地址供其使用是為了避免以後接入公網時引起地址混亂。使用私有地址的私有網絡在接入Internet時,要使用地址翻譯(NAT),將私有地址翻譯成公用合法地址。在Internet上,這類地址是不能出現的。
4、127.0.0.1和0.0.0.0的區別
4.1 基本情況
通過上節基礎知識的回顧,我們回到正題:127.0.0.1和0.0.0.0地址的區別是什麼?
我們先來看下共同點:
1)都屬於特殊地址;
2)都屬於A類地址;
3)都是IPV4地址。
接下來我們分別看下這兩個地址的具體作用,就一目瞭解了。
4.2 0.0.0.0
IPV4中,0.0.0.0地址被用於表示一個無效的,未知的或者不可用的目標:
1)在服務器中:0.0.0.0指的是本機上的所有IPV4地址,如果一個主機有兩個IP地址,192.168.1.1 和 10.1.2.1,並且該主機上的一個服務監聽的地址是0.0.0.0,那麼通過兩個ip地址都能夠訪問該服務;
2)在路由中:0.0.0.0表示的是默認路由,即當路由表中沒有找到完全匹配的路由的時候所對應的路由。
用途總結:
1)當一臺主機還沒有被分配一個IP地址的時候,用於表示主機本身(DHCP分配IP地址的時候);
2)用作默認路由,表示”任意IPV4主機”;
3)用來表示目標機器不可用;
4)用作服務端,表示本機上的任意IPV4地址。
4.3 127.0.0.1
127.0.0.1屬於{127,}集合中的一個,而所有網絡號為127的地址都被稱之為迴環地址,所以迴環地址不等於127.0.0.1,它們是包含關係,即迴環地址包含127.0.0.1。
迴環地址的定義:
所有發往該類地址的數據包都應該被loop back。
主要用途:
1)迴環測試:通過使用ping 127.0.0.1 測試某臺機器上的網絡設備,操作系統或者TCP/IP實現是否工作正常;
2)DDos攻擊防禦:網站收到DDos攻擊之後,將域名A記錄到127.0.0.1,即讓攻擊者自己攻擊自己;
3)程序測試:大部分Web容器測試的時候綁定的本機地址。
* 題外知識:127.0.0.1與localhost的關係
相比127.0.0.1,localhost具有更多的意義。localhost是個域名,而不是一個ip地址。之所以我們經常把localhost與127.0.0.1認為是同一個是因為我們使用的大多數電腦上都講localhost指向了127.0.0.1這個地址。
在ubuntu系統中,/ets/hosts文件中都會有如下內容:
127.0.0.1 localhost
127.0.1.1 52im-aliyun
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
上面第一行是幾乎每臺電腦上都會有的默認配置。
但是localhost的意義並不侷限於127.0.0.1。
localhost是一個域名,用於指代this computer或者this host,可以用它來獲取運行在本機上的網絡服務。
在大多數系統中,localhost被指向了IPV4的127.0.0.1和IPV6的::1:
127.0.0.1 localhost
::1 localhost
所以,在使用的時候要注意確認IPV4還是IPV6。
5、本文小結
127.0.0.1 是一個環回地址。並不表示“本機”。0.0.0.0才是真正表示“本網絡中的本機”。
在實際應用中:一般我們在服務端綁定端口的時候可以選擇綁定到0.0.0.0,這樣我的服務訪問方就可以通過我的多個ip地址訪問我的服務。
比如:我有一臺服務器,一個外網地址A,一個內網地址B,如果我綁定的端口指定了0.0.0.0,那麼通過內網地址或外網地址都可以訪問我的應用。但是如果我只綁定了內網地址,那麼通過外網地址就不能訪問。所以如果綁定0.0.0.0,也有一定安全隱患,對於只需要內網訪問的服務,可以只綁定內網地址。
附錄:更多網絡編程和網絡通信相關資料
[1] 網絡編程基礎資料:
《TCP/IP詳解 - 第11章·UDP:用戶數據報協議》
《TCP/IP詳解 - 第17章·TCP:傳輸控制協議》
《TCP/IP詳解 - 第18章·TCP連接的建立與終止》
《TCP/IP詳解 - 第21章·TCP的超時與重傳》
《技術往事:改變世界的TCP/IP協議(珍貴多圖、手機慎點)》
《通俗易懂-深入理解TCP協議(上):理論基礎》
《通俗易懂-深入理解TCP協議(下):RTT、滑動窗口、擁塞處理》
《理論經典:TCP協議的3次握手與4次揮手過程詳解》
《理論聯繫實際:Wireshark抓包分析TCP 3次握手、4次揮手過程》
《計算機網絡通訊協議關係圖(中文珍藏版)》
《UDP中一個包的大小最大能多大?》
《P2P技術詳解(一):NAT詳解——詳細原理、P2P簡介》
《P2P技術詳解(二):P2P中的NAT穿越(打洞)方案詳解(基本原理篇)》
《P2P技術詳解(三):P2P中的NAT穿越(打洞)方案詳解(進階分析篇)》
《P2P技術詳解(四):P2P技術之STUN、TURN、ICE詳解》
《通俗易懂:快速理解P2P技術中的NAT穿透原理》
《高性能網絡編程(一):單臺服務器併發TCP連接數到底可以有多少》
《高性能網絡編程(二):上一個10年,著名的C10K併發連接問題》
《高性能網絡編程(三):下一個10年,是時候考慮C10M併發問題了》
《高性能網絡編程(四):從C10K到C10M高性能網絡應用的理論探索》
《高性能網絡編程(五):一文讀懂高性能網絡編程中的I/O模型》
《高性能網絡編程(六):一文讀懂高性能網絡編程中的線程模型》
《Java的BIO和NIO很難懂?用代碼實踐給你看,再不懂我轉行!》
《不為人知的網絡編程(一):淺析TCP協議中的疑難雜症(上篇)》
《不為人知的網絡編程(二):淺析TCP協議中的疑難雜症(下篇)》
《不為人知的網絡編程(三):關閉TCP連接時為什麼會TIME_WAIT、CLOSE_WAIT》
《不為人知的網絡編程(四):深入研究分析TCP的異常關閉》
《不為人知的網絡編程(五):UDP的連接性和負載均衡》
《不為人知的網絡編程(六):深入地理解UDP協議並用好它》
《不為人知的網絡編程(七):如何讓不可靠的UDP變的可靠?》
《不為人知的網絡編程(八):從數據傳輸層深度解密HTTP》
《不為人知的網絡編程(九):理論聯繫實際,全方位深入理解DNS》
《網絡編程懶人入門(一):快速理解網絡通信協議(上篇)》
《網絡編程懶人入門(二):快速理解網絡通信協議(下篇)》
《網絡編程懶人入門(三):快速理解TCP協議一篇就夠》
《網絡編程懶人入門(四):快速理解TCP和UDP的差異》
《網絡編程懶人入門(五):快速理解為什麼說UDP有時比TCP更有優勢》
《網絡編程懶人入門(六):史上最通俗的集線器、交換機、路由器功能原理入門》
《網絡編程懶人入門(七):深入淺出,全面理解HTTP協議》
《網絡編程懶人入門(八):手把手教你寫基於TCP的Socket長連接》
《網絡編程懶人入門(九):通俗講解,有了IP地址,為何還要用MAC地址?》
《網絡編程懶人入門(十):一泡尿的時間,快速讀懂QUIC協議》
《技術掃盲:新一代基於UDP的低延時網絡傳輸層協議——QUIC詳解》
《讓互聯網更快:新一代QUIC協議在騰訊的技術實踐分享》
《現代移動端網絡短連接的優化手段總結:請求速度、弱網適應、安全保障》
《聊聊iOS中網絡編程長連接的那些事》
《移動端IM開發者必讀(一):通俗易懂,理解移動網絡的“弱”和“慢”》
《移動端IM開發者必讀(二):史上最全移動弱網絡優化方法總結》
《IPv6技術詳解:基本概念、應用現狀、技術實踐(上篇)》
《IPv6技術詳解:基本概念、應用現狀、技術實踐(下篇)》
《從HTTP/0.9到HTTP/2:一文讀懂HTTP協議的歷史演變和設計思路》
《腦殘式網絡編程入門(一):跟著動畫來學TCP三次握手和四次揮手》
《腦殘式網絡編程入門(二):我們在讀寫Socket時,究竟在讀寫什麼?》
《腦殘式網絡編程入門(三):HTTP協議必知必會的一些知識》
《腦殘式網絡編程入門(四):快速理解HTTP/2的服務器推送(Server Push)》
《腦殘式網絡編程入門(五):每天都在用的Ping命令,它到底是什麼?》
《腦殘式網絡編程入門(六):什麼是公網IP和內網IP?NAT轉換又是什麼鬼?》
《腦殘式網絡編程入門(七):面視必備,史上最通俗計算機網絡分層詳解》
《腦殘式網絡編程入門(八):你真的瞭解127.0.0.1和0.0.0.0的區別?》
《以網遊服務端的網絡接入層設計為例,理解實時通信的技術挑戰》
《邁向高階:優秀Android程序員必知必會的網絡基礎》
《全面瞭解移動端DNS域名劫持等雜症:技術原理、問題根源、解決方案等》
《美圖App的移動端DNS優化實踐:HTTPS請求耗時減小近半》
《Android程序員必知必會的網絡通信傳輸層協議——UDP和TCP》
《IM開發者的零基礎通信技術入門(一):通信交換技術的百年發展史(上)》
《IM開發者的零基礎通信技術入門(二):通信交換技術的百年發展史(下)》
《IM開發者的零基礎通信技術入門(三):國人通信方式的百年變遷》
《IM開發者的零基礎通信技術入門(四):手機的演進,史上最全移動終端發展史》
《IM開發者的零基礎通信技術入門(五):1G到5G,30年移動通信技術演進史》
《IM開發者的零基礎通信技術入門(六):移動終端的接頭人——“基站”技術》
《IM開發者的零基礎通信技術入門(七):移動終端的千里馬——“電磁波”》
《IM開發者的零基礎通信技術入門(八):零基礎,史上最強“天線”原理掃盲》
《IM開發者的零基礎通信技術入門(九):無線通信網絡的中樞——“核心網”》
《IM開發者的零基礎通信技術入門(十):零基礎,史上最強5G技術掃盲》
《IM開發者的零基礎通信技術入門(十一):為什麼WiFi信號差?一文即懂!》
《IM開發者的零基礎通信技術入門(十二):上網卡頓?網絡掉線?一文即懂!》
《IM開發者的零基礎通信技術入門(十三):為什麼手機信號差?一文即懂!》
《IM開發者的零基礎通信技術入門(十四):高鐵上無線上網有多難?一文即懂!》
《IM開發者的零基礎通信技術入門(十五):理解定位技術,一篇就夠》
《百度APP移動端網絡深度優化實踐分享(一):DNS優化篇》
《百度APP移動端網絡深度優化實踐分享(二):網絡連接優化篇》
《百度APP移動端網絡深度優化實踐分享(三):移動端弱網優化篇》
《技術大牛陳碩的分享:由淺入深,網絡編程學習經驗乾貨總結》
《可能會搞砸你的面試:你知道一個TCP連接上能發起多少個HTTP請求嗎?》
《知乎技術分享:知乎千萬級併發的高性能長連接網關技術實踐》
>> 更多同類文章 ……
[2] NIO異步網絡編程資料:
《Java新一代網絡編程模型AIO原理及Linux系統AIO介紹》
《有關“為何選擇Netty”的11個疑問及解答》
《開源NIO框架八卦——到底是先有MINA還是先有Netty?》
《選Netty還是Mina:深入研究與對比(一)》
《選Netty還是Mina:深入研究與對比(二)》
《NIO框架入門(一):服務端基於Netty4的UDP雙向通信Demo演示》
《NIO框架入門(二):服務端基於MINA2的UDP雙向通信Demo演示》
《NIO框架入門(三):iOS與MINA2、Netty4的跨平臺UDP雙向通信實戰》
《NIO框架入門(四):Android與MINA2、Netty4的跨平臺UDP雙向通信實戰》
《Netty 4.x學習(一):ByteBuf詳解》
《Netty 4.x學習(二):Channel和Pipeline詳解》
《Netty 4.x學習(三):線程模型詳解》
《Apache Mina框架高級篇(一):IoFilter詳解》
《Apache Mina框架高級篇(二):IoHandler詳解》
《MINA2 線程原理總結(含簡單測試實例)》
《Apache MINA2.0 開發指南(中文版)[附件下載]》
《MINA、Netty的源代碼(在線閱讀版)已整理發佈》
《解決MINA數據傳輸中TCP的粘包、缺包問題(有源碼)》
《解決Mina中多個同類型Filter實例共存的問題》
《實踐總結:Netty3.x升級Netty4.x遇到的那些坑(線程篇)》
《實踐總結:Netty3.x VS Netty4.x的線程模型》
《詳解Netty的安全性:原理介紹、代碼演示(上篇)》
《詳解Netty的安全性:原理介紹、代碼演示(下篇)》
《詳解Netty的優雅退出機制和原理》
《NIO框架詳解:Netty的高性能之道》
《Twitter:如何使用Netty 4來減少JVM的GC開銷(譯文)》
《絕對乾貨:基於Netty實現海量接入的推送服務技術要點》
《Netty乾貨分享:京東京麥的生產級TCP網關技術實踐總結》
《新手入門:目前為止最透徹的的Netty高性能原理和框架架構解析》
《寫給初學者:Java高性能NIO框架Netty的學習方法和進階策略》
《少囉嗦!一分鐘帶你讀懂Java的NIO和經典IO的區別》
《史上最強Java NIO入門:擔心從入門到放棄的,請讀這篇!》
《手把手教你用Netty實現網絡通信程序的心跳機制、斷線重連機制》
《Java的BIO和NIO很難懂?用代碼實踐給你看,再不懂我轉行!》
>> 更多同類文章 ……
[3] 有關IM/推送的網絡通信格式、協議的選擇:
《Protobuf通信協議詳解:代碼演示、詳細原理介紹等》
《一個基於Protocol Buffer的Java代碼演示》
《簡述傳輸層協議TCP和UDP的區別》
《為什麼QQ用的是UDP協議而不是TCP協議?》
《移動端即時通訊協議選擇:UDP還是TCP?》
《網絡編程懶人入門(四):快速理解TCP和UDP的差異》
《網絡編程懶人入門(五):快速理解為什麼說UDP有時比TCP更有優勢》
《如何選擇即時通訊應用的數據傳輸格式》
《強列建議將Protobuf作為你的即時通訊應用數據傳輸格式》
《全方位評測:Protobuf性能到底有沒有比JSON快5倍?》
《移動端IM開發需要面對的技術問題(含通信協議選擇)》
《簡述移動端IM開發的那些坑:架構設計、通信協議和客戶端》
《理論聯繫實際:一套典型的IM通信協議設計詳解》
《58到家實時消息系統的協議設計等技術實踐分享》
《詳解如何在NodeJS中使用Google的Protobuf》
《技術掃盲:新一代基於UDP的低延時網絡傳輸層協議——QUIC詳解》
《金蝶隨手記團隊分享:還在用JSON? Protobuf讓數據傳輸更省更快(原理篇)》
《金蝶隨手記團隊分享:還在用JSON? Protobuf讓數據傳輸更省更快(實戰篇)》
>> 更多同類文章 ……
(本文同步發佈於:http://www.52im.net/thread-2928-1-1.html)
閱讀更多 移動端IM技術分享 的文章