关于MOBA类游戏设置MTU=1480会更流畅的分析

先来两张Windows ping命令的测试图

image-20220701190414785

image-20220701192005839

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。

IPOE到底是什么? - celeron533的回答 - 知乎

前几天在v站正好看到了关于PPPoE的讨论,当时看不懂大家在讲什么,现在再读相关的讨论,已经能够明白一些了。

总之,1492少的8个字节消耗来源于我们PPPoE拨号上网方式。当然,也有使用IPoE的,我们的IPTV机顶盒就是以这样的方式做认证。关于详细的IPoE认证方式,可以参考[这里个回答](IPOE到底是什么? - 阿布的回答 - 知乎 https://www.zhihu.com/question/35749997/answer/113810442)。

回到前边的问题,1492都已经够了,为什么要用1480,就像参考链接1里面说的那样,避免二次拨号带来的又一次PPPoE的封装,第一眼我是认可这个说法的,但是当我写这篇博客的时候,思考了一下,二次拨号的是在另一个设备上进行的,这两边的设备在网络层都是对等的,并不会互相影响。后来看到了另一个回答,了解到原因。

preview

这里按照最坏情况,也就是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 MediaSenseState 输入字节 输出字节 接口
---------- --------------- ------------ ------------ -------------
4294967295 1 0 70828 Loopback Pseudo-Interface 1
1500 1 100944164906 10651419008 WLAN
1500 5 0 0 以太网
1500 5 0 0 本地连接* 1
1500 5 0 0 本地连接* 10
1500 5 0 0 蓝牙网络连接
1500 1 14432 495454 VMware Network Adapter VMnet1
1500 1 14432 495510 VMware Network Adapter VMnet8
1500 1 0 1253550 vEthernet (Default Switch)
2800 1 0 831391 ZeroTier One [xxxxxxxxxxxxxxxx]
2800 1 878741 61770711 ZeroTier One [xxxxxxxxxxxxxxxx]

参考链接:

什么是MTU?为什么MTU值普遍都是1500?

为什么MOBA、“吃鸡”游戏不推荐用tcp协议——实测数据

Windows 上最大传输单元 MTU 值的查看和设置

windows10系统下设置mtu值的方法

家用路由器,默认MTU为什么是1480?(胖哥yyds

How can I determine the MTU size of WAN interfaces to optimize throughput?

我想问下win11调mtu为啥不能调到1500以上?nas万兆

最大传输单元 - 维基百科

TCP最大报文段长度MSS

免责声明

漏洞百出,欢迎指正。