现在的位置: 首页 > 综合 > 正文

MTU MSS 设置对网络环境的影响

2012年08月06日 ⁄ 综合 ⁄ 共 5260字 ⁄ 字号 评论关闭

MTU: Maxitum Transmission Unit 最大传输单元

MSS: Maxitum Segment Size 最大分段大小

PPPoE: PPP Over Ethernet(在以太网上承载PPP协议)

[分析过程]
先说说这MTU最大传输单元,这个最大传输单元实际上和链路层协议有着密切的关系,让我们先仔细回忆一下EthernetII帧的结构DMAC+SMAC+Type+Data+CRC
由于以太网传输电气方面的限制,每个以太网帧都有最小的大小64bytes最大不能超过1518bytes,对于小于或者大于这个限制的以太网帧我们都可以视之为错误的数据帧,一般的以太网转发设备会丢弃这些数据帧。
(注:小于64Bytes的数据帧一般是由于以太网冲突产生的“碎片”或者线路干扰或者坏的以太网接口产生的,对于大于1518Bytes的数据帧我们一般把它叫做Giant帧,这种一般是由于线路干扰或者坏的以太网口产生)

由于以太网EthernetII最大的数据帧是1518Bytes这样,刨去以太网帧的帧头(DMAC目的MAC地址48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和帧尾CRC校验部分4Bytes(这个部门有时候大家也把它叫做FCS),那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes这个值我们就把它称之为MTU。这个就是网络层协议非常关心的地方,因为网络层协议比如IP协议会根据这个值来决定是否把上层传下来的数据进行分片。就好比一个盒子没法装下一大块面包,我们需要把面包切成片,装在多个盒子里面一样的道理。

当两台远程PC互联的时候,它们的数据需要穿过很多的路由器和各种各样的网络媒介才能到达对端,网络中不同媒介的MTU各不相同,就好比一长段的水管,由不同粗细的水管组成(MTU不同 )通过这段水管最大水量就要由中间最细的水管决定。

对于网络层的上层协议而言(我们以TCP/IP协议族为例)它们对水管粗细不在意它们认为这个是网络层的事情。网络层IP协议会检查每个从上层协议下来的数据包的大小,并根据本机MTU的大小决定是否作“分片”处理。分片最大的坏处就是
降低了传输性能,本来一次可以搞定的事情,分成多次搞定,所以在网络层更高一层(就是传输层)的实现中往往会对此加以注意!有些高层因为某些原因就会要求我这个面包不能切片,我要完整地面包,所以会在IP数据包包头里面加上一
个标签:DF(Donot Fragment)。这样当这个IP数据包在一大段网络(水管里面)传输的时候,如果遇到MTU小于IP数据包的情况,转发设备就会根据要求丢弃这个数据包。然后返回一个错误信息给发送者。这样往往会造成某些通讯上的问题,不过幸运的是大部分网络链路都是MTU1500或者大于1500。

对于UDP协议而言,这个协议本身是无连接的协议,对数据包的到达顺序以及是否正确到达不甚关心,所以一般UDP应用对分片没有特殊要求。

对于TCP协议而言就不一样了,这个协议是面向连接的协议,对于TCP协议而言它非常在意数据包的到达顺序以及是否传输中有错误发生。所以有些TCP应用对分片有要求---不能分片(DF)。

花开两朵,各表一枝,说完MTU的故事我们该讲讲今天的第二个猪脚---PPPoE所谓PPPoE就是在以太网上面跑PPP协议,有人奇怪了,PPP协议和Ethernet不都是链路层协议吗?怎么一个链路层跑到另外一个链路层上面去了,难道升级成网络层协议了不成。其实这是个误区:就是某层协议只能承载更上一层协议。

为什么会产生这种奇怪的需求呢?这是因为随着宽带接入(这种宽带接入一般为Cable Modem或者xDSL或者以太网的接入)由于以太网缺乏认证计费机制而传统运营商是通过PPP协议来对拨号等接入服务进行认证计费的,所以就出了这么一个怪胎:PPPoE。(有关PPPoE的详细介绍参见V大以及本站其他成员的一些介绍文章,我就不啰里啰唆的了)

PPPoE带来了好处,也带来了一些坏处,比如:二次封装耗费资源,降低了传输效能等等,这些坏处俺也不多说了,最大的坏处就是PPPoE导致MTU变小了以太网的MTU是1500,再减去PPP的包头包尾的开销(8Bytes),就变成1492。

如果两台主机之间的某段网络使用了PPPoE那么就会导致某些不能分片的应用无法通讯。

这个时候就需要我们调整一下主机的MTU,通过降低主机的MTU,这样我们就能够顺利地进行通讯了。

当然对于TCP应用而言还有另外的解决方案。
马上请出今天第三位猪脚:MSS。
MSS最大传输大小的缩写,是TCP协议里面的一个概念。
MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。

介绍完这三位猪脚s
我们回过头来看前言里面的那个问题,我们试想一下,如果我们在中间路由器上把每次TCP连接的最大MSS进行调整这样使得通过PPPoE链路的最大MSS值加上数据包头包尾不会超过PPPoE的MTU大小1492这样就不会造成无法通讯的问题.所以上面的问题可以通过ip tcp adjust-mss 1452来解决。

当然问题也可以通过修改PC机的MTU来解决。

[后记]
Cisco的TCP Adjust MSS Feature:

The TCP MSS Adjustment feature enables the configuration of the
maximum segment size (MSS) for transient packets that traverse a router,
specifically TCP segments in the SYN bit set, when Point to Point Protocol
over Ethernet (PPPoE) is being used in the network. PPPoE truncates the
Ethernet maximum transmission unit (MTU) 1492, and if the effective MTU
on the hosts (PCs) is not changed, the router in between the host and the
server can terminate the TCP sessions. The ip tcp adjust-mss command
specifies the MSS value on the intermediate router of the SYN packets to
avoid truncation. 

一、TCP MSS 的原理
PC1(192.168.0.1)―――Router――――Internet―――-www server(238.135.1.1)
建立tcp连接的两端在三次握手时会协商tcp mss大小,具体如下:
pc1发出syn报文,其中option选项填充的mss字段一般为1460,同样www server收到syn报文后,会发送syn+ack报文应答,option选项填充的mss字段也为1460;协商双方会比较syn和syn+ack报文中mss字段大小,选择较小的mss作为发送tcp分片的大小。通过比较,协商双方的tcp mss都是1460。
对于涉及mpls l3vpn、pppoe+nat、ipsec、l2tp、gre等组网,通常由于报文太大需要分片,一般可以通过设置tcp mss解决。
针对上例说明tcp mss如何实现
假设在路由器内网口配置tcp mss 1200
路由器收到www server的syn+ack报文时会修改option选项中的mss字段为1200,然后再转发给PC1,PC1收到报文后认为对端的tcp mss为1200,这样PC1发送资料(已经协商完了)给www server时会以1200作为分片大小;但路由器修改tcp mss为1200的操作www server是不知道的,因此www server还会以1460作为分片大小发送报文。

假设再路由器外网口配置tcp mss 1200
路由器收到PC1的syn报文时会修改option选项中的mss字段为1200,然后再转发给www server,同样www server发送资料给PC1时会以1200作为分片大小;同样PC1不知道路由器修改tcp mss为1200,因为PC1还会以1460作为分片大小发送报文。
因此在实现双向大包传输时需要在内外网同时修改tcp mss
综上所述:在路由器接口上配置的tcp mss命令仅对出接口方向的syn报文和syn+ack报文有效,对于入接口方向的syn和syn+ack报文无效。

二、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

【上篇】
【下篇】

抱歉!评论已关闭.