MTU 理解和遇到的一些问题

来源:互联网 发布:js返回并重载页面 编辑:程序博客网 时间:2024/05/18 03:28

  前几天遇到问题:系统在出现通信时会出现问题,发送端不会报错。但接收端却没有任何反应。

MTU详解:

  最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据报大小(以字节为单位)。最大传输单元这个参数通常与通信接口有关(网络接口卡、串口等)。

  因特网协议允许IP分片,这样就可以将数据报分成足够小的片段以通过那些最大传输单元小于该数据报原始大小的链路了。这一分片过程发生在IP层(OSI模型的第三层,即网络层),它使用的是将分组发送到链路上的网络接口的最大传输单元的值。原始分组的分片都被加上了标记,这样目的主机的IP层就能将分组重组成原始的数据报了。

  在因特网协议中,一条因特网传输路径的“路径最大传输单元”被定义为从源地址到目的地址所经过“路径”上的所有IP跳的最大传输单元的最小值。或者从另外一个角度来看,就是无需进一步分片就能穿过这条“路径”的最大传输单元的最大值。

RFC 1191描述了“路径最大传输单元发现方法”,这是一种确定两个IP主机之间路径最大传输单元的技术,其目的是为了避免IP分片。在这项技术中,源地址将数据报的DF(Don't Fragment,不要分片)位置位,再逐渐增大发送的数据报的大小——路径上任何需要将分组进行分片的设备都会将这种数据报丢弃并返回一个“数据报过大”的ICMP响应到源地址——这样,源主机就“学习”到了不用进行分片就能通过这条路径的最大的最大传输单元了。

  不幸的是,越来越多的网络封杀了ICMP的传输(譬如说为了防范DDOS攻击)——这使得路径最大传输单元发现方法不能正常工作,其常见表现就是一个连接在低数据流量的情况下可以正常工作,但一旦有大量数据同时发送,就会立即挂起(例如在使用IRC的时候,客户会发现在发送了一个禁止IP欺骗的ping之后就得不到任何响应了,这是因为该连接被大量的欢迎消息堵塞了)。而且,在一个使用因特网协议的网络中,从源地址到目的地址的“路径”常常会为了响应各种各样的事件(负载均衡、拥塞、断电等等)而被动态地修改——这可能导致路径最大传输单元在传输过程中发生改变——有时甚至是反复的改变。其结果是,在主机寻找新的可以安全工作的最大传输单元的同时,更多的分组被丢失掉了。

  对于时下大多数使用以太网的局域网来说,最大传输单元的值是1500字节。但是像PPPoE这样的系统会减小这个数值,这就使得在使用最大传输单元发现方法时可能会产生这样的结果:一些处于配置不当的防火墙之后的站点变得不可达了。对于这种情况,还是可能找到变通的方法的,但这取决于你控制的是网络的哪一部分。这些方法包括改变用来在防火墙一端建立TCP连接的第一个分组的MSS(Maximum Segment Size,最大分段大小)。

 

分清楚分片和分段的区别?
    分片是IP层的概念。检查IP分片的标志是检查IP层头部的Flag字段里的df bit和more fragment位。检查是否分片和有否后续的分片报文。
同时在IP层包头的最后有个字段为ip fragments会详细写明分片的帧数及长度。(由此可以判断我们发送出去没有进行IP分片)
    分段是TCP层的概念。此时将会用到MSS。在本例中,我们选用1460做为MSS。根据协商的结果动态产生。现象就是在每个(除第一个)SMTP
消息的Body报文中,都会看到每一个的TCP净载数据大小为1460。通过发给对方的第一个TCP的SYN报文里的option字段会携带MMS字段通知对方自己所使用的MSS。而对方会在对SYN的回应中返回自己的MMS字段。这样,双方协商成功。发送方根据收到的ACK里含有的对方MMS大小与本机比较选取较小值进行MMS进行分段。
    由于此时我们的MSS小于接口的MTU。所以我们选用1460做为TCP负载的分片大小。加上20字节的IP包头和20字节的TCP头部。总共为1500 字节。如果此时,超过接口MTU 1500的话,仍然将进行分片。但此时没超。刚好等于。所以我们没有进行分片。

 

  最后结果应该是我们系统是处理网络报文的,修改过协议栈,所以会对某些报文不做处理或者没有了TCP层上的控制功能,不能主动协商MTU造成的。


 

定位时参考的别人故障:

1.

http://blog.chinaunix.net/space.php?uid=17320666&do=blog&cuid=2037421

MTU引起的网络故障,网络架构如下:

VPN客户端使用win2003的RRAS做为VPN拔号客户端,进行远程拔号连接,Client网络中,USER通过RRAS路由,与VPN Server进行数据传输,Web浏览与Mail,FTP下载都很正常,两边网络(VPN Client与VPN Server)中都有路由器与防火墙;

现在,需要在VPN Client端的网络中,安装一台FTP Server,从VPN Server端上传数据,但总是不成功,传输文件很小时如4KB以下时成功,但稍微大点都显示不成功,当传输到几KB之后就会出现TIME OUT错误提示;

故障排除步骤:

一:Mail,FTP下载,WEB浏览等一切正常,证明网络连接与设备一切正常;

二:当在WIN2003上安装好FTP Server做测试时,发现FTP上传正常,但USER在网络中通过RRAS再路由时,上传就失败;

三:当Ping远程VPN Server时,MTU数据包大小只能为1370,当大于此值时就会Fragment,如ping -f -l 1400 192.168.5.1,就会出现Packet needs to be fragmented but DF set,这与两端防火墙的MTU设置和ISP允许的最大值有关,而Win2003与XP默认的MTU值大小为1500,所以,更改win2003上默认的MTU值大小为网络允许的最大值之后,FTP上传正常。

在Windows系统中修改MTU步骤:

一:运行regedit.exe,

二:找到以下路径:[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\在Interfaces下面会列出系统所有的网卡;

三:找到物理上正在工作的网卡,查看IP地址等值来确定需要更改的网卡,然后在选择的网卡下面,新建dword值,命名为:MTU,双击输入十进制值;

四:重启;

在Linux系统中修MTU步骤:直接运行 ifconfig 修改MTU,如:ifconfig eth0 mtu 1370;

 

2.

部分网络可以访问,部分无法访问,使用omnipeek监测网络状况,发现数据包都很小(594),检查mtu值的设置,发现很小(貌似病毒引起),修改mtu后一切正常

如何修改本机的MTU? 修改方法如下: (1)、运行regedit (2)、浏览到: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces 如图2 (3)、Interfaces下有多个子项,每个子项对应一个网卡。请按如下方法选择网卡: (a)确定本机用来连接Internet的网卡或拨号连接的IP,如192.168.0.19; (b)用鼠标点击Interfaces上的子项,查看键值列表中的IPAddress项; (c)如果IPAddress的键值与(a)中的IP相同,即192.168.0.19,则该子项就是要找的网卡。 (4)、进入该子项,在右边的窗口里按鼠标右键,选择“新建”->“双字节值”,输入名称“MTU”,按回车。再用鼠标双击“MTU”,弹出修改窗口: 如图3: 填入MTU的值。填写前请先把基数设为十进制。 设置好后,需要重启机器才能生效。

0 0
原创粉丝点击