Wireshark数据包分析实战:TCP报文段重组


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