tcp 标头中的窗口大小是否包括 tcp 标头大小?

网络工程 tcp 协议论 联网 拥塞
2022-02-27 23:20:05

假设 TCP 段在“窗口大小”字段中具有 = 1400 字节。
这是否意味着

  1. 我们可以发送 1400 字节的 tcp 段 = TCP 头 + 数据或
  2. 它确实只指定了我们可以发送的未确认有效负载的最大大小?

示例:
我们需要发送一个 1380 字节的文件。

案例 1) 让我们有一个 20 字节的最小 TCP 标头:20 + 数据 = 1400 > 数据 (= 1380) 所以我们需要两个段 (20 + 1380) + (20 + 10)。

案例 2) 数据 = 1390 < 1400 我们很好:我们发送一个大小为 1410 的段。

2个回答

不,接收窗口仅指有效载荷数据。它不包括任何 TCP 标头。案例 2 是正确的。请注意,确实包含 TCP 标头。

有关 TCP 协议标准,请参阅RFC 793

附录,Zack 所说的。

我认为您误解了窗口大小的含义。

窗口大小是接收缓冲区中的可用空间,即发送者可以在没有收到 ACK 的情况下发送的数据量。通常,这个空间足以容纳几个段(最大段大小)。它没有说明单个段中的有效负载大小。

由于 TCP 应该使用延迟的 ACK,即为每个其他数据包发送 ACK,我会说这个空间必须至少是两个段。

示例:我们需要发送一个 1380 字节的文件。

案例 1) 让我们有一个 20 字节的最小 tcp 标头:20 + data = 1400 -> >data = 1380 所以我们需要两个段 (20 + 1380) + (20 + 10)。

因此,如果窗口大小小于一个段,您不仅需要两个段,还需要发送一个段,等待 ACK,然后再发送另一个段。

另一方面,每条路径都有最大段大小(MSS)。如果 MSS 为 1400 字节,您将需要两个段,但您可以一个接一个地直接发送两个数据包

案例 2) 数据 = 1390 < 1400 我们很好:我们发送一个大小为 1410 的段。

是的,如果 MSS 允许,您可以。如果没有,您仍然可以将文件拆分为两个段,然后一个接一个地直接发送。