一:前言
如果網絡中的所有設備都是使用集線器或者交換機進行連接,那麼這個網絡稱爲局域網(LAN)。如果將兩個局域網連接起來,那麼需要路由器。複雜的網絡中,可能包含了成千上萬的局域網,而這些局域網是由成千上萬的路由器連接起來的。
互聯網本身是由無數局域網和路由器組成的一個集合
二:IPv4頭(固定長度20字節)
版本(version):IP所使用的版本
首部長度(Header Length):IP頭的長度
服務類型(Type of Service):優先級標誌位和服務類型標誌位,被路由器用來進行流量的優先排序
總長度(Total Length):IP頭與數據包中數據的長度
標識符(Identification):一個唯一的標識數字,用來識別一個數據包或者被分片數據包的次序
標誌(FLags):用來識別一個數據包是否是一組分片數據包的一部分
片偏移(Fragment Offset):一個數據包是一個分片,這個域中的值就會被用來將數據包以正確的順序重新組裝
生存時間(Time to Live):用來定義數據包的生存週期,以經過路由器的跳數/秒數進行描述
死循環會引發各種問題,導致程序或者os的崩潰。當收到ttl爲1,則不會進行轉發。
協議(Protocol):用來識別在數據包序列中上層協議數據包的類型
首部校驗和(Header Checksum):一個錯誤檢測機制,用來確認IP頭的內容沒有被損壞或者篡改
源地址(Source IP Address):發出數據包的主機的IP地址
目的地址(Destination IP Address):數據包目的地的IP地址
選項(Options):保留作額外的IP選項。包含這源站選路和時間戳的一些選項
數據(Data):使用IP傳遞的實際數據
可以看出IPv4協議的頭部佔20字節,Total length爲60,故數據部分的長度爲40字節
三:IP分片
數據包分片將一個數據流分爲更小的片段,它是IP用於解決跨越不同類型網絡時可靠傳輸的一個特性。
一個數據包的分片主要基於第2層數據鏈路協議所使用的最大傳輸單元(MTU)的大小,以及使用這些第2層協議的設備配置情況。在多數情況下,第2層所使用的數據鏈路協議是以太網。
以太網默認的MTU是1500,也就是說以太網上所能傳輸的最大報文大小是1500字節(並不包括14字節的以太網頭本身)
當一個設備準備傳輸一個IP數據包時,它將會比較這個數據包的大小,以及MTU,用來決定是否需要將這個數據包分片。如果數據包大小大於MTU,那麼這個數據包就會被分片,分片步驟如下
- 設備將數據分爲若干個將要接下來進行傳輸的數據包
- 每個IP頭的總長度字段會被設置成每個分片的片段長度
- 除了最後一個分片數據包外,之前所有分片數據包的標誌位都被標識爲1
- IP頭中分片部分的分片偏移將會被設置
- 數據包被髮送出去
看上圖地址10.10.0.3向一個地址爲192.168.0.128的設備發送ping請求,由於請求包太大,被分爲3部分傳輸
第一個數據包
根據More fagements 和Fragement offset可以判定這個數據包是分片數據包中的一部分
第二個數據包
第二個 數據包的IP頭,同樣被設定了標誌位,但是這裏的分片偏移值是185(以8個字節爲單位:140),意味着1500字節的MTU,減去了IP頭部的20字節
第三個數據包
這個數據包並沒有設定爲更多的分片標誌位,意外着是最後一個分片,其片偏移值設置爲370(實際爲2960)
雖然網絡上被分片的數據包不怎麼常見,但是明白數據包爲什麼會分片是有用的,當遇到時,可以診斷問題所在或認出丟失的分片
關於IP數據包分片的計算問題,可以看https://blog.csdn.net/qq_39112646/article/details/86763757