发送长 TCP 段时会发生啥?

Posted

技术标签:

【中文标题】发送长 TCP 段时会发生啥?【英文标题】:What happens when a long TCP segment is sent?发送长 TCP 段时会发生什么? 【发布时间】:2021-04-05 13:12:00 【问题描述】:

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

Wireshark capture image

【问题讨论】:

networkdatapedia.com/post/2016/08/11/… 【参考方案1】:

查看帧 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 字节段的细分如果 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 撰写的一篇出色的文章,标题为 The drawbacks of local packet captures。

【讨论】:

以上是关于发送长 TCP 段时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

如果您将 dst 端口为 80 的 TCP 数据包发送到在端口 80 处提供 http 请求的主机,会发生啥?

当套接字连续接收到超出程序处理能力的数据时会发生啥?

长连接、短连接是啥意思?哪位大神给讲一下,不要太官方了,通俗易懂点,谢谢。

当 tcp/udp 服务器的发布速度快于客户端的消耗速度时会发生啥?

手机屏幕关闭时会发生啥?

RAFT:当Leader在操作过程中发生变化时会发生啥