6.2 Storing PMTU Information (存储PMTU信息)
6.2 Storing PMTU Information (存储PMTU信息)
通常, IP 层应将其学到的每个 PMTU 值与特定路径相关联. 路径由源地址、目的地址和 IP 服务类型 (type-of-service) 标识. (某些实现不记录路径的源地址; 对于只有一个可能源地址的单宿主主机, 这是可以接受的.)
注意: 某些路径可能通过不同的安全分类进一步区分. 此类分类的详细信息超出了本备忘录的范围.
存储此关联的明显位置是路由表条目中的一个字段. 主机不会为每个可能的目的地都有路由, 但它应该能够为每个活跃目的地缓存一条每主机路由 (per-host route). (处理 ICMP 重定向消息的需求已经施加了这一要求.)
当向没有每主机路由的主机发送第一个数据包时, 路由从每网络路由集合或默认路由集合中选择. 这些路由条目中的 PMTU 字段应初始化为关联第一跳数据链路的 MTU, 且绝不能被 PMTU 发现过程更改. (PMTU 发现只创建或更改每主机路由的条目.) 在收到"数据报过大"消息之前, 与初始选择路由关联的 PMTU 被假定为准确的.
当收到"数据报过大"消息时, ICMP 层确定路径MTU的新估计值 (来自数据包中非零的下一跳MTU值, 或使用第5节中描述的方法). 如果该路径的每主机路由不存在, 则创建一条 (几乎就像正在处理每主机 ICMP 重定向一样; 新路由使用与当前路由相同的第一跳路由器). 如果与每主机路由关联的 PMTU 估计值高于新估计值, 则更改路由条目中的值.
必须通知分组化层关于 PMTU 的减小. 任何正在主动使用该路径的分组化层实例 (例如, TCP 连接) 都必须在 PMTU 估计值减小时收到通知.
注意: 即使"数据报过大"消息包含引用 UDP 数据包的原始数据报头部, 如果任何 TCP 连接使用给定路径, TCP 层也必须收到通知.
此外, 发送引发"数据报过大"消息的数据报的实例应被通知其数据报已被丢弃, 即使 PMTU 估计值没有改变, 以便它可以重传被丢弃的数据报.
注意: 通知机制可以类似于用于提供 ICMP 源抑制 (Source Quench) 消息通知的机制. 在某些实现 (如4.2BSD派生系统) 中, 现有的通知机制无法识别涉及的特定连接, 因此需要额外的机制.
或者, 实现可以通过将通知推迟到下次尝试发送大于 PMTU 估计值的数据报时, 来避免使用异步通知机制处理 PMTU 减小. 在这种方法中, 当尝试发送设置了 DF 位且大于 PMTU 估计值的数据报时, SEND 函数应失败并返回适当的错误指示. 这种方法可能更适合无连接的分组化层 (例如使用 UDP 的层), 在某些实现中, 从 ICMP 层"通知"这类层可能比较困难. 在这种情况下, 正常的基于超时的重传机制将用于从被丢弃的数据报中恢复.
重要的是要理解, 通知使用该路径的分组化层实例关于 PMTU 变化, 与通知特定实例某个数据包已被丢弃是不同的. 后者应尽快完成 (即从分组化层实例的角度来看是异步的), 而前者可以推迟到分组化层实例想要创建数据包时. 重传应仅针对已知被丢弃的数据包进行, 如"数据报过大"消息所指示的那样.