首页 > 解决方案 > 发送长 TCP 段时会发生什么?

问题描述

我将一个 txt 文件上传到服务器并使用 Wireshark 捕获了上传。问题是有一个非常长的段,然后我从服务器获得的 ack 序列比我应该的要低。在第 865 行,我的 PC 发送了一个长度为 12240 的段。我应该得到一个大于 12240 的 ack,但事实并非如此。

Wireshark 捕获图像

标签: tcpwiresharkpacket-sniffers

解决方案


查看帧 862。主机 128.119.245.12 正在通告 1360 字节的 MSS。因此,10.0.0.12 发送的 TCP 段的最大大小最多只能包含 1360 个字节,尽管 Wireshark 显示了什么。看起来更大的 TCP 段(12240 和 2720 字节)的原因是因为捕获引擎之前正在接收数据包它们由 NIC 分段。如果您在外部设备上捕获流量,例如来自 SPAN 端口或通过 TAP,您不会看到 12240 字节段,而是会看到 9 个 1360 字节段被发送。所以,这就是接收主机的 ACK 号与 12240 不匹配的原因;它会确认它接收到的每个 1360 字节段。直到第 930 帧,构成明显 12240 段的所有 9 个 1360 字节段都被确认,您可以通过一些 SEQ/ACK 分析轻松计算所有这些。

这是主机 10.0.0.12 的 SEQ # 以及来自主机 128.119.245.12 的 ACK #,我已经在括号中包含了 9 个 1360 字节段的细分[],这实际上可以在Wire 已经在外部机器上运行了 Wireshark,而不是在 10.0.0.12 主机上运行:

Frame #    10.0.0.12          128.119.245.12        Comments
           SEQ     Len        ACK
-------    -----------        --------------        -----------------------------
822        0       0           
862                           1                     Next expected SEQ # is now 1
863        1       0           
864        1       716                              
865        717     12240                            SEQ: 1 + 716 = 717
[865-1     2077    1360                             SEQ: 717 + 1360 = 2077]
[865-2     3437    1360                             SEQ: 2077 + 1360 = 3437]
[865-3     4797    1360                             SEQ: 3437 + 1360 = 4797]
[865-4     6157    1360                             SEQ: 4797 + 1360 = 6157]
[865-5     7517    1360                             SEQ: 6157 + 1360 = 7517]
[865-6     8877    1360                             SEQ: 7517 + 1360 = 8877]
[865-7     10237   1360                             SEQ: 8877 + 1360 = 10237]
[865-8     11597   1360                             SEQ: 10237 + 1360 = 11597]
[865-9     12957   1360                             SEQ: 11597 + 1360 = 12957]
905                           717                   ACK: The ACK to frame 864
906        12957   1360                             SEQ: 717 + 12240 = 12957
907                           2077                  ACK: The ACK to "frame" 865-1
908        14317   2720                             SEQ: 12957 + 1360 = 14317
912                           3437                  ACK: The ACK to "frame" 865-2
913        17037   2720                             SEQ: 14317 + 2720 = 17037
915                           4797                  ACK: The ACK to "frame" 865-3
916        19757   2720                             SEQ: 17037 + 2720 = 19757
917                           6157                  ACK: The ACK to "frame" 865-4
918        22477   2720                             SEQ: 19757 + 2720 = 22477
919                           7517                  ACK: The ACK to "frame" 865-5
920        25197   2720                             SEQ: 22477 + 2720 = 25197
923                           8877                  ACK: The ACK to "frame" 865-6
924        27917   2720                             SEQ: 25197 + 2720 = 27917
925                           10237                 ACK: The ACK to "frame" 865-7
926        30637   2720                             SEQ: 27917 + 2720 = 30637
927                           11597                 ACK: The ACK to "frame" 865-8
928        33357   2720                             SEQ: 30637 + 2720 = 33357
930                           12957                 ACK: The ACK to "frame" 865-9
-------    -----------        --------------        -----------------------------

有关此主题的进一步阅读,我将向您推荐 Jasper Bongertz 撰写的一篇出色的文章,标题为“本地数据包捕获的缺点”


推荐阅读