为什么纯 ACK 会增加序列号?

网络工程 通讯协议
2021-07-11 14:52:23

我无法弄清楚为什么当 TCP 段仅包含标头时,例如在建立 TCP 连接的三次握手中的第三段中,纯 ACK 会将发送主机的序列号加 1。

例如:

  1. Host1 向 Host2 发送一个 SYN 段(seq = ISN(c), options)。
  2. Host2 将 SYN+ACK 段(seq = ISN(s), ACK = ISN(c)+1, options)发送回 Host1。
  3. 主机 1 将最后一个 ACK​​ 段(seq = ISN(c) +1, ACK = ISN(s)+1)发送到服务器以完成握手。

但是第三段中没有包含数据,这意味着 Host1 不会向通信路径注入更多字节。发送的只是标题。为什么它的 seq 与第 1 段的不同?

1个回答

第三段不一定不包含数据。来自数据通信和网络(Forouzan):

请注意,如果 ACK 段不携带数据,则它不会消耗任何序列号,但某些实现允许连接阶段的第三个段携带来自客户端的第一个数据块(重点是我的)。在这种情况下,该段消耗的序列号与数据字节数一样多。一个 ACK​​ 段,如果不携带数据,则不消耗序列号。

我在Computer Networking: A Top-Down Approach (Kurose and Ross) 中找到了你的问题的答案

收到 SYNACK 段后,客户端还会为连接分配缓冲区和变量。客户端主机然后向服务器发送另一个段;this lasts 段确认服务器的连接授权段(客户端通过将值server_isn+1放入 TCP 段头的确认字段中来这样做)。SYN 位设置为零,因为连接已建立。三向握手的第三阶段可以在段有效载荷中携带客户端到服务器的数据。

下页有图解所指(下图不是书上的,但思路是一样的):

TCP 三向握手:段交换