🍉 別再恐懼 IP 協議(萬字長文 | 多圖預警)

{"type":"doc","content":[{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"0. 前言","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"對我個人來說,本科的時候,除去計算機組成原理,計算機網絡堪稱複習難度最大的一門課,其中無窮無盡的 IP 地址的計算、子網劃分、路由轉發簡直就是夢靨。現在回過頭來再看,其實真的不難,只不過是當時的知識體系實在太亂。👏 本篇耗時長達十幾個小時,嘔心瀝血,相信大家看完必定有所收穫。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"📢 計算機網絡的細碎知識點真的是越扣越多......,本文主要講解 IP 協議相關的重要知識點,一些相對來說比較冷門的就不再說了","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"1. 從網絡層說起","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"衆所周知,IP 協議屬於網絡層,回顧一下之前文章 ","attrs":{}},{"type":"link","attrs":{"href":"https://mp.weixin.qq.com/s/oZtmmRYkYdtU7OX0k1CAuA","title":""},"content":[{"type":"text","text":"一文讀懂兩臺計算機之間是如何通信的","attrs":{}}]},{"type":"text","text":" 所說的,網絡層的作用:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在計算機網絡中進行通信的兩個計算機之間可能會經過很多個數據鏈路,也可能還要經過很多通信子網。","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"網絡層的任務就是選擇合適的網間路由和交換結點, 確保數據及時傳送","attrs":{}},{"type":"text","text":"。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通俗點來說吧,數據鏈路層的作用很簡單,它是無腦的,只負責在兩個相鄰節點之間傳送數據,它並不知道它所傳送的數據最終目的地是哪。而網絡層便是它的大腦,網絡層負責指定源地址和目的地址,並告訴數據鏈路層該走哪條路線。下面這張圖可以說是非常形象了 👍:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/ed/ed2cfcdb04276aa2133b7abc3363d098.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"運輸層交付給網絡層的數據格式是 TCP/UDP 報文段,那麼網絡層會將這些報文封裝成 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"IP 數據報","attrs":{}},{"type":"text","text":"交付給數據鏈路層。在之前的文章中我們說過,每個數據鏈路上會規定一個最大傳輸單元 MTU,如果 IP 數據報的長度超過 MTU,那麼網絡層就會把這些報文分割成一個一個的小組(分組)進行傳送。數據鏈路層收到 IP 數據報之後將其封裝成幀。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲什麼網絡層的傳輸單元(協議單元)稱爲 IP 數據報呢?那是因爲在 TCP/IP 體系結構中,網絡層使用 IP 協議,因此稱爲 IP 數據報 ,簡稱數據報。下面我們就來詳細講解 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"IP 協議","attrs":{}},{"type":"text","text":" 👇","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"2. 什麼是 IP 協議","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"IP 協議是整個 TCP/IP 協議族的核心,也是構成互聯網的基礎,位於 TCP/IP 模型的網絡層。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"IP 協議用於","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"屏蔽下層物理網絡的差異,爲上層提供統一的 IP 數據報","attrs":{}},{"type":"text","text":"。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/b6/b6112bb4d2e7377768e4af068e38e011.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"⭐ IP 協議提供無連接的、不可靠的、盡力的數據報投遞服務:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1)","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"無連接","attrs":{}},{"type":"text","text":"的投遞服務 ","attrs":{}}]}],"attrs":{}}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" 發送端可於任何時候自由發送數據,而接收端永遠不知道自己會在何時從哪裏接收到數據。每個 IP 數據報獨立處理和傳輸, ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"一臺主機發出的數據報序列,可能會走不同的路徑","attrs":{}},{"type":"text","text":", 甚至有可能其中的一部分數據報會在傳輸過程中丟失","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2)","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"不可靠","attrs":{}},{"type":"text","text":"的投遞服務 ","attrs":{}}]}],"attrs":{}}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" IP 協議本身不保證 IP 數據報投遞的結果。 在傳輸的過程中,IP 數據報可能會丟失、重複、延遲和亂序等, IP 協議不對內容作任何檢測,也不將這些結果通知收發雙方","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"IP 數據報的丟失,通過路由器發 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"ICMP 報文","attrs":{}}],"attrs":{}},{"type":"text","text":" 告知(後續文章會詳細講解 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"ICMP 協議","attrs":{}},{"type":"text","text":",敬請期待); 必要時,由高層實體(如 TCP)負責差錯恢復動作","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"3)","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"盡力","attrs":{}},{"type":"text","text":"投遞服務 ","attrs":{}}]}],"attrs":{}}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" 每個數據鏈路上會規定一個最大傳輸單元 MTU,如果 IP 數據報的長度超過 MTU,那麼網絡層就會把這些報文分割成一個一個的小組(分組)進行傳送,以適應具體的傳輸網絡","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"3. IP 協議的重要內容:IP 地址","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"① IP 地址初探","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"IP 地址是 IP 協議中非常重要的內容,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"IP 數據報中含有收/發方的 IP 地址","attrs":{}},{"type":"text","text":"。 那麼什麼是 IP 地址呢?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"那就是給因特網上的每臺設備都規定了其","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"全世界唯一","attrs":{}},{"type":"text","text":"的地址,叫做 “IP 地址”,正是由於有了 IP 地址,才保證了用戶在連網的計算機上操作時,能夠高效而且方便地從千千萬萬臺計算機中選出自己所需的對象來。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"IP 地址就好像電話號碼(地址碼):有了某人的電話號碼,你就能與他通話了。同樣,有了某臺主機的 IP 地址,你就能與這臺主機通信了。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/d0/d0024a84b6780ca245f78bc54abb5119.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"按照 TCP/IP 協議規定,IP 地址用二進制來表示,每個 IP 地址長 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"32 比特","attrs":{}},{"type":"text","text":",也就是 4 個字節(這裏說的是 IPV4 地址長 32 比特 / 4 字節,而 IPV6 地址佔 128 比特 / 16 字節)。那麼,IPV4 地址的最大值就是 $2^{32} = 4294967296$,也就是說:最多給大約 43 億臺接入互聯網的設備配置其獨一無二的 IPV4 地址。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一個採用二進制形式的 IP 地址是一串很長的數字,人們處理起來也太費勁了。爲了方便人們的使用,IP 地址習慣性地被寫成十進制的形式,**使用 “","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":".","attrs":{}}],"attrs":{}},{"type":"text","text":"” 分開不同的字節","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"。這種表示法叫做","attrs":{}},{"type":"text","text":"點分十進制表示法**,這顯然比一連串二進制地 1 和 0 容易記憶得多。舉個例子:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/b6/b646f88fb3bc3e6dee5f315038a468ca.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"② IP 地址和 MAC 地址","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"🚨 可能有些小夥伴會以爲,一臺計算機只能有一個 IP 地址,這種觀點是","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"錯誤","attrs":{}},{"type":"text","text":"的。實際上,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"IP 地址並不是根據主機臺數來配置的,而是根據網卡(網絡適配器)來的","attrs":{}},{"type":"text","text":"。像服務器、路由器等設備都是有 2 個以上的網卡,也就是它們會有 2 個以上的 IP 地址。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"說到這裏,不知大家有沒有想起我們之前說的 MAC 地址,沒錯,MAC 地址(鏈路層地址)也是根據網卡來配置的,一臺主機擁有多少個網卡就有多少個 MAC 地址。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"那麼,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"既然有了 MAC 地址用來唯一標識這臺計算機了,那還需要 IP 地址幹啥","attrs":{}},{"type":"text","text":"?回答這個問題只需要我們回到本文的第一幅圖:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/ed/ed2cfcdb04276aa2133b7abc3363d098.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"網絡層指定了從哪個主機(「源 IP 地址」)發送到哪個主機(「目的 IP 地址」)。","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"源 IP 地址和目標 IP 地址在傳輸過程中是不會變化的","attrs":{}}]}],"attrs":{}}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"而數據鏈路層則是根據 MAC 地址在一個接一個的區間中進行傳輸的,每個區間內的出發地址即「源 MAC 地址」,每個區間內的目的地址即「目的 MAC 地址」。顯然,隨着數據的傳輸,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"源 MAC 地址和目的 MAC 地址會不斷的發生變化","attrs":{}}]}],"attrs":{}}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" 比如上圖,網絡層告知了 1-2-3 路線,那麼數據鏈路層就會根據 MAC 地址依次找到 1、2、3,並在他們之間傳輸數據。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"🍉 這麼說吧,舉個形象點的例子:我們把數據鏈路層當成乘坐高鐵從蘇州到南京,再在南京轉乘到北京,再在北京轉乘到西藏的旅客,那麼網絡層就相當於每個車站的工作人員,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"在數據鏈路層每次轉乘時,網絡層爲其購買了一張標有下一個 MAC 地址的車票","attrs":{}},{"type":"text","text":"。因此,即使旅客(數據鏈路層)不知道其最終目的地也沒有關係,工作人員(網絡層)會給你做出指引。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/de/de4f87597acb6e217eba4d85fdd2e2fc.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"而實際上,網絡層做出指引的過程,我們將其稱爲","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"路由控制","attrs":{}},{"type":"text","text":" (下文會詳細講解)","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"④ IP 地址的分類","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"互聯網誕生之初,32 位的 IP 地址(也就是 IPV4 地址)顯得很充裕,於是大佬們對這些看似龐大的 IP 地址進行了分類:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/58/58f0a73be688f71868b8572394ba2f60.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"上圖中我們可以看到,A 類 IP 地址的首位是 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"0","attrs":{}}],"attrs":{}},{"type":"text","text":",B 類 IP 地址的前幾位是 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"10","attrs":{}}],"attrs":{}},{"type":"text","text":",C 類 IP 地址的前幾位是 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"110","attrs":{}}],"attrs":{}},{"type":"text","text":"......,我們將這些稱之爲","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"分類號","attrs":{}},{"type":"text","text":",用於區分 IP 地址的類別。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其中,A、B、C 類地址主要分爲網絡號和主機號兩個部分:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"什麼是網絡號:網絡號表示其屬於互聯網的哪一個網絡","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"什麼是主機號:主機號表示其屬於該網絡中的哪一臺主機","attrs":{}}]}],"attrs":{}}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"大 🔥 可能有這個疑問:","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"爲什麼要分離網絡號和主機號","attrs":{}},{"type":"text","text":"?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"因爲兩臺計算機要通訊,首先要判斷是否處於同一個廣播域內,即網絡地址(網絡號)是否相同:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果網絡地址相同,表明接受方在本網絡上(","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"本地網絡主機","attrs":{}},{"type":"text","text":"),那麼可以把數據包直接發送到目標主機,無需轉發給其他的網絡","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"網絡號不相同的主機稱之爲","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"遠程網絡主機","attrs":{}},{"type":"text","text":",遠程網絡中的主機要相互通信必須通過本地網關(Gateway)來傳遞轉發數據","attrs":{}}]}],"attrs":{}}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"路由器尋址工作中,也就是通過這樣的方式來找到對應的網絡號的,進而把數據包轉發給對應的網絡內。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/25/2552daec751367e95768130063118ce6.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"👍 IP 地址分類的優點顯而易見,不管是路由器還是主機解析到一個 IP 地址時候,可以很快的找出網絡地址和主機地址:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/80/80b153554f604fc6e281d7db91e43952.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"💻 A、B、C 類地址對應的地址範圍和最大主機個數如下:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"| 網絡類別 | 第一個可用的網絡號 | 最後一個可用的網絡號 | 每個網絡中的最大主機數 |","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"| -------- | ------------------ | -------------------- | ---------------------- |","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"| A | 1 | 126 | $2^{24} - 2$ |","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"| B | 128.1 | 191.255 | $2^{16} - 2$ |","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"| C | 192.0.1 | 223.255.255 | $2^{8} - 2$ |","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"OK,看完上表大家必定有很多疑惑,下面一一爲大家解答:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"❓ 1)","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"第一個可用的網絡號如何計算出來的?","attrs":{}},{"type":"text","text":"很簡單,網絡號全爲 0 即可,看下圖,以 B 類地址爲例:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/d7/d7ef3823f609ed2e0fdab9854a8dd66b.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"由上圖,B 類地址的第一個可用的網絡號應該是 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"128.0","attrs":{}}],"attrs":{}},{"type":"text","text":" 啊,爲什麼是 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"128.1","attrs":{}}],"attrs":{}},{"type":"text","text":" 呢?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"💡 其實這是一個歷史問題,RFC 791 中說:","attrs":{}},{"type":"text","marks":[{"type":"underline","attrs":{}}],"text":"A value of zero in the network field means this network. ","attrs":{}},{"type":"text","text":"即網絡號全 0 代表本網絡。因此真正可用的網絡號應該是從 1 開始。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"所以,B 類地址的第一個可用的網絡號就是 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"128.1","attrs":{}}],"attrs":{}},{"type":"text","text":":","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/0b/0b572c11a1b9dc8f1dab89646afa2f2a.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"A 類和 C 類地址同理,這裏我就不再畫圖了。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"不過實際上 128.0.0.1-128.0.0.255 這段地址已經有明確的歸屬,國家是 NL。而 128.0.1.0/24 這段同樣也分掉了,國家是 RO。而 192.0.0.1 這個地址查出來是沒有被分配的。在 RFC 3330 中裏有關於這兩段地址的明確說明:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"128.0.0.0/16 - This block, corresponding to the numerically lowest of","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"the former Class B addresses, was initially and is still reserved by","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"the IANA. Given the present classless nature of the IP address","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"space, the basis for the reservation no longer applies and addresses","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"in this block are subject to future allocation to a Regional Internet","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Registry for assignment in the normal manner.","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"192.0.0.0/24 - This block, corresponding to the numerically lowest of","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"the former Class C addresses, was initially and is still reserved by","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"the IANA. Given the present classless nature of the IP address","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"space, the basis for the reservation no longer applies and addresses","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"in this block are subject to future allocation to a Regional Internet","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Registry for assignment in the normal manner.","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}],"attrs":{}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這個 RFC 發表於 2002 年,對於這兩段地址明確表示因爲無類地址空間的原因,不再需要保留,地址將在今後進行分配。","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"❓ 2)","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"最後一個可用的網絡號如何計算出來的?","attrs":{}},{"type":"text","text":"同理,網絡號全爲 1 即可,看下圖,以 B 類地址爲例:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/79/79f5ff5554ec7390b3ebc6c3fa167dc8.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"❓ 3)","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"每個網絡中的最大主機數爲什麼都要減 2 呢?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"首先我們要明白,計算網絡中的最大主機數就是要看主機號的位數,比如 B 類地址的主機號佔 8 位,那麼 B 類地址的最大主機個數就是 $2^8 - 2$ 個。爲什麼要減 2 呢?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"⭐ 那是因爲","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"主機號全爲 0 和主機號全爲 1 的這兩個 IP 地址是特殊的,在主機號的分配過程中,應該去掉這兩種情況","attrs":{}},{"type":"text","text":":","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第一種情況:","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"主機號全爲 1 指定某個網絡下的所有主機,用於廣播","attrs":{}}]}],"attrs":{}}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" ","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/e9/e9c36ba5a955f44344b2f05c06a1377d.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第二種情況:","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"主機號全爲 0 指定某個網絡","attrs":{}}]}],"attrs":{}}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" ","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/8f/8f9f43b70e057a17a584d2bb75bae2c4.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"④ IP 單播/廣播/多播","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"Ⅰ IP 廣播","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"上文中我們提到了主機號全爲 1 指定某個網絡下的所有主機,用於廣播,那麼什麼是廣播呢?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"廣播地址用於在","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"同一個鏈路中相互連接的主機之間發送數據包,即一個發送方對應多個接收方","attrs":{}},{"type":"text","text":"。接收方在接收到數據包之後,可以根據自己的需要選擇接收還是丟棄。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"💬 比如說學校的廣播通知哪幾個同學來辦公室,那麼雖然所有同學都接收到了這條消息,但是不需要去辦公室的同學就不必理會","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當主機號全爲 1 時,就表示該網絡的廣播地址。例如把 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"172.20.0.0/16","attrs":{}}],"attrs":{}},{"type":"text","text":" 用二進制表示如下:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":""},"content":[{"type":"text","text":"10101100.00010100.00000000.00000000","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"將這個地址的","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"主機部分全部改爲 1","attrs":{}},{"type":"text","text":",則形成廣播地址:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":""},"content":[{"type":"text","text":"10101100.00010100.11111111.11111111","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"再將這個地址用十進制表示,則爲 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"172.20.255.255","attrs":{}}],"attrs":{}},{"type":"text","text":"。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"廣播地址可以分爲本地廣播和直接廣播兩種:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1)","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"在本網絡內廣播的叫做本地廣播","attrs":{}},{"type":"text","text":"。例如網絡地址爲 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"192.168.0.0/24","attrs":{}}],"attrs":{}},{"type":"text","text":" 的情況下,廣播地址是 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"192.168.0.255","attrs":{}}],"attrs":{}},{"type":"text","text":"。因爲這個廣播地址的 IP 包會被路由器屏蔽(即路由器不轉發該廣播包,廣播包無法穿透路由器),所以不會到達 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"192.168.0.0/24","attrs":{}}],"attrs":{}},{"type":"text","text":" 以外的其他鏈路上。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/8e/8e10b58ee0d31718bb9f3789edace9ae.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2)","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"在不同網絡之間的廣播叫做直接廣播","attrs":{}},{"type":"text","text":"。例如網絡地址爲 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"192.168.0.0/24","attrs":{}}],"attrs":{}},{"type":"text","text":" 的主機向 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"192.168.1.255/24","attrs":{}}],"attrs":{}},{"type":"text","text":" 的目標地址發送 IP 包。收到這個包的路由器,將數據轉發給 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"192.168.1.0/24","attrs":{}}],"attrs":{}},{"type":"text","text":",從而使得所有 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"192.168.1.1","attrs":{}}],"attrs":{}},{"type":"text","text":" ~ ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":" 192.168.1.254","attrs":{}}],"attrs":{}},{"type":"text","text":" 的主機都能收到這個包。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/b1/b15e454f6f5726ee3de62080ea32ed16.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"🚨 由於直接廣播有一定的安全問題,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"多數情況下會在路由器上設置爲不轉發廣播包","attrs":{}},{"type":"text","text":",即本地廣播,廣播包無法穿透路由","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"Ⅰ IP 單播","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"廣播模式下,有一個發送方,多個接收方,而在單播模式下,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"只有一個發送方和一個接收方","attrs":{}},{"type":"text","text":"。單播是","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"可以穿透路由器","attrs":{}},{"type":"text","text":"的,也即路由器會對數據包其進行轉發:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/30/3097bd2dab5519acb0c044019ebd2184.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"Ⅲ IP 多播","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"上面我們講了 A、B、C 類地址,D、E 類還沒講。D 類和 E 類地址是沒有主機號的,所以不可用於主機 IP。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"多播使用 D 類地址","attrs":{}},{"type":"text","text":",因此如果首位是 1110,就可以認爲是多播地址,而剩下的 28 位可以稱爲多播的組編號。E 類是預留的分類,暫時未使用。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"那麼什麼是多播(組播)呢?多播用於","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"將包發送給特定組內的所有主機(可以穿透路由器),即一個發送方,特定的多個接收方","attrs":{}},{"type":"text","text":"。由於其直接使用 IP 協議,因此也不存在可靠傳輸。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"👍 在人們使用多播功能之前,一直採用廣播的方式。通過廣播將數據發送給所有終端主機,再由這些主機 IP 之上的一層去判斷是否有必要接收數據。這種方式會給那些毫無關係的網絡或主機帶來影響,造成網絡上很多不必要的流量。再者,由於我們在大部分情況下使用的本地廣播是無法穿透路由的,所以多播這種既能夠穿透路由,又可以實現只給那些必要的組發送數據包的技術就成爲必選之路了。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/bf/bf284c88026fcd3c616a6438dc32c0dd.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"⑤ 子網劃分","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"子網劃分應該是整個 IP 協議中最讓人頭大的部分,寫這部分的時候我也參考了很多資料,對於如何能夠循序漸進講完這部分知識點絞盡腦汁,構思了很久,相信大家看完一定能夠有所收穫 😄","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"Ⅰ 爲什麼要進行子網劃分","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲什麼要進行子網劃分呢?那是因爲","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"傳統的 IP 地址分類可能會造成資源浪費","attrs":{}},{"type":"text","text":":😣","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"上文我們說過,網絡號相同的計算機屬於同一個鏈路,以 B 類網絡爲例,網絡號 16 位(除首位 “10”,啊hi有 14 位),也就是說理論上一個鏈路上允許大約 $2^{16} ≈ 6$ 萬臺計算機連接。然而,在實際架構中,一般不會出現一個鏈路上連接這麼多計算機的情況。因此,直接使用 A 類、B 類或 C 類地址,確實有些浪費資源。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲此,人們開始一種新的組合方式以減少這種浪費。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"Ⅰ 子網劃分初探","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"所謂子網劃分就是:將傳統的兩級 IP 地址(網絡號 + 主機號)轉換成粒度更小的三級 IP 地址(網絡號 + ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"子網號","attrs":{}},{"type":"text","text":" + 主機號),也就是","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"將主機地址劃分爲子網號和子網內的主機號","attrs":{}},{"type":"text","text":"。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/3e/3e7e9e20fb98786aa8e0c5c110fda8e4.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"同樣的,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"子網主機號不能全 0 或全 1","attrs":{}},{"type":"text","text":"。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"🚨 注意:","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"某單位劃分子網後,對外仍表現爲一個網絡,即本單位外的網絡看不見本單位內的子網劃分","attrs":{}},{"type":"text","text":"。如下圖所示,將網絡地址 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"145.13.0.0","attrs":{}}],"attrs":{}},{"type":"text","text":" 劃分成 3 個子網,子網的網絡地址分別爲 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"145.13.3.0","attrs":{}}],"attrs":{}},{"type":"text","text":"、","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"145.13.7.0","attrs":{}}],"attrs":{}},{"type":"text","text":"、","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"145.13.21.0","attrs":{}}],"attrs":{}},{"type":"text","text":":","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"- 所謂網絡地址就是隻指定了網絡號,未指定主機號,主機號全 0。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"- 子網的網絡地址就是指定了網絡號和子網號,未指定主機號,主機號全 0。","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/73/731864c8129f67e9514c080999669723.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"Ⅱ 子網掩碼","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"那麼,子網具體是怎麼劃分的呢?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這裏就需要引出一個新的概念:","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"子網掩碼 subnet mask","attrs":{}},{"type":"text","text":"。*","attrs":{}},{"type":"text","marks":[{"type":"italic","attrs":{}}],"text":"子網掩碼只有一個作用,就是將某個 IP 地址劃分成網絡地址和主機地址兩部分","attrs":{}},{"type":"text","text":"*(爲什麼需要將 IP 地址分成網絡地址和主機地址兩部分,在上文我們已經說過了,這裏不再贅述)。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"子網掩碼由一連串的 0 和 1 構成(0 或 1 必須連續),二級 IP 地址中的網絡號和三級 IP 地址中的網絡號 + 子網號對應到子網掩碼中都用 1 來表示,而主機號對應到子網掩碼中用 0 來表示。因此 A、B、C 類的子網掩碼如下:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/4c/4cecb6a73859ff707f4766d4dc8d4867.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"將 IP 地址與子網掩碼做按位 AND(與)運算(只有兩個都爲 1,結果才爲 1,否則爲 0),得出的就是網絡地址","attrs":{}},{"type":"text","text":":","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/3c/3c5df40149da5e17d28078d21fb8e417.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"💬 舉個子網劃分的例子:假設對 C 類地址進行子網劃分,網絡地址 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"192.168.1.0","attrs":{}}],"attrs":{}},{"type":"text","text":"(二級 IP 地址),使用子網掩碼 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"255.255.255.192","attrs":{}}],"attrs":{}},{"type":"text","text":" 對其進行子網劃分:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/f8/f821374fb30ad79fae4b228e30d1b0fa.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"子網掩碼 255.255.255.192 中共有 26 個 1,即代表網絡號 + 子網號共 26 位,而 C 類地址的網絡號(加上分類號)共 24 位,由此可知,需要","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"從 8 位主機號中借用 2 位作爲子網號","attrs":{}},{"type":"text","text":"。由於子網網絡地址被劃分成 2 位,那麼子網地址就有 $2^2 = 4$ 個,分別是 00、01、10、11,具體劃分如下圖:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/60/6058631b7e425b5fbd618658616bafbb.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"劃分後的 4 個子網如下表格:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/b2/b24412e8324a11edcafe0ff45b6591c1.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"👍 另外說明一點,子網掩碼還有一種更爲簡單明瞭的寫法,子網掩碼的作用不就是用來分離網絡號和主機號的嘛,我們直接在 IP 地址的後面註明網絡號的位數(網絡號 + 子網號)不就行了。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以網絡地址 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"192.168.1.0","attrs":{}}],"attrs":{}},{"type":"text","text":"(C 類二級 IP 地址),子網掩碼 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"255.255.255.192","attrs":{}}],"attrs":{}},{"type":"text","text":" 爲例,我們可以寫成:","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"192.168.1.0/26","attrs":{}}],"attrs":{}},{"type":"text","text":",表示網絡號 + 子網號共 26 位。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"4. 拯救枯竭的 IPV4 地址","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"隨着全球上網用戶量越來越大,現行的 IPV4 地址越來越不夠用,拯救枯竭的 IPV4 地址勢在必行:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"方案一:無分類 IP 地址 CIDR","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"方案二:NAT 地址轉換","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"........","attrs":{}}]}],"attrs":{}}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"然而,這些方案僅僅是解決燃煤之急,相對緩解了 IPV4 地址不夠用的問題,但是 IPV4 地址的數量本身有限的事實無法改變,最根本的解決辦法還是使用 128 比特的 IPV6 地址(本文最後會粗略講解)","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"① 無分類 IP 地址 CIDR","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"直到 20 世紀 90 年代中期,向各種組織分配 IP 地址都以 A、B、C 等分類爲單位進行。對於架構大規模的組織,一般會分配一個 A 類地址;反之,對於小規模的組織,分配一個 C 類地址。😷 然而,A 類地址的派發在全世界最多也無法超過 128 個,加上 C 類地址最多允許 254 臺計算機相連,導致衆多組織開始申請 B 類地址。其結果就是 B 類地址也開始嚴重缺乏,無法滿足需求。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"於是,人們開始","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"放棄 IP 地址的分類,採用任意長度分割 IP 地址的網絡號和主機號","attrs":{}},{"type":"text","text":",這種方式叫作無分類 IP 地址 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"CIDR","attrs":{}},{"type":"text","text":",意爲 “無類型域間選路”。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"CIDR 的表現形式爲 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"a.b.c.d/x","attrs":{}}],"attrs":{}},{"type":"text","text":",其中 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"/x","attrs":{}}],"attrs":{}},{"type":"text","text":" 表示前 x 位屬於網絡號(網絡前綴),","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"網絡號的長度可以根據需要變化","attrs":{}},{"type":"text","text":"。例如 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"128.14.35.7/20","attrs":{}}],"attrs":{}},{"type":"text","text":" 表示該 IP 地址的前 20 位爲網絡號,剩餘 12 位是主機號。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"⭐ ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"CIDR 把網絡號(這裏用網絡前綴可能更好理解,大家看下面這個例子就明白了)都相同的連續 IP 地址組成一個 CIDR 地址塊","attrs":{}},{"type":"text","text":"。這樣,我們就可以把原來的多個 IP 地址合併成同一個網絡,更有效的利用 IPV4 地址。舉個例子,應用 CIDR 技術將 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"203.183.224.1","attrs":{}}],"attrs":{}},{"type":"text","text":" 到 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"203.183.225.254","attrs":{}}],"attrs":{}},{"type":"text","text":" 的地址合併爲同一個網絡(它們本來是 2 個 C 類地址):","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/5e/5e5000a0581c6d659492e6e00d4ddc2a.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"上例中,合併該區間的地址後,主機數爲 $2^9 - 2 = 510$ 個,也就是說從 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"203.183.224.1","attrs":{}}],"attrs":{}},{"type":"text","text":" 到 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"203.183.225.254","attrs":{}}],"attrs":{}},{"type":"text","text":" 的這個網絡內允許接入 510 臺主機:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/ad/ad7436198fe0cd80de831601da988f48.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"② NAT 地址轉換","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"上文我們說過,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"IP 地址並不是根據主機臺數來配置的,而是根據網卡(網絡適配器)來的","attrs":{}},{"type":"text","text":"。像服務器、路由器等設備都是有 2 個以上的網卡,也就是它們會有 2 個以上的 IP 地址。32 位的 IPV4 地址最多給大約 43 億臺接入互聯網的設備配置其獨一無二的 IP 地址。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"現在家家戶戶連入互聯網遠不止一臺電腦吧,再加上若干部手機、若干部平板......,如果這些設備都被分配了全球獨一無二的 IP 地址,43 億的 IP 地址容量顯然是不夠的,儘管我們採用了無分類 IP 地址(CIDR)的方法來減緩 IPV4 地址的消耗速度,但是互聯網的用戶增速是非常驚人的,所以 IPv4 地址依然有被耗盡的危險。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"於是就誕生了一種可以更換 IP 地址的技術: ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"NAT","attrs":{}}],"attrs":{}},{"type":"text","text":",使得可連接的計算機數能夠遠遠超過 43 億臺。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"NAT(Network Address Translator 網絡地址轉換)","attrs":{}},{"type":"text","text":":用於在本地網絡中使用私有地址,在連接互聯網時使轉而使用全局 IP 地址的技術。雖然說 NAT 實際上是爲正在面臨地址枯竭的 IPV4 而開發的技術,不過在 IPV6 中,爲了提高網絡安全也在使用 NAT。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"NAT 的工作機制如下圖所示:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/11/11bb4a89f7811ac12d5bee863daed587.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以 10.0.0.10 主機與 163.221.120.9 主機的通信爲例。利用 NAT,途中的 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"NAT 路由器","attrs":{}},{"type":"text","text":"將發送源 IP 地址 10.0.0.10 轉化爲全局唯一的 IP 地址 202.244.174.37 後,再發送數據。反過來,當數據包從地址 163.221.120.9 發送過來時,目標 IP 地址 202.244.174.37 先被轉換成私有 IP 地址 10.0.0.10 後,再被轉發。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"很顯然,實現網絡地址轉換的關鍵就在於 NAT 路由器。在 NAT 路由器的內部,有一張自動生成的用來轉換地址的表,當 10.0.0.10 主機向 163.221.120.9 主機發送第一個數據包的時候生成這張表,並按照表中的映射關係進行處理。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"💡 現在很多互聯網服務都仍然基於 IPV4,如果這些服務不能放到 IPV6 中,那麼 IPV6 網絡環境的優勢也就無從談起了。爲了解決這個問題,就產生了 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"NAT-PT","attrs":{}},{"type":"text","text":" 規範,NAT-PT 是","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"將 IPV6 的首部轉換成 IPV4 首部","attrs":{}},{"type":"text","text":"的一種技術,這樣,那些只有 IPV6 地址的主機也能夠與 IPV4 地址的主機進行通信了。","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"6. 路由控制","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"😉 把路由控制放到最後面講的原因就是,大家對 IP 地址有了一個健全的認識之後,再來學習路由控制,會比較容易上手。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"① 路由控制初探","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"路由控制 Routing","attrs":{}},{"type":"text","text":" 是指將 IP 數據報發送給最終目標地址的功能。即使網絡非常複雜,也可以通過路由控制確定到達最終目的地的通路。一旦這個路由控制的運行出現異常,分組數據極有可能迷失方向,無法到達目標地址。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/b0/b01b86d63fb0cb9fef9f994ea420ca93.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲了將數據包發送給目標主機,所有主機和路由器都維護着一張","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"路由控制表","attrs":{}},{"type":"text","text":"(Routing Table),該表記錄着如下兩個字段:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"IP 地址","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果想要到達這個 IP 地址,在當前路由器,數據包的下一步應該是發送到哪個路由器","attrs":{}}]}],"attrs":{}}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在發送 IP 數據報時,首先要確定 IP 數據報首部中的目標地址,再從路由控制表中找到與該地址具有","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"相同網絡地址","attrs":{}},{"type":"text","text":"的記錄,根據該記錄將 IP 數據報轉發給相應的下一個路由器。如果路由控制表中存在多條相同網絡地址的記錄,就選擇相同位數最多的網絡地址,也就是","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"最長匹配","attrs":{}},{"type":"text","text":"。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/41/41824ba7a760f48773970e1fe6ea1667.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"用於進行路由控制的是IP 地址中的","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"網絡地址","attrs":{}},{"type":"text","text":"這一部分。💬 舉個例子:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"主機 A 要發送一個 IP 數據報,其源地址是 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"10.1.1.30","attrs":{}}],"attrs":{}},{"type":"text","text":" ,目標地址是 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"10.1.2.10","attrs":{}}],"attrs":{}},{"type":"text","text":",由於沒有在主機 A 的路由表找到與目標地址 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"10.1.2.10","attrs":{}}],"attrs":{}},{"type":"text","text":" 的網絡地址,於是把包被轉發到","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"默認路由","attrs":{}},{"type":"text","text":"(路由器 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"1","attrs":{}}],"attrs":{}},{"type":"text","text":" )","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"路由器 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"1","attrs":{}}],"attrs":{}},{"type":"text","text":" 收到 IP 數據報後,也**在路由器 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"1","attrs":{}}],"attrs":{}},{"type":"text","text":" 的路由表匹配與目標地址相同的網絡地址記錄**,發現匹配到了,於是就把 IP 數據報轉發到了 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"10.1.0.2","attrs":{}}],"attrs":{}},{"type":"text","text":" 這臺路由器 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"2","attrs":{}}],"attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"路由器 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"2","attrs":{}}],"attrs":{}},{"type":"text","text":" 收到後,同樣對比自身的路由表,發現匹配到了,於是把 IP 數據報從路由器 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"2","attrs":{}}],"attrs":{}},{"type":"text","text":" 的 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"10.1.2.1","attrs":{}}],"attrs":{}},{"type":"text","text":" 這個接口出去,最終經過交換機把 IP 數據報轉發到了目標主機","attrs":{}}]}],"attrs":{}}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/74/74114f5960e6f522fb524edee7237e57.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"上面我們提到了","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"默認路由","attrs":{}},{"type":"text","text":",什麼是默認路由呢?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"默認路由 Default Route","attrs":{}},{"type":"text","text":" 就是指路由表中任何一個地址都能與之匹配的記錄。如果一張路由表中包含所有的網絡和子網信息,將會造成無端的浪費。這時,默認路由就是一個不錯的選擇。默認路由一般標記爲 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"0.0.0.0/0","attrs":{}}],"attrs":{}},{"type":"text","text":" 或 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"default","attrs":{}}],"attrs":{}}]}],"attrs":{}}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"此外,我們還需要注意一個地址:","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"環回地址","attrs":{}},{"type":"text","text":"。大家對於 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"localhost","attrs":{}}],"attrs":{}},{"type":"text","text":" 和 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"127.0.0.1","attrs":{}}],"attrs":{}},{"type":"text","text":" 一定不陌生吧,沒錯,這就是環回地址,環回地址是同一臺計算機上的程序之間在進行網絡通信時所使用的一個默認地址。當計算機使用這個特殊的 IP 地址或主機名時,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"數據包就不會流向網絡","attrs":{}},{"type":"text","text":"。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"② 路由協議","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"路由控制表的形成有兩種方式:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一種是管理員手動設置,也叫","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"靜態路由控制","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"另一種是路由器與其他路由器相互交換信息時自動刷新,也叫","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"動態路由控制","attrs":{}}]}],"attrs":{}}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲了讓","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"動態路由","attrs":{}},{"type":"text","text":"即時刷新路由控制表,在網絡上互聯的路由器之間必須設置好某種協議,保證正常讀取路由控制信息。這種協議就稱爲","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"路由協議","attrs":{}},{"type":"text","text":"。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當然,隨着 IP 網絡的發展,只使用一種協議對所有網絡進行統一管理是不可能的。因此,人們根據路由控制的範圍將路由協議大致分爲兩類:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"外部網關協議 EGP(包含 RIP、OSPF 等協議)","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"內部網關協議 IGP(包含 BGP 等協議)","attrs":{}}]}],"attrs":{}}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"沒有 EGP 就不可能有世界上各個不同組織機構之間的通信,沒有 IGP 就不可能有機構內部的通信","attrs":{}},{"type":"text","text":"。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"路由協議其實又是一個重難點,不過在面試中鮮有人問津,大多出現在考試卷上,本文的拉鋸時間確實有點太久了,此處就不再詳細解釋,後續可能會單獨出一篇路由協議的文章(如果大家需要的話)。","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"7. 總結","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"🎉 這篇文章花費的時間長達十多個小時,很大一部分時間都花在理順整篇文章的邏輯上,讓別人懂和讓自己懂真的是天壤之別。OK,關於 IP 協議本身的重要內容至此就基本說完了,不過和 IP 協議相關的技術(比如 ICMP 網際報文控制協議,IGMP 網際組管理協議,DNS 域名解析協議,ARP 地址解析協議,DHCP 動態主機配置協議)還有很多,諸位任重而道遠,我們下期再見 👋","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"horizontalrule","attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"😁 下方掃碼關注","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"公衆號「飛天小牛肉」","attrs":{}},{"type":"text","text":"(專注於分享計算機基礎、Java 基礎和麪試指南的相關原創技術好文,幫助讀者快速掌握高頻重點知識,有的放矢),與小牛肉一起成長、共同進步","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/f3/f3a7f2fe087ad218ca315fe9bfe6cc1c.webp","alt":null,"title":"","style":[{"key":"width","value":"50%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"🎉 並向大家強烈推薦我維護的 ","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"_Gitee 倉庫_","attrs":{}},{"type":"text","text":" *","attrs":{}},{"type":"text","marks":[{"type":"italic","attrs":{}}],"text":"「CS-Wiki」","attrs":{}},{"type":"text","text":"*(Gitee 推薦項目,目前已 0.9k star。面向全棧,致力於構建完善的知識體系:數據結構、計算機網絡、操作系統、算法、數據庫、設計模式、Java 技術棧、機器學習、深度學習、強化學習等),相比公衆號,該倉庫擁有更健全的知識體系,歡迎前來 star,倉庫地址 ","attrs":{}},{"type":"link","attrs":{"href":"https://gitee.com/veal98/CS-Wiki","title":""},"content":[{"type":"text","text":"CS-Wiki(Gitee 推薦項目,0.9k star)","attrs":{}}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章