定义:
最大传输单元(Maximum Transmission Unit,MTU)是指链路层通信协议的上一层即IP层所能通过的最大数据包大小(以字节为单位)。
最大传输单元这个参数通常与通信接口有关,如以太网 MTU为1500 Byte,点对点为296 Byte。
如果IP层有一个数据包要传,而且数据包的长度比链路层的MTU还大,那么IP层就需要分片即数据包需要拆开来发送,每一片都小于MTU。
如何检测网关的MTU:
如:ping -f -l 1472 192.168.1.1
请注意,上面的参数是“-l”(小写的L),而不是“-1”。 1472 bytes是本机送出去的数据包大小,ip 192.168.1.1 是gateway的ip,使用-f 表示数据包不分片。
运行结果出现响应,就表示这个mtu是可行的。
ping -f -l 1473 192.168.1.1
运行结果出现无响应,提示 Packet needs to be fragmented but DF set, 表示数据包需要拆开来发送。
MTU值的计算
每个数据包都具有包头,这个包头部分占去28个字节,所以最终的mtu数值其实是:1472+28=1500 Byte
分析:两次ping ,指定1472 字节可以通过,1473 就不能通过,说明实际的最大mtu值为1472+28=1500 Byte,此时可以达到最优的网络传输。
为什么加28字节?
ping命令的工作原理是:向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将把报文一模一样地传回给发送者。
ICMP数据报文的数据发送前需要两级封装:首先添加ICMP报头形成ICMP报文,再添加IP报头形成IP数据报。如下图所示:
IP报头(20字节) |
ICMP报头(8字节) |
ICMP数据报 |
文章参考:
《TCP/IP详解卷一:协议 》(美)W.Richard Stevens 著 机械工业出版社 21页
http://baike.baidu.com/view/26974.htm?fr=ala0_1_1
http://www.ibm.com/developerworks/cn/linux/network/ping/(用C语言实现Ping程序功能)