跳到主要内容

6.1.2 TCP 发送端

6.1.2 TCP 发送端

对于使用 ECN 的 TCP 连接, 新数据包在发送时会在 IP 头部中设置 ECT codepoint. 当发送端在 TCP 连接的所有数据包上只需要单个 ECT codepoint 时, SHOULD 使用 ECT(0). 如果发送端收到 ECN-Echo (ECE) ACK packet (即 TCP 头部中设置了 ECN-Echo 标志的 ACK packet), 则发送端知道从发送端到接收端的路径上网络遇到了拥塞. 该拥塞指示应像 non-ECN-capable TCP 中的拥塞丢失一样处理. 也就是说, TCP 源将拥塞窗口 "cwnd" 减半, 并降低慢启动阈值 "ssthresh". 发送 TCP SHOULD NOT 因收到 ECN-Echo ACK packet 而增加拥塞窗口.

TCP 不应对每个数据窗口 (或更宽松地说, 每个往返时间) 中的拥塞指示作出超过一次响应. 也就是说, 对来自单个数据窗口的一系列丢弃和/或 CE packet, TCP 发送端的拥塞窗口应只降低一次. 此外, 如果 ssthresh 已经在最近一个往返时间内降低, TCP 源不应再次降低 ssthresh. 然而, 如果重传数据包被丢弃, 源 TCP 将其解释为新的拥塞实例.

源 TCP 响应 CE packet 而降低其拥塞窗口后, 入站确认可以按照降低后的拥塞窗口所允许的范围, 允许出站数据包 "clocking out". 如果拥塞窗口只包含一个 MSS (maximum segment size), 并且发送 TCP 收到 ECN-Echo ACK packet, 原则上发送 TCP 仍应将其拥塞窗口减半. 然而, 拥塞窗口的下限是一个 MSS. 如果发送 TCP 继续以 1 MSS 的拥塞窗口发送, 这将导致每个往返时间发送一个数据包. 当拥塞窗口为 1 时收到 ECN-Echo packet, 必须进一步降低 TCP 发送端的发送速率. 在这种情况下, 我们使用重传定时器作为进一步降低速率的机制. 因此, 当拥塞窗口为 1 时收到 ECN-Echo packet, 发送 TCP MUST 重置重传定时器. 然后, 发送 TCP 只能在重传定时器到期时发送新的数据包.

当 ECN-capable TCP 发送端因任何原因降低其拥塞窗口时 (因为重传超时, Fast Retransmit, 或响应 ECN 通知), TCP 发送端会在窗口降低后发送的第一个新数据包的 TCP 头部中设置 CWR 标志. 如果该数据包在网络中被丢弃, 发送 TCP 将不得不再次降低拥塞窗口并重传被丢弃的数据包.

我们确保 "Congestion Window Reduced" 信息可靠交付给 TCP 接收端. 这是因为如果携带 CWR 标志的新数据包被丢弃, TCP 发送端将不得不再次降低其拥塞窗口, 并发送另一个设置了 CWR 标志的新数据包. 因此, TCP 头部中的 CWR bit SHOULD NOT 在重传数据包上设置.

当 TCP 数据发送端在降低拥塞窗口后准备设置 CWR bit 时, 它 SHOULD 只在其发送的第一个新数据包上设置 CWR bit.

[Floyd94] 更详细地讨论了 TCP 对 ECN 的响应. [Floyd98] 讨论了 ns 模拟器的验证测试, 这些测试说明了各种 ECN 场景. 这些场景包括: 一个 ECN 后跟另一个 ECN, Fast Retransmit 或 Retransmit Timeout; Retransmit Timeout 或 Fast Retransmit 后跟 ECN; 以及一个数据包的拥塞窗口后跟 ECN.

TCP 按照现有算法响应入站 ACK, 多个重复确认或发送数据包的重传超时 [RFC2581]. 当 TCP 收到未设置 ECN-Echo bit 的 ACK packet 时, 它也按照正常过程增加拥塞窗口 [RFC2581].