6.1.3 TCP 接收端
6.1.3 TCP 接收端
当 TCP 在目标端系统收到 CE packet 时, TCP 数据接收端在后续 ACK packet 的 TCP 头部中设置 ECN-Echo 标志. 如果实现了任何 ACK withholding, 例如当前 "delayed-ACK" TCP 实现中 TCP 接收端可以对两个到达数据包发送一个 ACK, 则如果被确认的任一数据包中设置了 CE codepoint, ACK packet 中的 ECN-Echo 标志将被设置为 '1'. 也就是说, 如果任一收到的数据包是 CE packet, 则返回的 ACK 设置 ECN-Echo 标志.
为增强对携带 ECN-Echo 标志的 ACK packet 可能被丢弃这一情况的稳健性, TCP 接收端会在随后发送的一系列 ACK packet 中设置 ECN-Echo 标志. TCP 接收端使用从 TCP 发送端收到的 CWR 标志来确定何时停止设置 ECN-Echo 标志.
TCP 接收端发送设置了 ECN-Echo bit 的 ACK packet 后, 该 TCP 接收端继续在它发送的所有 ACK packet 中设置 ECN-Echo 标志 (无论这些 ACK 确认的是 CE packet 还是 non-CE packet), 直到它收到 CWR packet (设置了 CWR 标志的数据包). 收到 CWR packet 后, 对后续 non-CE packet 的确认不设置 ECN-Echo 标志. 如果数据接收端收到另一个 CE packet, 则接收端再次在 ACK packet 中设置 ECN-Echo 标志. 虽然收到 CWR packet 不能保证数据发送端收到了 ECN-Echo 消息, 但它确实表明数据发送端在发送被标记 CE codepoint 的数据包之后的某个时间降低了其拥塞窗口.
我们已经规定 TCP 发送端不需要每个数据窗口降低其拥塞窗口超过一次. 如果 TCP 发送端要避免在一个数据窗口同时包含丢失数据包和 (标记的) CE packet 时不必要地降低拥塞窗口, 就需要一些谨慎处理. [Floyd98] 对此作了说明.