5. Host Processing of Old-Style Messages (主机处理旧式消息)
5. Host Processing of Old-Style Messages (主机处理旧式消息)
在本节中, 我们概述了主机在收到来自未修改路由器 (即下一跳MTU字段为零的路由器) 的"数据报过大"消息时可以遵循的几种可能策略. 本节不是协议规范的一部分.
主机响应此类消息最简单的做法是假设 PMTU 为其当前估计 PMTU 与576中的较小值, 并停止在该路径上发送的数据报中设置 DF 位. 这样, 主机回退到与当前实践相同的 PMTU (参见"互联网主机需求 -- 通信层" [1] 第3.3.3节). 这种策略的优点是能快速终止, 且不比现有实践更差. 然而, 它在某些情况下无法避免分片, 在其他情况下也无法最有效地利用互联网络.
更复杂的策略涉及通过在保持设置 DF 位的同时改变数据报大小来"搜索"准确的 PMTU 估计值. 好的搜索策略是在不导致大量数据包丢失的情况下获得准确的路径MTU估计值.
几种可能的策略将算法函数应用于先前的 PMTU 估计值以生成新的估计值. 例如, 可以将旧估计值乘以一个常数 (比如0.75). 我们不推荐这种方法; 它要么收敛太慢, 要么大幅低估真实的 PMTU.
更复杂的方法是对数据包大小进行二分搜索. 这种方法收敛速度稍快, 尽管从 FDDI MTU 收敛到以太网 MTU 仍需要4或5个步骤. 一个严重的缺点是, 为了识别数据报何时到达另一端 (表明当前估计值过低), 需要复杂的实现. 我们也不推荐这种策略.
一种看起来效果相当好的策略基于以下观察: 在实践中, 互联网中使用的 MTU 值相对较少. 因此, 与其盲目搜索任意选择的值, 不如只搜索可能出现的值. 此外, 由于设计者倾向于以相似的方式选择 MTU, 可以将相似的 MTU 值分组, 并使用组中最低的值作为搜索"平台" (plateau). (将 MTU 低估几个百分点显然比高估一个字节要好.)
在第7节中, 我们描述了如何得出一个代表性 MTU 平台表, 用于 PMTU 估计. 使用该表, 在最坏情况下收敛效果与二分搜索一样好, 在常见情况下效果要好得多 (例如, 从 FDDI MTU 到以太网 MTU 只需两个往返时间). 由于平台值接近2的幂次方, 如果某个 MTU 未在此表中表示, 该算法对其的低估不会超过2倍.
任何搜索策略都必须对先前的估计值有一定的"记忆", 以便选择下一个估计值. 一种方法是使用当前缓存的路径MTU估计值, 但实际上"数据报过大"消息本身中有更好的信息可用. 所有 ICMP 目的不可达消息 (包括此类消息) 都包含原始数据报的 IP 头部, 其中包含无法在不分片情况下转发的数据报的总长度 (Total Length). 由于该总长度可能小于当前 PMTU 估计值, 但仍大于实际 PMTU, 它可能是选择下一个 PMTU 估计值方法的良好输入.
注意: 基于4.2BSD Unix 派生实现的路由器会为原始 IP 数据报的总长度发送不正确的值. 这些路由器发送的值是原始总长度与原始头部长度 (以字节表示) 之和. 由于接收此类"数据报过大"消息的主机无法知道它是否由这些路由器之一发送, 主机必须保守地假设它是. 如果返回的总长度字段不小于当前 PMTU 估计值, 则必须将其减去返回的头部长度字段值的4倍.
因此, 我们推荐的策略是: 使用小于返回的总长度字段 (必要时根据上述注意事项进行修正) 的最大平台值作为下一个 PMTU 估计值.