本文主要是介绍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,表示后面没有分片。
这篇关于IP数据包分片的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!