先来两张Windows ping命令的测试图
MTU是1500,然后电脑一般是1492就可以了,那么为什么这里1464才可以发?为什么要设置成1492?
先说1464的来源
- 1464(数据) + 8Byte(ICMP首部长度)+20Byte(IP数据报长度) = 1492
- ICMP是在网络层,但是ICMP协议不能单独工作,所以,想要传输ICMP数据,需要经过IP协议进行包装才可以。那么就需要在IP数据报的数据部分放上完整的ICMP协议数据报(ICMP首部8Byte+要传送的数据n个Byte),这样就是1492的由来,因此,1492是足够的。
1492就够了,那为什么游戏会给我设置成1480?这个稍后说。
MTU是1500,为什么我电脑是1492?
这就要说到我们现在的上网方式了,目前国内的家庭宽带上网方式都是PPPoE拨号上网。
电脑->路由器->光猫->互联网
PPPoE协议介于以太网和IP之间,协议分为两部分,PPP( Point to Point Protocol )和oE( over Ethernet ),也就是以太网上的PPP协议,而PPPoE协议头信息为:
| VER(4bit) | TYPE(4bit) | CODE(8bit) | SESSION-ID(16bit) | LENGTH(16bit) |这里总共是48bit,也就是6Byte,那么另外2Byte是什么呢?答案是PPP协议的ID号,占用2Byte,所以在PPPoE环境下,最佳MTU值应该是:1500 - 4 - 2 = 1492。
前几天在v站正好看到了关于PPPoE的讨论,当时看不懂大家在讲什么,现在再读相关的讨论,已经能够明白一些了。
总之,1492少的8个字节消耗来源于我们PPPoE拨号上网方式。当然,也有使用IPoE的,我们的IPTV机顶盒就是以这样的方式做认证。关于详细的IPoE认证方式,可以参考[这里个回答](IPOE到底是什么? - 阿布的回答 - 知乎 https://www.zhihu.com/question/35749997/answer/113810442)。
回到前边的问题,1492都已经够了,为什么要用1480,就像参考链接1里面说的那样,避免二次拨号带来的又一次PPPoE的封装,第一眼我是认可这个说法的,但是当我写这篇博客的时候,思考了一下,二次拨号的是在另一个设备上进行的,这两边的设备在网络层都是对等的,并不会互相影响。后来看到了另一个回答,了解到原因。
这里按照最坏情况,也就是DATA最小情况下,传输802.3 SNAP帧需要8个字节,如果再使用VLAN技术,需要传输802.1Q (VLAN)帧占用4个字节。
1500= 802.3 SNAP + 802.1Q + PPPoE + PPP +IP
这种情况下可以得到IP的最大长度为:
1500-8-4-5-3 = 1480
当客户端把MTU设置成1480时,它发出去的IP报就是1480,留给IP报的DATA区域只有1480-20(首部)=1460字节。如果传输层使用的协议是TCP,那么MSS只有1460-20=1440字节。当然这是在使用802.3 SNAP和802.1Q情况下的最大MSS。
MSS(Maxium Segment Size):MSS 是 TCP 数据段每次能够传输的最大数据分段的长度。
如果只使用PPPoE话,MSS应为:
1500 - 5(PPPoE) - 3(PPP) - 20(IP首部) - 20(TCP首部) = 1452字节
如果去掉PPPoE,MSS应为:
1500 - 20(IP首部) - 20(TCP首部) = 1460字节。
如果我默认的MTU大了怎么办?
- 如果传输层使用的是TCP协议,MTU大一点其实无所谓,为了达到最佳的传输效能,TCP 协议在建立连接的时候通常要协商双方的 MSS 值,MTU其他内容占据容量,双方协商把MSS调小点,这样就不需要拆包,用户是无感知的。
- 如果传输层使用的是UDP协议,是面向无连接的,MTU过大,只能进行拆包才能传输。但一些游戏对实时性要求较高,拆包会带来额外的性能消耗,如果路由器性能较差,用户感知会较为明显,那么游戏自己调整MTU为1480就显得合理了些。
上图中DATA区域前边的14字节是什么?
是以太网MAC帧头,对应的还有帧尾的4字节。
如何查看Windows本机MTU:
netsh interface ipv4 show subinterfaces |
参考链接:
家用路由器,默认MTU为什么是1480?(胖哥yyds
How can I determine the MTU size of WAN interfaces to optimize throughput?
免责声明
漏洞百出,欢迎指正。