目錄
- 1.網絡層
- (1)IP協議頭格式
- (2)工作流程
- 2.網段劃分
- (1)五類地址
- (2)回環地址
- (3)網段的特殊地址
- (4)網絡建設
我們前面暫時跳過了網絡層,帶著網絡層的功能去學習鏈路層。現在可以說我們只差最后一塊拼圖了,通過網絡層,了解IP報頭的具體組成,我們就可以串聯整個協議棧了。當然,有了ARP、MTU、NAPT的鏈路層鋪墊,網絡層會理解地非常輕松。
1.網絡層
(1)IP協議頭格式
網絡層接收傳輸層的數據段,在這里進一步封裝為數據報,報頭結構如下圖:
4 位版本號: 指定 IP 協議的版本,對于 IPv4 來說,這個字段的值就是 4。有的 IPv4 集成到了系統里,這些生態問題很難改變。
4 位頭部長度: 4bit 表示的最大的數字是 15,真實的頭部長度要 * 4,所以 IP 頭部最大長度是 60 字節。固定長度是 20 字節,選項最多有 40 字節。
8 位服務類型: 其中有 4 位 TOS 字段,分別表示:最小延時、最大吞吐量、最高可靠性、最小成本,這四者相互沖突,只能選擇一個(對于 ssh/telnet 這樣的應用程序,最小延時比較重要;對于 ftp 這樣的程序,最大吞吐量比較重要)。 除此之外,還有 1 位保留字段必須置為 0,以及 3 位已經棄用的優先權字段。
16 位總長度: IP 數據報總長度,包含IP報頭 + 數據部分,IP報頭的長度前面的 4 位頭部長度也單獨統計過。
16 位標識: 要理解這個,我們要結合MTU來看,鏈路層約束IP數據報(包含報頭 + 數據)不能超過1500字節,如果超過了就要分片、重組。 所以在網絡層,忽略報頭的選項部分,發現傳輸層傳下來的數據段超過1480字節的話,就要將數據分成多片,交到目標主機處再進行重組(路由器不會重組)。其中 16 位標識就是給每個分片一個相同的 ID,相同標識的說明它們原本是在一起的,網絡層也會根據 16 位標識判斷哪些分片屬于同一組的。
3 位標志字段: 第 1 位現在不使用; 第 2 位為 1 表示禁止分片,這時候如果報文長度超過 MTU,IP 模塊就會丟棄報文;第三位表示“更多分片”,如果分片了的話,最后一個分片置為 0,其他是 1,類似于一個結束標記。000表示無分片或者最后一塊分片,001表示首塊分片和中間分片。要結合片偏移最終確定。
13 位分片偏移: 是分片相對于原始 IP 報文數據部分開始處的偏移量,分片后每個片作為一個數據報獨立傳輸,偏移量告訴了之后應當按照什么順序組裝,重組后的報文應當是完全連續的。 如果 13 位分片偏移的值是 1,說明其偏移的字節數是 1 * 8,這個偏移值要 * 8才能得到真實偏移值。 因此,每個分片(除了最后一個分片)的數據量應當是 8 的整數倍,否則無法連續地拼接起來。 總結一下,標識字段000,偏移量0表示無分片;001 + 0 表示第一塊分片,001 + !0 表示中間的分片,000 + !0 表示最后一塊分片,010表示禁止分片。
8 位生存時間(TTL): 數據報到達目的地的最大跳數,一般是64。每次經過一個路由轉發,TTL -= 1,如果一直減到 0 還沒到達,那么就丟棄,由上層控制重傳。這個字段要是用來防止出現路由循環和網絡擁堵。
8 位協議: 值表示上層協議的類型,6 對應TCP協議;17 對應UDP協議,1 對應ICMP協議(ping命令使用的協議),也就是說協議號為 1 的話報文就會交給ICMP協議去處理,而不是常認為的TCP和UDP。這和鏈路層mac幀格式的“類型”有相似之處,IP也是有自己的類型的,不同類型的IP報文其數據部分也不一樣。
16 位頭部校驗和: 進行校驗,其功能和鏈路層的CRC校驗一致,主要用于鑒別頭部是否損壞,損壞的話該報文直接丟棄。鏈路層和網絡層都有自己的校驗手段,鏈路層校驗失敗后直接丟棄且不做任何反饋,相應的,IP分片重組肯定收集不齊,也會重組失敗,反映到傳輸層就是傳輸失敗,由相應重傳機制控制重傳。如果IP層檢驗和失敗,同樣會直接丟棄且不做反饋,同樣重組分片會因為不齊而失敗,由傳輸層/應用層控制重傳。 兩者都不維護可靠性傳輸,如果校驗失敗都會直接丟棄而不反饋,造成后續的錯誤最終都匯集到傳輸層/應用層,由它們進行控制。 這也體現出分層的特點。
32 位源地址和 32 位目標地址: 表示發送端和接收端。其中路由器進行NAPT的時候會來修改這兩個字段(正向查表和反向查表)
(2)工作流程
網絡層負責接收傳輸層傳下來的數據段。根據數據段的大小,進行分片處理。分片處理后的每一片都是一個獨立的數據報,有著完整的IP報頭,但是由于將數據部分分片,每個數據報里面的數據部分實際上是支離破碎的(按順序拆成一塊塊的,每一塊都不是完整的數據段),只有第一個分片有傳輸層的頭部。 所以說需要標志、片偏移共同維護分片標識,因為一旦重組失敗了,對于傳輸層而言數據就是錯亂的,數據分片重組在傳輸層是不應該感知到的。
當IP層包裝好后交給鏈路層,分片由IP層做好后,一定滿足MTU的要求,所以鏈路層拿著數據報,根據數據報里面的目的IP判斷是否是在當前局域網。如果是的話就ARP請求對應mac地址,如果不是的話就ARP請求網關地址的mac地址。 之后mac幀被封裝傳輸給交換機,由交換機查表、擴散轉發給對應主機。
如果轉發給了路由器,路由器會進行解包操作,在鏈路層進行校驗和,如果失敗就丟棄。沒有失敗的話繼續解包到網絡層,進行頭部校驗和,如果失敗就丟棄。 路由器根據目的IP查看自己的路由表,根據最長前綴選擇好下一跳。與此同時路由器會NAPT,修改所有分片的源地址和第一塊分片的端口號,并將TTL -= 1,之后封裝好新的目的mac后發出去。
直到目的主機上進行解包,校驗和,根據標志、標識、片偏移進行重組,重組成功后就將完整的數據段交給傳輸層,失敗的話就不做任何處理。 TCP會觸發超時重傳或者快重傳,UDP的話就需要應用層自己維護重傳機制了。
2.網段劃分
這里主要是補充一些上篇文章沒有提及的IP地址相關的知識,不影響整體理解。
(1)五類地址
下面是總結各類地址的表格
地址類別 | 首段地址范圍(十進制) | 網絡位/主機位(IPv4共32位) | 默認子網掩碼 | 主要用途 |
---|---|---|---|---|
A類 | 1~126(127.0.0.0為回環地址) | 前8位為網絡位,后24位為主機位 | 255.0.0.0 | 大型網絡(如早期主干網、大型企業) |
B類 | 128.0~191.255 | 前16位為網絡位,后16位為主機位 | 255.255.0.0 | 中型網絡(如中型企業、高校) |
C類 | 192.0.0~223.255.255 | 前24位為網絡位,后8位為主機位 | 255.255.255.0 | 小型網絡(如家庭、小型辦公室) |
D類 | 224.0.0.0~239.255.255.255 | 不劃分網絡位與主機位 | 無默認子網掩碼 | 組播(如視頻會議、數據群發) |
E類 | 240.0.0.0~255.255.255.254(255.255.255.255為廣播地址) | 不劃分網絡位與主機位 | 無默認子網掩碼 | 保留地址(用于科研、實驗等特殊場景,未公開商用) |
我們就考慮A、B、C類地址,最開始是嚴格劃分的,但后面引入CIDR技術后,基本都是按需分配,如按照子網掩碼,/23這種表示方式來劃分網絡號和主機號,這樣極大地提高了地址的利用率。 但這并不意味五類地址被淘汰了,而是引入CIDR進行更精細的劃分,比如我用拿到了一個/7的地址塊,我可以說我拿到了2塊A類地址(主機數為A類地址的兩倍)。
(2)回環地址
127開頭的地址屬于IPv4的回環地址。
也就是說整個127.0.0.0/8網段(即127.0.0.1~127.255.255.254)均為此用途,核心作用是本地設備自我測試(如程序調試、網絡協議驗證),數據不會發送到外部網絡,僅在設備內部循環。最常用的是127.0.0.1,常用來指代本地主機。
(3)網段的特殊地址
一個子網的理論主機總數 = 2 ^ 主機號位數,但實際上是2 ^ 主機號位數 - 2,有兩個特殊地址不能使用。
主機號全0用于標識整個網段,主機號全1表示在該網段上廣播。主機號網絡號全1表示全局廣播,全0一般都是臨時占位(可表示本網絡上的本主機),這些地址都不會分配到一個具體的主機上。
(4)網絡建設
我們想要構建子網時,家里直接買個路由器即可,路由器具備構建子網的能力。但局域網的構建運營商也在做,有可能我們路由器出去還是子網,例如家庭路由器的WAN口IP實際上還是運營商子網下的私網IP。
申請公網IP,網絡建設工作,都是交給運營商來做的。所以為什么上網交錢是給運營商交錢?我們報文出了路由器后還是在運營商的子網下,我們真正想要得到公網IP需要運營商路由器NAPT之后才會得到,我們需要運營商的路由器為我們提供服務。