6.4 TCP Layer Actions (TCP层操作)
6.4 TCP Layer Actions (TCP层操作)
TCP 层必须跟踪连接目的地的 PMTU; 它不应发送大于此值的数据报. 简单的实现可以在每次创建新报文段时向 IP 层查询此值 (使用 [1] 中描述的 GET_MAXSIZES 接口), 但这可能效率低下. 此外, 遵循"慢启动" (slow-start) 拥塞避免算法 [4] 的 TCP 实现通常会计算并缓存从 PMTU 派生的几个其他值. 当 PMTU 变化时接收异步通知可能更简单, 这样这些变量就可以被更新.
TCP 实现还必须存储从其对端收到的 MSS 值 (默认为536), 并且无论 PMTU 如何, 都不发送大于此 MSS 的任何报文段. 在4.xBSD派生实现中, 这需要在 TCP 状态记录中添加额外字段.
最后, 当收到"数据报过大"消息时, 这意味着发送 ICMP 消息的路由器丢弃了一个数据报. 将此视为任何其他被丢弃的报文段并等待重传计时器到期以触发报文段重传就足够了. 如果 PMTU 发现过程需要几个步骤来估计正确的 PMTU, 这可能会使连接延迟许多往返时间.
或者, 重传可以立即响应路径MTU已更改的通知, 但仅针对"数据报过大"消息指定的特定连接. 重传中使用的数据报大小当然不应大于新的 PMTU.
注意: 不得 (MUST not) 响应每条"数据报过大"消息进行重传, 因为一批几个超大报文段会产生几条此类消息, 从而导致相同数据的多次重传. 如果新估计的 PMTU 仍然错误, 该过程重复, 发送的多余报文段数量呈指数增长!
这意味着 TCP 层必须能够识别"数据报过大"通知何时实际上减小了它已用于在给定连接上发送数据报的 PMTU, 并应忽略任何其他通知.
现代 TCP 实现采用"拥塞避免" (congestion avoidance) 和"慢启动" (slow-start) 算法来提高性能 [4]. 与由 TCP 重传超时引起的重传不同, 由"数据报过大"消息引起的重传不应改变拥塞窗口. 但是, 它应该触发慢启动机制 (即, 在确认开始再次到达之前只应重传一个报文段).
如果发送方的最大窗口大小不是所用报文段大小的精确倍数, TCP 性能可能会降低 (这不是拥塞窗口大小, 拥塞窗口始终是报文段大小的倍数). 在许多系统 (如4.2BSD派生系统) 中, 报文段大小通常设置为1024字节, 最大窗口大小 ("发送空间") 通常是1024字节的倍数, 因此默认情况下保持正确的关系. 但是, 如果使用 PMTU 发现, 报文段大小可能不是发送空间的因数, 并且可能在连接期间发生变化; 这意味着当 PMTU 发现更改 PMTU 值时, TCP 层可能需要更改传输窗口大小. 最大窗口大小应设置为报文段大小 (PMTU - 40) 的最大倍数, 且该倍数不超过发送方的缓冲区空间大小.
PMTU 发现不影响 TCP MSS 选项中发送的值, 因为该值由连接的另一端使用, 而另一端可能使用不相关的 PMTU 值.