wiresharktcp数据包分析(Wireshark数据包分析实战)(1)

01 引言

最近有位热心读者朋友给成哥发来私信,说他现在对IP分片有疑惑。

他读过成哥的《wireshark数据包分析三板斧》和《一文秒懂TCPIP实际五层结构》系列文章,直言对自己帮助很大,可以算是成哥的铁粉了。

但是他在工作中遇到的IP分片现象和成哥文章中讲的有出入,想和成哥探讨下具体原因。

成哥觉得这种精神非常好,尽信书不如无书,就要有自己的独立思考。希望大家也多思考多给成哥提出意见和建议,十分感谢。

今天成哥借此文章,分享一下成哥和这位读者的探讨过程。

wiresharktcp数据包分析(Wireshark数据包分析实战)(2)

02 提出挑战

这位读者在一次抓包分析的过程中,看到第四帧有"TCP segment of a reassembled PDU"字样,不明白是何含义。截图如下:

wiresharktcp数据包分析(Wireshark数据包分析实战)(3)

展开第四帧(分组4)和第五帧(分组5)进行查看后,发现自己更迷惑了。刚才是不明白那个英文字段是什么含义,现在是连IP分片都晕了。觉得自己现有知识被颠覆了。

从第五帧的内容中看到,第四帧和第五帧进行了分片重组。Wireshark中有显示"2 Reassembled TCP Segments"。如下图所示。

wiresharktcp数据包分析(Wireshark数据包分析实战)(4)

在仔细查看第四帧和第五帧的IP协议字段,发现写的是"Don't fragment",即"不分片"。如下图所示。

wiresharktcp数据包分析(Wireshark数据包分析实战)(5)

这就不对了啊,"dont fragment"是不允许分片的意思,怎么可能在进行分片重组呢?

03 成哥接锅

成哥看到此疑惑后,首先对这位读者进行了安抚。告诉他看到的现象没错,数据包确实有"Reassembled"等字眼。但成哥在系列文章中讲的也没错。

谁都没错,那这个"Reassembled现象和文章中讲述的为何不同呢?

哈哈,要是必须追责,那就追责成哥吧,只怪成哥的《一文秒懂TCPIP实际五层结构》系列文章,限于篇幅,讲的不够深入,这种场景没有提到。

现在帮大家把知识点补上,希望大家见谅。

首先复习一下成哥在IP协议中讲的"标志字段"和"MSS"内容。

(1)标志字段

标志字段属于IP协议头部字段中的一部分,如下图所示:

wiresharktcp数据包分析(Wireshark数据包分析实战)(6)

标志字段用其中一个bit来表示"更多的片 MF (More fragement)"; 标志字段中有一个bit称作"不分片 DF(Don't fragment)"位;如果将这一比特置1,IP将不对数据报进行分片。相反会把数据包丢弃并发送一个ICMP差错报文给起始端。

标志字段内容如下图所示:

wiresharktcp数据包分析(Wireshark数据包分析实战)(7)

(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的缩写。

这里先不着急解释其含义,大家继续往下看。

wiresharktcp数据包分析(Wireshark数据包分析实战)(8)

我们知道TCP报文不会分片,原因是TCP会话建立的前两个包中包含MSS,用于协商两端每次传输的最大数据包尺寸。如下图所示:

wiresharktcp数据包分析(Wireshark数据包分析实战)(9)

我们看到这里MSS=1400,说明每个TCP报文的大小不会大于1400字节。同时,如果应用层需要传输的数据大于1400字节,该怎么传输呢?

答案是应用层在进行数据包传输之前,应用层将大于1400字节的数据包进行分割(注意这里用的是分割,不是分片),分割成多个小于MSS尺寸的数据,再交给网卡进行数据传输。

这种数据分割在应用层完成,对于TCP/IP协议来说是透明的,在网卡看来就是两个独立的数据包。

Wireshark是抓包利器,功能强大,能够分析TCP上层的HTTP协议,并把这种数据包标识出来,记做"TCP segment of a reassembled PDU"。并在数据传输最后一个包中,好心的进行"重组",如下图所示:

wiresharktcp数据包分析(Wireshark数据包分析实战)(10)

这就给大家造成了误会,出现了开头的一幕,让这位读者产生了疑惑。

如果大家在抓包时不想看到这种字段,可以在wireshark软件的"已启用的协议"中,去掉HTTP协议的解析的勾选项即可。位置如下。

wiresharktcp数据包分析(Wireshark数据包分析实战)(11)

05 总结

通过"TCP segment of a reassembled PDU"这个英文字段,引发了这位热心读者的认真思考,提出了好问题,并主动告知成哥,进行共同探讨和学习。

再次感谢。

Wireshark数据包分析三板斧

  • 一文秒懂 TCP/IP实际五层结构(上篇)
  • IT工程师都需要掌握的容器技术之Docker基本用法
  • ,