TCP序列和确认号码

在这里涉及相关话题的其他问题我已经看过,但是我还不清楚。

我刚刚阅读了TCP序列和确认编号的解释。 大约一半的下面是这个图:

在这里输入图像说明

在页面结尾处,最后一步(步骤4)的解释含以下内容:

请注意,第4行中的段的序列号与第3行中的段号相同,因为ACK不占用序列号空间。

因此,请记住,生成的任何数据包(对于以前接收到的数据包只是简单的确认(换句话说,只设置了ACK标志并且不包含数据)),决不会增加序列号。

我目前正在努力了解这一点:

  • 我可以清楚地看到,在步骤4中发送的数据包中的序列号与在步骤3中发送的数据包具有相同的序列号
  • 在这些步骤中也可以看到确认号码也是一样的
  • 基本上,笔者似乎是说第4步的数据包与第3 步的数据包完全相同,只是第4步的数据包包含数据/有效负载。

关于我的第一个两点,这是正确的吗?(就像作者说得对?)关于我的第三点,这是正确的吗? 最后,假设对前两个问题的答案基本上是“是” ,那么这两个数据包中的这些数字是否相同是因为没有从网关服务器接收到任何中间数据包?

我正在寻求这方面的一般澄清。

  • 是的,数据包3和4中的序号和确认号码确实是相同的。
  • 不,数据包不能保证完全一样。 您可能会看到的差异包括:
    • 分组4也可以具有PSH标志设置。
    • 如果时间戳正在使用,他们可能会有所不同之间3和4。
    • 校验和很可能会有所不同。
  • 数据包3和数据包4中的序列号相同,数据包3不包含任何有效载荷数据。
  • 数据包3和数据包4中的原因确认号相同,同时没有从服务器接收数据。

数据包3有点冗余。 TCP层在发送之前可能会决定等待几微秒,然后直接转到数据包4,如果应用程序在几微秒内写入了某个内容。

我可以推荐使用Wireshark来检查计算机上的实际stream量,这可能有助于了解正在发生的事情。