可以用Ping命令来测试当前传输介质的MTU
Windows用法
ping -l 1464 -f 223.5.5.5
-l指定的是ping包的载荷大小,由于ping包头是28字节,所以载荷加上28就是真实MTU大小,-f指定不可拆分包。
Linux用法
ping -s 1464 -M do 223.5.5.5
使用-M do参数发送大包时是会自动提示MTU大小,不用再自己计算了
如果是IPv6则要减去48字节(IP头40字节,ICMPv6头8字节),如下MTU 1500的icmpv6载荷为1452字节。
ping -s 1452 -M do fe80::f8b3:a6ff:fece:7589
不同介质/线路下MTU的大小
– 以太网
默认都是1500,一般以太网卡也可以配置超大帧
– PPPOE拨号网络
可以是1492,也可以是1480,国内一般都是1492
– wireguard
wireguar的报头是固定40个字节,IPV4的报头是20字节,IPV6报头是40字节,PPPOE是8个字节,所以在IPv4网络下wireguard的MTU是1500-40-20-8=1432,在IPv6网络下是1500-40-40-8=1412
– IPSec
因为PSec是高度可配置的,不同的配置下MTU是不一样的,需要实际去测试
– udp2raw
官方没有说udp2raw的报头是多长的,只说MTU是13xx(等于没说),我用命令实测是88个字节的头部(即faketcp头部,应该也是变长的)所以PPPOE+Udp2raw+Wireguard的MTU就是1500-40-88-20-8=1344,如果是IPV6则是1324。
关于双方MtU不同的情况:
如果通信是一对一的,则两边设置相同的MTU即可,如果是面向多个端点的通信则需要需要设置为所有端点MTU最低的那个。设置MTU考虑的是对方及与对方通信线路的接收和传输能力。是取决于别人,面不是自己(一般自己都是1500)。
关于MSS钳制可以看这一篇:
这个网站列出了各个协义的头部长度:
https://baturin.org/tools/encapcalc/
参考:
https://zhuanlan.zhihu.com/p/532370376