最大传输单元MTU计算简介

最大传输单元MTU(Maximum Transmission Unit)是指一种通信协议的某一层上面所能通过的最大数据报大小,单位是字节。合理设置路由器和本机的MTU值,可以优化上网速度。

如果本机的MTU比网关的MTU大,大的数据包就会被拆开来传送,这样会产生很多数据包碎片,增加丢包率,降低网络速度。网站访问异常、发送带有附件的邮件失败这些都有可能和MTU的设置有关。

不同的网络接入方式MTU值不相同,一些典型的MTU值:

超通道    65535
16Mb/s信息令牌环(IBM)     17914
4Mb/s令牌环(IEEE802.5)      4464
FDDI     4352
EtherNet(以太网)    1500
PPPoE(ADSL) IEEE802.3/802.2 1492
Dial-up X.25 576
点对点(低时延)   296

两台主机之间的通信要通过多个网络,那么每个网络的链路层就可能有不同的MTU。重要的不是两台主机所在网络的MTU的值,而是两台通信主机路径中的最小MTU,它被称作路径MTU。

TCP/IP协议涉及到四层:链路层,网络层,传输层,应用层。

以太网(Ethernet)的数据帧在链路层,以太网的物理特性决定了数据帧的长度MTU(Maximum Transmission Unit)为1500;

IP包在网络层,IP包的首部占用20字节,MTU为1500-20=1480;

TCP或UDP包在传输层,UDP包的首部占用8字节,MTU为1480-8=1472;
TCP或UDP中的数据(Data)在应用层,Data最大长度为1472。

数据帧{IP包{TCP或UDP包{Data}}}

MTU对UDP编程很重要,当UDP包中的数据多于MTU(1472)时,发送方的IP层需要分片fragmentation进行传输,接收方IP层则需要进行数据包重组,由于UDP是不可靠的传输协议,如果分片丢失导致重组失败,将导致UDP数据包被丢弃。

在普通的局域网环境下,UDP的数据最大为1472字节最好(避免分片重组)。但在网络编程中,Internet中的路由器可能有设置成不同的值(小于默认值),Internet上的标准MTU值为576,所以Internet的UDP编程时数据长度最好在576-20-8=548字节以内。

测试路由最佳MTU值

cmd命令行ping -f -l 1472 192.168.0.1

其中192.168.0.1是网关IP地址,1500是数据包的长度,参数“-l”(小写的L)。

如果提示:Packets needs to be fragmented but DF set.则表明MTU小于1500,不断改小数值,直到能够Ping通。

ping程序使用ICMP报文,ICMP报文首部占8字节,IP数据报首部占20字节,因此在测试数据大小基础上加上28字节为MTU值,例如1464+28=1492。

设置本机MTU

开始运行中输入regedit,打开注册表编辑器,打开

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\
services\Tcpip\Parameters\Interfaces

找到Interfaces下含有本机网卡 IP的项,新建名为MTU的DWORD值,填入十进制 MTU 数值。

补充:windows命令行修改MTU值

netsh interface ipv4 set subinterface “连接的名称” mtu=新MTU值 store=persistent

如:netsh interface ipv4 set subinterface “本地连接 3” mtu=1500 store=persistent
//修改需要管理员权限,WIN 7修改MTU不用重启,多数机器默认1500,所以高于/低于1500就有可能影响P2P

netsh interface ipv4 show subinterfaces    //查看本机MTU值

linux:ping -c 1 -M do -s 1472 192.168.0.1 错误提示 Frag needed and DF set……

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注