mtu、mss、mss钳制等概念

wangchunlin 2022-10-17 166 10/17

1、mtu和mss钳制基本概念

mtu这是数据链路层的概念,意味着链路层负荷payload的大小,包含上层协议头。例如设置主机接口mtu为1450。则在一个TCP报文中,1450 = 20字节IP头 + 20字节TCP头 + 1410TCP数据。

icmp ping协议头为8,所以1450 = 20 + 8 + 1422

mss是tcp头中的一个选项,意思是最大报文段(不包括tcp头大小,应该也不包括ip头),协商通信时(应该是tcp握手时)就定下来的。

mss钳制意思是修改mss值适配mtu(这个参数我在博客上找到释义,网上太少了,一般在nat时都要开,op系统是这样)。举例说明:pppoe是1492,1492(= 1500 - 2(PPP)- 6(PPPoE)),客户端(windows和op和ubuntu都是),发起请求最大为1472(我理解为减去icmp的28,去清楚mss在协商时的依据,这里是最大),而pppoe最大允许1492-28=1464,在有了mss钳制以后,客户端发起请求的mss如果大于1464就会被置为1464。

1500的由来:

由于以太网传输电气方面的限制,每个以太网帧最小64字节,最大不能超过1518字节,对于小于或者大于这个限制的以太网帧,以太网都可以视之为错误的数据帧。一般的以太网转发设备会丢弃这些数据帧。(注:小于64字节的数据帧一般是由于以太网冲突产生的“碎片”或者线路干扰或者坏的以太网接口产生的,对于大于1518字节的数据帧我们一般把它叫做Giant帧,这种一般是由于线路干扰或者坏的以太网口产生)。

由于以太网EthernetII最大的数据帧是1518字节,除去以太网帧的帧头(DMAC目的MAC地址48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14字节和帧尾CRC校验部分4字节(这个部分有时人们也把它叫做FCS),那么剩下承载上层协议的地方也就是Data域最大就只能有1500字节,这个值就称之为MTU。

2、探测最大支持mtu

注意:该值不包括20ip头和8icmp头

linux:

ping x.x.x.x -s 1422 -M do
ping大包不允许分片

windows:

ping x.x.x.x -l 1472 -f

3、一些重要逻辑

大部分出自于:(3条消息) 【网络】MTU相关网络丢包问题分析处理_HunterMichaelG的博客-CSDN博客_mtu 丢包

这一篇更加详尽:(3条消息) 两个主机mtu不相同_MTU 和 MSS 的学习与梳理_刘克华的博客-CSDN博客

(3条消息) MTU、IP MTU 和 MSS 参数详解_ScilogyHunter的博客-CSDN博客

(3条消息) 物理层(网线)、数据链路层(交换机)、网络层(IP协议、ARP协议、ICMP协议、路由器)、VLAN(虚拟局域网)、HSRP协议、ACL、NAT_我是大肥鼠的博客-CSDN博客

mtu不匹配的结果:

握手时,就会协商一个mss值,并且如果包太大就会分包后再过,但是影响性能。如果设置了df不让分包,则:

mtu、mss、mss钳制等概念

tcp包中含有一个df位,如果网卡收到的包比自己的mtu大,且df位不为1,就分包(分包是在发出的时候分),如果df为1,tcp协议中含有pmtu,此时就会返回一个icmp报文,里面携带错误信息和可接受包大小,及mss值(现在tcp协议实现了pmtu,其他协议未知)

实际上,TCP协议已经实现了链路MTU的探测,叫做PMTU,原理就是设置IP报头DF不分片位置为不分片,这样当遇到比MSS小的MTU的设备,这个设备就会返回一个ICMP报文,里面携带了错误消息和可接受的MTU大小。

mss钳制的操作:

iptables -t mangle -A FORWARD -o eth0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

我是这样理解的,不对再来改,就是两端建立三次握手的报文到达vpn网关时,修改MSS值,使MSS自适应PMTU(Path MTU),保证能通过,不过这种释义好像略有冲突。

openwrt开启钳制的情况,应该就是上面的代码(mangle表,forward链):

mtu、mss、mss钳制等概念
- THE END -

wangchunlin

10月17日22:06

最后修改:2022年10月17日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论