TCP的路径MTU发现问题( 二 )


这种情况几乎总是由于网络的应该被更正的配置错误造成 。然而似乎在路径上某些TCP
实现互操作失败而未影响到其它TCP实现(也就是那些没有PMTUD的),这是不合适的 。这
使得市场不愿将TCP实现配置为PMTUD使能 。
相关RFC
RFC1191描述路径MTU发现 。RFC1435提供了早期这类问题的描述 。
阐述问题的输出文件
用tcpdump[Jacobson89]在一个中间主机上记录的结果:
20:12:11.951321A>B:S1748427200:1748427200(0)
win49152
20:12:11.951829B>A:S1001927984:1001927984(0)
ack1748427201win16384
20:12:11.955230A>B:.ack1win49152(DF)
20:12:11.959099A>B:.1:1461(1460)ack1win49152(DF)
20:12:13.139074A>B:.1:1461(1460)ack1win49152(DF)
20:12:16.188685A>B:.1:1461(1460)ack1win49152(DF)
20:12:22.290483A>B:.1:1461(1460)ack1win49152(DF)
20:12:34.491856A>B:.1:1461(1460)ack1win49152(DF)
20:12:58.896405A>B:.1:1461(1460)ack1win49152(DF)
20:13:47.703184A>B:.1:1461(1460)ack1win49152(DF)
20:14:52.780640A>B:.1:1461(1460)ack1win49152(DF)
20:15:57.856037A>B:.1:1461(1460)ack1win49152(DF)
20:17:02.932431A>B:.1:1461(1460)ack1win49152(DF)
20:18:08.009337A>B:.1:1461(1460)ack1win49152(DF)
20:19:13.090521A>B:.1:1461(1460)ack1win49152(DF)
20:20:18.168066A>B:.1:1461(1460)ack1win49152(DF)
20:21:23.242761A>B:R1461:1461(0)ack1win49152(DF)
短的SYN包因为包小通过网络没问题 。同样,用于诊断连通性问题的ICMP响应包也能
成功通过 。
大数据包通过网络时失败 。最终连接超时 。若应用是从少量数据的写开始,成功,再
开始大数据量写,失败,这种情形尤其令人迷惑 。
解释什么是正确处理的输出文件
用tcpdump[Jacobson89]在一个中间主机上记录的结果:
16:48:42.659115A>B:S271394446:271394446(0)
win8192(DF)
16:48:42.672279B>A:S2837734676:2837734676(0)
ack271394447win16384
16:48:42.676890A>B:.ack1win8760(DF)
16:48:42.870574A>B:.1:1461(1460)ack1win8760(DF)
16:48:42.871799A>B:.1461:2921(1460)ack1win8760(DF)
16:48:45.786814A>B:.1:1461(1460)ack1win8760(DF)
16:48:51.794676A>B:.1:1461(1460)ack1win8760(DF)
16:49:03.808912A>B:.1:537(536)ack1win8760
16:49:04.016476B>A:.ack537win16384
16:49:04.021245A>B:.537:1073(536)ack1win8760
16:49:04.021697A>B:.1073:1609(536)ack1win8760
16:49:04.120694B>A:.ack1609win16384
16:49:04.126142A>B:.1609:2145(536)ack1win8760
在这种情况下,发送者发现四个包发送失败(使用两个包的初始发送窗口),停掉了
PMTUD 。所有接着发送的包的DF标志都关闭,包大小设为缺省值536[RFC1122] 。
参考
这个问题在tcp实现的邮件列表中被广泛讨论;名字“黑洞”已使用多年 。
如何检测
这个问题表现为TCP连接挂起(无法继续)直到超时(这经常表现为连接已建立并开
始传输,然后在15分钟后最终终止而未发送任何字节) 。而象FTP这样的应用尤其令人讨
厌,开始传输小包的控制信息时非常好,但开始大块数据传输时就失败 。
一系列的ICMP响应包表明两端主机仍能传送包,一系列MTU大小的ICMP响应包会发现
有分片现象,而一系列MTU大小的带DF标志的ICMP响应包则失败 。对要诊断问题的网络工
程师来说这令人迷惑 。
有几个做PMTUD的traceroute的实现能解释这个问题 。
如何修改
TCP应该会注重到连接已超时 。在几次超时后,TCP应该试图发送小一点的包,也可以
把每个包的DF标志关闭 。若这样成功,就应继续把这个连接的PMTUD关闭一段时间,直到
它再次检测试图确定路径是否已改变 。
注重,在Ipv6中没有DF位――它是永远隐含设置的 。在路由器中不答应分片,只在

推荐阅读