ICMP Path MTU Discover
一般做网络,是否有人觉得有时候为什么网速牛慢,明明2Mbps或者10Mbps的链路却只有1-10KByte的传输速度,这个问题也曾经困扰我很久,但有一天我无聊中翻阅CISCO文档时才忽然醒悟,明白其中的原因。具体见下
首先我们知道各种网络链路介质对在自身上跑的数据帧长度是有要求的,比如说以太网默认帧长就是1500Byte,这个值我们称为MTU(最大传输单元)。
其次TCP与UDP的不同之处除了三次握手建立连接以外还有一个就是窗口机制,也就是说在传输数据的时候会尽量发送最大的分段包,当然这在三次握手之前双方会通告自己的MSS(最大传输段),注意:只有TCP的payload才有MSS。而MSS一般是通过比较outgoing端口的MTU以及自身Buffer,取最小的值然后再减去IP包头以及TCP包头长度而来的,比如说以太网默认MTU是1500Byte,则一个跑在以太网上的IP包MSS的payload为1500Byte-20Byte(IP包头长度)-20Byte(TCP头长度)=1460Byte。当然在分段并不是越大越好。
下面来举一个实例网络结构如下
Source PC-----RouterA------RouterB------RouterC-----Destination PC
在这个网络结构下所有的链路都是以太网,所有PC上路跑系统都是WIN2000,所有Router上本来默认以太网的MTU为1500,但某一个网管在配置时将RouterB接口上的MTU改成了1400,Win2000默认以太网的MTU为1500,我们在RouterA,B、C上做了访问列表禁止所有类型的ICMP包Outbound。
在了解上面一些基本条件之后,如果SourcePC是一台FTP客户端,而DestinationPC是一台FTP服务器,我们知道FTP协议使用TCP为传输层协议,port模式端口号为20、21。20端口是信令端口,主要是客户端与服务器之间传输一些get,ls,disconnect等信令的。如果A用户现在SourcePC上使用系统自带的工具登陆FTP服务器DestinationPC,因为FTP建立连接,身份验证等过程全部是由20端口来完成,且我们在链路上禁止了所有ICMP消息,这结果将会很有趣,当A用使用get files名请求从FTP服务器上下载文件时,DestinationPC接收到该信令后会发送一个IP包头DF字段为1的包,包payload为MSS值即1460Byte,当数据通过第一台路由器即RouterC时C发现数据包大小为1500Byte并没有超过以太网的MTU值,所以RouterC并额外处理该包,而是直接使用ProxyARP重新封装该包,然后转发给RouterB。而当RouterB收到RouterC发传的这个包时会发现包大小超过了MTU的值,然后路由器会检查IP包头DF的值,又发现DF=1,即不分片,这时因为数据包长度超过路由器接口MTU的值且不能分片路由器即会丢弃该包,然后回复一个ICMP Path MTU Discover的ICMP消息。可是我们在所有路由器上做了Deny ICMP ALL的操作,这时该消息会被RouterC丢弃,所以DestinationPC并未收到ICMP Path MTU Discover这条消息,所以它会认为FTP客户端即源地址主机窗口能够接受该大小的段,所以继续以这个长度发包,所以结果会导致SourcePC只能收到小于
未完待续....