MTU(Maximum Transmission Unit,最大传输单元)
MTU由TCP/IP协议栈中的IP协议定义,网络层的IP将MTU设置为1500字节。
简单点理解就是:IP规定每一个单独的数据包大小,在网络层时不能超过1500字节。
如果要将一个大于1500字节的数据包从一个接口传出去,在网络层,就会对这个数据包进行分割成若干份,每份都是1500字节。
比如:一个5000字节的数据包要传出去,则会分成四个数据包,前三个都是1500字节,最后一个是500字节。
关于一个数据包MTU的大小,并不是固定的,需要注意的是:
网络层外面还会加上数据链路层的封装,经过数据链路层封装之后,才是一个数据包最终的大小。要注意,MTU只是限制了一个数据包经过网络层的封装后,不要超过1500字节。
一个数据包最终是多少,是不能一概而论的,不同的数据链路层会在“网络层1500字节”的基础上加上不同的头部,比如:
以太网会在网络层的基础上加上14字节头部和4字节的FCS尾部,所以,一个以太网数据帧最终的大小是1518字节
当数据链路层为HDLC时,它会在网络层前面加上4字节的HDLC的头部和4字节的FCS校验,所以,一个HDLC链路的数据包是1508字节
当数据链路层为PPP时,它会在网络层前面加上4字节的PPP的头部和4字节的FCS校验,所以,一个PPP链路的数据包是1508字节
当链路两端的数据包MTU设置不一致时,影响大吗?
需要注意的是,MTU只会影响到数据发出方向,对收入的数据,是没有MTU限制的。
但是,我们建议将链路两端的MTU设置为一样大小的,因为网络通讯都是有来有回的,一个大与接口MTU的数据收进来,如果又要从这个接口返回去,则入向收到的是一个完整的包,而出向会对这个数据分片。
虽然不会影响通信,但这种双向数据结构不匹配的通讯模型并不是很合理。
以太网最小帧长为什么是64字节
以太网(IEEE 802.3)帧格式:
1、前导码:7字节0x55,一串1、0间隔,用于信号同步
2、帧起始定界符:1字节0xD5(10101011),表示一帧开始
3、DA(目的MAC):6字节
4、SA(源MAC):6字节
5、类型/长度:2字节,0~1500保留为长度域值,1536~65535保留为类型域值(0x0600~0xFFFF)
6、数据:46~1500字节
7、帧校验序列(FCS):4字节,使用CRC计算从目的MAC到数据域这部分内容而得到的校验和。
相关MTU问题整理
MTU设置不当,可能会导致许多网络问题,如某些网络应用无法使用,某些网站无法访问等。下面是在网上搜索整理的关于MTU设置的东西,某些可能未作验证,仅供参考。
1. 如何确定网络MTU
某些ISP接入的MTU可能会比常规使用的MTU小,这时如果设置了过大的MTU,就可能会导致很多服务无法使用的问题。可以通过ping程序确定MTU的值。
Windows可以打开命令提示符,使用 PING -l -f 的方式确定MTU
ping -l 1400 -f www.amd5.cn
如果能ping通,说明词MTU是可以的,可适当加大MTU值,直到最大;否则就要适当调小MTU值。设置最大的MTU值可以有效的提高网络吞吐量。
2. 常见MTU值
根据宽带连接方式的不同,MTU可能不尽相同,如下所示:
1)PPPoE/ADSL: 1360-1492
2) PPTP VPN: 1400-1460
3) L2TP VPN: 1400-1460
4) Fixed IP: 1400-1500
5) DHCP: 1400-1492
3. Windows 修改MTU
Windows直接连接的,可在注册表中修改MTU,具体方法为:
1)【开始】-【运行】-【regedit】打开注册表
2) 选择【HKEY_Local_Machine】-【SYSTEM】-【CurrentControlSet】-【Services】-【Tcpip】-【Parameters】-【interface】
3) 在 interface 底下可能有很多的选项,一个一个的去看,会有一个选项IPaddress与当前网卡的 IP 相同,然后在该选项上选择【编辑】-【新建】-【DWORD值】,建立一个名为【MTU】的DWORD,然后双击修改,选择十进制,填入合适 MTU 值
4. TCP MSS 与大包通信的关系
用户在使用路由器访问Internet时,经常会反馈不能访问网页(或部分网页)以及使用Outlook收发邮件(这些应用是基于TCP或UDP的),但进行Ping包时没有问题,这时候检查配置时也没有错误。出现这种情况的时候,多半是因为在设备上进行了NAT应用,同时设备对报文进行了分片操作。
IP报文里是有五元组的,但报文要进行分片时,只有第一片报文带有IP的五元组信息(源目的ip位址,源目的端口号,协议号),后续的分片不会保留TCP/UDP报文所有的标识信息,如端口号信息等,这种情况下,如果设备又实现了NAT转换操作(NAT转换过程中,会随机地做埠转换),并且应用又是基于TCP/UDP的,这就导致报文不能正确组包,会出现上述的问题现象。
TCP/IP连接时建立的过程中会协商很多参数的,其中TCP MSS参数就是用于协商TCP报文大小的,如果协商出来的TCP MSS的参数值小于设备的MTU的值时,TCP报文在设备上就不会被分片,否则就会出现报文分片并导致上述现象的发生,因此,为了避免上述情况的发生,一定要保证协商的TCP MSS参数小于设备的MTU的值。为此,Quidway路由器上有一个设置TCP MSS值的命令,如果配置了这条命令,路由器设备在建立TCP/IP连接的过程中就按照这个配置的值来修改协商报文中关于TCP MSS的值,在同对端协商的过程中也就能够协商出这个值来,如果不配置这条命令,路由器设备就不会修改报文中的这个值(有时对端设备发送过来的协商报文中的这个值会很大,如8000)。一般来说,默认或配置的MTU的值一般在1500左右,将TCP MSS的值设备为小于1500就可以,如1400或1024等。
如果TCP MSS值设置的过小,报文数量明显增多又导致效率下降,特别是没有配置NAT应用的情况下,限制TCP报文大小更没有必要,由于应用情况比较复杂,设置默认的TCP MSS的值也不是特别合适(设备会在建立连接时均要修改TCP MSS的值),因此,还是在应用中加以注意比较好,思科设备也是有这个配置命令的
MTU: Maxitum Transmission Unit 最大传输单元
MSS: Maxitum Segment Size 最大分段大小
MSS最大传输大小的缩写,是TCP协议里面的一个概念。
MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes), 通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。
而一般以太网MTU都为1500, 所以在以太网中, 往往TCP MSS为1460。
协商TCP MSS大小具体过程如下:
TCP client发出SYN报文,其中option选项填充的MSS字段一般为(MTU-IP头大小-TCP头大小),同样TCP server收到SYN报文后,会发送SYN+ACK报文应答,option选项填充的mss字段也为(MTU-IP头大小-TCP头大小);协商双方会比较SYN和SYN+ACK报文中MSS字段大小,选择较小的MSS作为发送TCP分片的大小。
对于涉及PPPOE+NAT、IPsec、L2TP、GRE等组网,通常由于报文太大需要分片,这样会降低传输速率; 所以选择一个合适的MSS对传输数据来说比较重要. linux中一般可以通过netfilter iptables设置TCP MSS来解决。
iptables -A FORWARD -p tcp- -tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
这条规则的目的就是改变TCP MSS以适应PMTU(Path MTU)
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN- j TCPMSS --set-mss 128
设置MSS为128
5. 设置网络接口MTU
1)Linux主机接口MTU可通过如下命令设置
ifconfig mtu
2)PPPoE MTU设置,可以通过在配置文件中添加
mtu
mru
3)NAT自动设置MSS值
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu