IP数据包分片

1. 缘由:

维护我司老代码,偶然发现在ping过大的数据包时候,映射到上层(非TCP/IP协议栈)的协议不正确。一般的ping则一切正常,结合 wireshark对数据包进行分析,发现过大的数据包传输过程中会进行分片,而代码在处理过程中并为对此进行处理。现对相关基础知识进行总结。

2. IP数据包简介

这里写图片描述

整个ip数据包中,包含了首部和数据。其中,如果选项没有数据,则ip首部的长度就为20byte。
在ip首部中涉及到分片的主要有:总长度,标识,标志,分片偏移
总长度:整个数据包的长度,包含了首部和数据。所以要得到数据的长度,就用总长度减去首部长度
标识:当数据被分片,每个分片具有相同的标识,这样就可以识别相同组的分片 分片偏移:用于确定该分片在原未分片数据中的位置

3. IP分片

这里我们以ICMP协议为例进行解析。
查看windows下ping命令的语法,我们可以看到-l参数可以指定发送的数据大小。
这里写图片描述
默认情况下,ping数据包默认大小是32字节,此时肯定不会发生IP数据包分片,如下图所示。
这里写图片描述

当icmp发送的数据包大于MTU(以太网中,该值一般为1500字节)时,就会在ip层发生分片。
这里写图片描述
同一个IP数据包Identification字段一致。
Flags字段为1时,表示进行数据包分片,此时若Fragment offset表示分片偏量,若为0,则表示是第一个数据包分片。
Flags字段为0,表示后面没有分片。