01 引言
最近有位热心读者朋友给成哥发来私信,说他现在对IP分片有疑惑。
他读过成哥的《wireshark数据包分析三板斧》和《一文秒懂TCPIP实际五层结构》系列文章,直言对自己帮助很大,可以算是成哥的铁粉了。
但是他在工作中遇到的IP分片现象和成哥文章中讲的有出入,想和成哥探讨下具体原因。
成哥觉得这种精神非常好,尽信书不如无书,就要有自己的独立思考。希望大家也多思考多给成哥提出意见和建议,十分感谢。
今天成哥借此文章,分享一下成哥和这位读者的探讨过程。
02 提出挑战
这位读者在一次抓包分析的过程中,看到第四帧有"TCP segment of a reassembled PDU"字样,不明白是何含义。截图如下:
展开第四帧(分组4)和第五帧(分组5)进行查看后,发现自己更迷惑了。刚才是不明白那个英文字段是什么含义,现在是连IP分片都晕了。觉得自己现有知识被颠覆了。
从第五帧的内容中看到,第四帧和第五帧进行了分片重组。Wireshark中有显示"2 Reassembled TCP Segments"。如下图所示。
在仔细查看第四帧和第五帧的IP协议字段,发现写的是"Don't fragment",即"不分片"。如下图所示。
这就不对了啊,"dont fragment"是不允许分片的意思,怎么可能在进行分片重组呢?
03 成哥接锅成哥看到此疑惑后,首先对这位读者进行了安抚。告诉他看到的现象没错,数据包确实有"Reassembled"等字眼。但成哥在系列文章中讲的也没错。
谁都没错,那这个"Reassembled现象和文章中讲述的为何不同呢?
哈哈,要是必须追责,那就追责成哥吧,只怪成哥的《一文秒懂TCPIP实际五层结构》系列文章,限于篇幅,讲的不够深入,这种场景没有提到。
现在帮大家把知识点补上,希望大家见谅。
首先复习一下成哥在IP协议中讲的"标志字段"和"MSS"内容。
(1)标志字段
标志字段属于IP协议头部字段中的一部分,如下图所示:
标志字段用其中一个bit来表示"更多的片 MF (More fragement)"; 标志字段中有一个bit称作"不分片 DF(Don't fragment)"位;如果将这一比特置1,IP将不对数据报进行分片。相反会把数据包丢弃并发送一个ICMP差错报文给起始端。
标志字段内容如下图所示:
(2)MSS最大分节尺寸
MSS:maximum segment size,为TCP数据包每次传输的最大数据分段大小。TCP协议在建立连接的时候通常要协商双方的MSS值,通讯双方会根据双方提供的MSS值的最小值确定为这次连接的最大MSS值。
MSS值为MTU值减去IPv4 头部和TCP 得头部得到。
04 答疑解惑成哥拿过数据包,看到有"TCP segment of a reassembled PDU"字样,就明白症结所在了。"TCP segment of a reassembled PD"的字面含义是"TCP报文段的重组装PDU"。PDU是协议数据单元Protocol Data Unit的缩写。
这里先不着急解释其含义,大家继续往下看。
我们知道TCP报文不会分片,原因是TCP会话建立的前两个包中包含MSS,用于协商两端每次传输的最大数据包尺寸。如下图所示:
我们看到这里MSS=1400,说明每个TCP报文的大小不会大于1400字节。同时,如果应用层需要传输的数据大于1400字节,该怎么传输呢?
答案是应用层在进行数据包传输之前,应用层将大于1400字节的数据包进行分割(注意这里用的是分割,不是分片),分割成多个小于MSS尺寸的数据,再交给网卡进行数据传输。
这种数据分割在应用层完成,对于TCP/IP协议来说是透明的,在网卡看来就是两个独立的数据包。
Wireshark是抓包利器,功能强大,能够分析TCP上层的HTTP协议,并把这种数据包标识出来,记做"TCP segment of a reassembled PDU"。并在数据传输最后一个包中,好心的进行"重组",如下图所示:
这就给大家造成了误会,出现了开头的一幕,让这位读者产生了疑惑。
如果大家在抓包时不想看到这种字段,可以在wireshark软件的"已启用的协议"中,去掉HTTP协议的解析的勾选项即可。位置如下。
05 总结
通过"TCP segment of a reassembled PDU"这个英文字段,引发了这位热心读者的认真思考,提出了好问题,并主动告知成哥,进行共同探讨和学习。
再次感谢。
Wireshark数据包分析三板斧