关于MTU的合理解释
关于MTU的合理解释
dave的笔记文档:长期涉及底层网络数据的捕获,时常遇到切片数据包,所以有了这篇blog。
Maximum Transmission Unit,缩写MTU,中文名是:最大传输单元。 MTU限制的是数据链路层的payload,也就是上层协议的大小,例如IP,ICMP等。
先放结论
1518这个值是考虑到传输效率以及传输时间而折中选择的一个值,并且由于目前网络链路中的节点
太多,其中某个节点的MTU值如果和别的节点不一样,就很容易带来拆包重组的问题,甚至会导致无
法发送。
其实一个标准的以太网数据帧大小是:1518,头信息有14字节,尾部校验和FCS占了4字节,所以真正留给上层协议传输数据的大小就是:1518 - 14 - 4 = 1500
一个IP数据包的大小是:65535 一个标准的以太网数据帧大小是:1518
MTU最小值被限制在64
为什么是64呢?
这个其实和以太网帧在半双工下的碰撞有关。
最早的以太网工作方式:载波多路复用/冲突检测(CSMA/CD),因为网络是共享的,即任何一个节点
发送数据之前,先要侦听线路上是否有数据在传输,如果有,需要等待,如果线路可用,才可以发送。
假设A发出第一个bit位,到达B,而B也正在传输第一个bit位,于是产生冲突,冲突信号得让A在完
成最后一个bit位之前到达A,这个一来一回的时间间隙slot time是57.6μs。
在10Mbps的网络中,在57.6μs的时间内,能够传输576个bit,所以要求以太网帧最小长度为
576个bits,==从而让最极端的碰撞都能够被检测到==。这个576bit换算一下就是72个字节,
去掉8个字节的前导符和帧开始符,所以以太网帧的最小长度为64字节。
OSI中的层 | 功能 | TCP/IP协议族 |
---|---|---|
应用层 | 文件传输,电子邮件,文件服务,虚拟终端 | TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet |
表示层 | 数据格式化,代码转换,数据加密 | 没有协议 |
会话层 | 解除或建立与别的接点的联系 | 没有协议 |
传输层 | 提供端对端的接口 | TCP,UDP |
网络层 | 为数据包选择路由 | IP,ICMP,RIP,OSPF,BGP,IGMP |
数据链路层 | 传输有地址的帧以及错误检测功能 | SLIP,CSLIP,PPP,ARP,RARP,MTU |
物理层 | 以二进制数据形式在物理媒体上传输数据 | ISO2110,IEEE802,IEEE802.2 |
Windows 查看/设置 MTU
查看MTU
cmd命令提示符 ping -l 1472 -f www.baidu.com
请求将一个不允许分割的 1472 字节的数据包发送出去。
示例
C:\Windows\system32>ping -l 1472 -f www.baidu.com
正在 Ping www.a.shifen.com [39.156.66.18] 具有 1472 字节的数据:
来自 192.168.1.1 的回复: 需要拆分数据包但是设置 DF。
需要拆分数据包但是设置 DF。
需要拆分数据包但是设置 DF。
需要拆分数据包但是设置 DF。
39.156.66.18 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 1,丢失 = 3 (75% 丢失),
C:\Windows\system32>ping -l 1450 -f www.baidu.com
正在 Ping www.a.shifen.com [39.156.66.18] 具有 1450 字节的数据:
来自 39.156.66.18 的回复: 字节=1450 时间=43ms TTL=51
来自 39.156.66.18 的回复: 字节=1450 时间=44ms TTL=51
来自 39.156.66.18 的回复: 字节=1450 时间=44ms TTL=51
来自 39.156.66.18 的回复: 字节=1450 时间=43ms TTL=51
39.156.66.18 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 43ms,最长 = 44ms,平均 = 43ms
上述例子得到本机MTU介于1450-1472
设置MTU
-
查看网卡接口
cmd命令提示符
netsh interface ipv4 show subinterfaces
-
设置相应网卡接口的本地MTU值
-
cmd命令提示符(管理员)
-
在打开的运行窗口输入
netsh interface ipv4 set subinterface "需修改的连接名" mtu=值 store=persistent
再点确定。 其中,需修改的连接名和 值要用相应的值来代替。
例如,我这里需要输入:
netsh interface ipv4 set subinterface "WLAN" mtu=1492 store=persistent
-