mtu/mss 数据包分片详解

MTU是啥

        MTU是Maximum Transmission Unit的缩写,意思是最大传输单元,这个值是作用于网卡上的,表示的是数据报文经过网卡时的最大大小,默认情况下网卡的MTU值都是1500,当然这个值可以手动进行修改,可改大或改小;那么这个值具体有什么意义呢,我们的数据包根据不同的类型,他的组组成是不同的,这里我们以一个以太网的tcp数据包来举例,tcp数据包它包括以太网头、IP头、tcp头以及数据部分,那么mtu针对tcp数据包来说就是他的的ip头、tcp头、数据部分加起来的大小不能大于网卡的mtu值,否则这个包会被分段。总结下就是MTU表示的是数据包从IP头部开始计算再往上的数据的大小,如果是一个tcp的包就是包括IP头,tcp头,数据部分加起来的值大小,如果是一个icmp包就是包括IP头,icmp头,数据部分总的大小,可以把MTU理解为一根水管,数据包就是一个个圆球,如果这个圆球的大小大于水管那么这个圆球是不能从水管里面滚过去的,需要把圆球切小了才能过去,到网卡这里就是如果数据包的大小大于mtu的值,那么这个数据包也要把它切小了才能送过去,然后到对端收到后再把分割的数据包再组装起来。

        linux上可以通过ifconfig或者ip命令来修改网卡的mtu值,下面是修改eth0网卡mtu值为1400的实例:这个修改只是临时修改,重启设备或重启网络后恢复原状。

ifconfig eth0 mtu 1400

ip link set dev eth0 mtu 1400

重点:

1、mtu是什么

2、mtu的大小对应数据包是从哪里开始计算的

3、如何在linux上修改网卡的mtu值

MSS是啥

        MSS是Maximum Segment Size的缩写,表示最大报文长度,这个值只作用于tcp数据包。先说下MSS与MTU的关系,MSS是MTU大小减去IP头大小再减去TCP头部的大小的值,如果MTU大小是1500,那么MSS的最佳大小就是1460,也就是说mss的最佳值是接口的mtu值减去40,因为IP头和TCP头都是固定20字节大小。需要说明的是MSS的大小不像MTU的大小那样,可以设置到某个网卡上什么的,这个值是TCP在三次握手时协商的一个值,是作用在tcp客户端和服务端的一直状态值。那么这MSS是如何协商的呢,这里我们需要重点讲下,很多时候我们ping某个网址能通,但是却访问不了他,这有可能是mss的问题导致的;那么这个MSS值是怎么协商的呢,因为我们两个设备建立tcp连接时,他们中间可能是相隔很多个网络设备的,而每个网络设备的mtu值可能都不同,为了确保我们的数据包都能顺利通过,那么就要协商出最佳的的mss值了,加入设备A主动发起TCP连接,那么他一开始的tcp包里面就携带了MSS值,这个值是设备A的TCP数据出去的网卡的MTU值减40,如果设备A出去的网卡的MTU是1500,那么这个MSS值就是1460,如果网卡的MTU值是1400,那么出去的tcp包的MSS值就是1360,OK,现在这个包从设备A出去的MSS假设是1460,如果我们传输过程中中间设备的的mtu为1000,那我传输的数据包为1500过不去怎么办呢?这里会有2中方法,一种就是该设备自己解决,他可以通过配置修改经过的数据包的MSS适应自己的端口,比如现在他端口的MTU是1000,那么他就会修改mss值为960(或者手动指定固定的MSS值),如果需要修改的MSS值大于当前数据包的MSS值的话就不会修改;还有另外一种形式就是pmtu,这是一个路径mtu发现协议,比设备A已经建立起了TCP连接,这时候他根据之前协商的MSS值发送大包过去,但是在中间某个设备那里由于数据包过大过不去,,那么这个设备是会发送一个icmp包回去给设备A,告诉他数据包过去不,我这里的mtu值是多少多少,这时候设备A就会根据这个MTU调整自己的MSS值来发送数据包,这里需要注意的是如果中将禁用了icmp包,或者路由不可达,那么这个通告mtu值的icmp包是到不了设备A的,这时候这数据包就发不过去了。

#设置经过本设备的数据包固定其tcp MSS值为1200
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1200
#设置经过本设备的数据包根据网卡MTU值自动更改tcp 的MSS值
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

重点

1、什么是MSS

2、MSS和MTU的关系

3、linux上怎么配置MSS值自适应和配置固定的MSS值

数据包为何分片

        OK,在了解了什么是MTU和MSS后我们来聊下为何会有数据包分片,首先我们需要明确下,TCP数据包切片叫分段,IP数据包切片叫分片,为什么这么叫呢,因为tcp切片是发生在传输层,IP切片是发生在网络层,而UDP没有分段,它不能分段,它只能通过IP来分片,这是为啥呢?我们把数据包切片后后面是需要再把数据包组装回去的,这就需要表示哪些包是同一个包切片的来的,这些包谁在前谁在后,该怎么组装,这个数据包从哪里组装完就结束了,udp头里面是没有这些标志位的,而tcp头有,Ip头也有,所以tcp可以分段能重新再组回来,IP包也能分片后再组装回来。

        那为啥会有数据包切片呢?当然是因为包太大了啊,那为啥会数据包过大呢?我们知道我们用tcp传输数据时是会协商MSS的,这样就能保证我们的数据包不再进行切片了,但是在非最优的配置时也是可能出现包过大的情况的,所以这时候就要进行切片了!那这时候又会有同学问,我可以分片为啥还要协商MSS啊,这是因为数据包的分片和组装是需要消耗设备性能的,所以最优情况下是不发生分片,OK,可能又有同学问了,在介绍MSS时不是说了包太大了发不过去,然后给设备A回复ICMP报文吗,他分片不就不去了吗?这是因为数据包可以设置一个DF标志位,通过这个标志位来设置这个包是否可以被分片,当这个标志位设置为1时表示不能分片,当设置为0时表示可以被分片,因为tcp的报文被设置不能被分片所有包太大时过不去了。

    

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值