我已经浏览过这里涉及相关主题的其他问题,但我仍然不清楚这一点。
我刚刚读这解释TCP 序列和确认号大约在半程处有这张图:
在页面末尾附近,对最后一步(第 4 步)的解释包括以下文字:
请注意,第 4 行中的段的序列号与第 3 行中的相同,因为 ACK 不占用序列号空间。
因此请记住,生成的任何数据包(只是对先前收到的数据包的确认(换句话说,只设置了 ACK 标志并且不包含任何数据))都不会增加序列号。
我目前正在努力理解这一点:
- 我可以清楚地看到序列号在发送的数据包中步骤4有相同的序列号作为数据包发送步骤 3。
- 还可以清楚地看到确认号码这些步骤也是一样的
- 基本上,作者似乎在说步骤4数据包与步骤 3数据包,除了步骤4数据包包含数据/有效载荷。
关于我的前两点,这是正确的吗?(作者说得对吗?)关于我的第三点,这是正确的吗?最后,假设前两个问题的答案基本上是'是的'那么这两个数据包中的数字相同的原因是因为没有从网关服务器?
我寻求对此的一般澄清。
答案1
- 是的,数据包 3 和 4 中的序列号和确认号确实相同。
- 不,不能保证数据包完全相同。您可能会看到的差异包括:
- 数据包 4 也可能设置了
PSH
标志。 - 如果使用时间戳,它们可能在 3 和 4 之间相差。
- 校验和很可能会有所不同。
- 数据包 4 也可能设置了
- 数据包 3 和 4 中的序列号相同的原因是数据包 3 不包含任何有效负载数据。
- 数据包 3 和 4 中的确认号相同的原因是,在此期间没有从服务器接收到任何数据。
数据包 3 有点多余。如果应用程序在这几微秒内确实向套接字写入了某些内容,则 TCP 层可以决定等待几微秒再发送数据包 4,然后直接发送数据包 4。
我建议使用 Wireshark 检查计算机上的真实流量,这可能有助于了解正在发生的事情。