6.1.1 TCP 初始化
6.1.1 TCP 初始化
在 TCP 连接建立阶段, 源 TCP 和目标 TCP 交换它们使用 ECN 的意愿信息. 该协商阶段完成后, TCP 发送端在数据包的 IP 头部中设置 ECT codepoint, 以向网络指示该传输愿意且能够对此数据包参与 ECN. 这向路由器表明, 如果它们希望把这种方法作为拥塞通知方式, 就可以用 CE codepoint 标记该数据包. 如果 TCP 连接不希望对特定数据包使用 ECN 通知, 则发送 TCP 将 ECN codepoint 设置为 not-ECT, TCP 接收端忽略收到数据包中的 CE codepoint.
在此讨论中, 我们把发起连接的主机称为 host A, 把响应的主机称为 host B. 我们把同时设置 ECE 和 CWR 标志的 SYN packet 称为 "ECN-setup SYN packet", 把 ECE 和 CWR 标志中至少一个未设置的 SYN packet 称为 "non-ECN-setup SYN packet". 类似地, 我们把只设置 ECE 标志而未设置 CWR 标志的 SYN-ACK packet 称为 "ECN-setup SYN-ACK packet", 把 ECE 和 CWR 标志任何其他配置的 SYN-ACK packet 称为 "non-ECN-setup SYN-ACK packet".
在 TCP 连接能够使用 ECN 之前, host A 发送 ECN-setup SYN packet, host B 发送 ECN-setup SYN-ACK packet. 对 SYN packet 而言, 在 ECN-setup SYN packet 中同时设置 ECN-Echo 和 CWR 标志, 被定义为发送该 SYN packet 的 TCP 具备 ECN 能力的指示, 而不是拥塞指示或对拥塞的响应. 更精确地说, ECN-setup SYN packet 指示发送该 SYN packet 的 TCP 实现将作为发送端和接收端参与 ECN. 特别是, 作为接收端, 它会通过在出站 TCP acknowledgement (ACK) packet 中设置 ECE, 来响应 IP 头部中设置了 CE codepoint 的入站数据包. 作为发送端, 它会通过降低拥塞窗口并在适当时间设置 CWR, 来响应设置了 ECE 的入站数据包. ECN-setup SYN packet 并不承诺 TCP 发送端在其可能发送的任意或所有数据包中设置 ECT codepoint. 然而, 即使 TCP 发送端随后在此 TCP 连接中发送没有 ECE 和 CWR 标志的 SYN packet, 对入站且设置了 CE codepoint 的数据包作出适当响应的承诺仍然保持.
当 host B 发送 ECN-setup SYN-ACK packet 时, 它设置 ECE 标志但不设置 CWR 标志. ECN-setup SYN-ACK packet 被定义为发送该 SYN-ACK packet 的 TCP 具备 ECN 能力的指示. 与 SYN packet 一样, ECN-setup SYN-ACK packet 并不承诺 TCP 主机在发送的数据包中设置 ECT codepoint.
以下规则适用于在 TCP 连接内发送 ECN-setup packet, 其中 TCP 连接由 TCP 连接建立和终止的标准规则定义.
-
如果主机收到 ECN-setup SYN packet, 则它 MAY 发送 ECN-setup SYN-ACK packet. 否则, 它 MUST NOT 发送 ECN-setup SYN-ACK packet.
-
除非主机已经发送至少一个 ECN-setup SYN 或 ECN-setup SYN-ACK packet, 并且已经收到至少一个 ECN-setup SYN 或 ECN-setup SYN-ACK packet, 且没有发送任何 non-ECN-setup SYN 或 non-ECN-setup SYN-ACK packet, 否则该主机 MUST NOT 在数据包上设置 ECT. 如果主机已经收到至少一个 non-ECN-setup SYN 或 non-ECN-setup SYN-ACK packet, 则它 SHOULD NOT 在数据包上设置 ECT.
-
如果主机曾经在数据包上设置过 ECT codepoint, 则该主机 MUST 在连接中所有后续数据包上正确设置/清除 CWR TCP bit.
-
如果主机已经发送至少一个 ECN-setup SYN 或 ECN-setup SYN-ACK packet, 并且没有收到任何 non-ECN-setup SYN 或 non-ECN-setup SYN-ACK packet, 则当该主机收到 IP 头部中同时设置 ECT 和 CE codepoint 的 TCP packet 时, 该主机 MUST 按照 ECN-capable 连接的规定处理该数据包.
-
不愿意在 TCP 连接上使用 ECN 的主机 SHOULD 清除其发送的所有 non-ECN-setup SYN 和/或 SYN-ACK packet 中的 ECE 和 CWR 标志, 以指示这种不愿意. 接收端 MUST 正确处理所有形式的 non-ECN-setup SYN 和 SYN-ACK packet.
-
主机 MUST NOT 在 SYN 或 SYN-ACK packet 上设置 ECT.
TCP 客户端在收到 FIN-ACK 后进入 TIME-WAIT 状态, 并在超时后转换到 CLOSED 状态. 许多 TCP 实现在 TIME-WAIT 状态期间收到窗口内的 SYN packet 时会创建新的 TCP 连接. 当 TCP 主机进入 TIME-WAIT 或 CLOSED 状态时, 它 SHOULD 忘记关于该连接 ECN 协商的任何先前状态.