你不知道的IP分片

1. 緣由:

你不知道的IP分片

維護我司老代碼,偶然發現在ping過大的數據包時候,映射到上層(非TCP/IP協議棧)的協議不正確。一般的ping則一切正常,結合wireshark對數據包進行分析,發現過大的數據包傳輸過程中會進行分片,而代碼在處理過程中併為對此進行處理。現對相關基礎知識進行總結。

2. IP數據包簡介

你不知道的IP分片

整個ip數據包中,包含了首部和數據。其中,如果選項沒有數據,則ip首部的長度就為20byte。

在ip首部中涉及到分片的主要有:總長度,標識,標誌,分片偏移

總長度:整個數據包的長度,包含了首部和數據。所以要得到數據的長度,就用總長度減去首部長度

標識:當數據被分片,每個分片具有相同的標識,這樣就可以識別相同組的分片 分片偏移:用於確定該分片在原未分片數據中的位置。

3. IP分片

這裡我們以ICMP協議為例進行解析。

查看windows下ping命令的語法,我們可以看到-l參數可以指定發送的數據大小。

你不知道的IP分片

默認情況下,ping數據包默認大小是32字節,此時肯定不會發生IP數據包分片,如下圖所示。

你不知道的IP分片

當icmp發送的數據包大於MTU(以太網中,該值一般為1500字節)時,就會在ip層發生分片。

你不知道的IP分片

同一個IP數據包Identification字段一致。

Flags字段為1時,表示進行數據包分片,此時若Fragmentoffset表示分片偏量,若為0,則表示是第一個數據包分片。

Flags字段為0,表示後面沒有分片。


分享到:


相關文章: