当前位置: 首页 > Linux

关于MTU,这里可能有一些你不知道的

时间:2023-04-06 18:28:32 Linux

MTU(MaximumTransmissionUnit)大小是指一个以太网帧(EthernetFrame)所能承载的最大数据部分(payload)的大小,当MTU值设置为9000Bytes又叫JumboFrame:以太网帧(EthernetFrame)一般情况下,网卡的MTU大小为1500(最大可以配置为9000),然后为了降低数据传输在高性能网络环境中的效率,可以通过增加MTU来实现。也就是说,通过增加MTU,每帧(Frame)传输的数据量会更大。这就像用货车运输和用大卡车运输之间的区别。但是,要实现较大的MTU,网络中的每个设备都必须支持巨型帧,包括发送主机、目的主机和网络中的路由器。本文主要记录如何检测网络中MTU设置被错误配置后的影响。为了检测两个不同实验室的机器之间的网络是否支持JumboFrame,我从实验室A的Centos主机(客户端)向实验室B的服务器(server)发送ping命令,首先查看客户端的MTU配置:[root@centos~]#ifconfigeno16777736eno16777736:flags=4163mtu1500可以看到默认的MTU值是1500,此时我们发送一个ICMP包,大小为100B到目标服务器。[root@centos~]#ping-s100-c110.245.194.61PING10.245.194.61(10.245.194.61)100(128)字节数据。108字节来自10.245.194.61:icmp_seq=1ttl=50time=23.0ms可以看出小于MTU的数据包(128=100+20(ipheader)+8(icmpheader))发送成功,并收到了服务器的响应。然后我们将数据包的大小增加到2000,超过了MTU值1500。同样的数据ping成功ping发送,收到响应:[root@centos~]#ping-s2000-c110.245。194.61PING10.245.194.61(10.245.194.61)2000(2028)bytesofdata.2008bytesfrom10.245.194.61:icmp_seq=1ttl=50time=24.2ms这里可能会有疑惑,不是说只有一个最多可以发送1500字节?为什么2000字节可以发送成功?为了回答这个问题,我们通过wireshark抓包看看是怎么回事[root@centos~]#tcpdump-ieno16777736-s50-wmtu_1500.pcap[root@centos~]#tshark-tud-P-Oicmp,ip-Y"ip.addr==10.245.194.61"-rmtu_1500.pcap000>>mtu_1500.txt打开mtu_1500.txt,找到ICMP数据包:icmpframe可以看到,即使我们指定的数据包大小是2000字节,IP层也会根据当前的MTU设置对多余的ICMP数据进行分片(Fragmentation)来满足发送方的MTU设置要求,接收方如何判断当前IP包是否已经分片?可以通过MoreFragmentsflag(上图中第93行)和Flags字段(上图中第90行)的值来判断。当receiver的IP层收到最后一个分片(MoreFragments:Notset)时,会将收到的所有分片数据包组装起来交给上层协议。这里我们停下来想一想IP层是如何保证分片重组的顺序的?其实很简单。IP数据包中有一个Fragmentoffset属性。接收方可以根据该属性的顺序重组片段。在这一列中,应该只有两个分片(1500+500=2000),所以下一个Frame就是最后一个IP分片:上面第二个Fragment的第二条边也是最后一个。IP包的大小为548字节,也就是说总的数据传输量为2048(1500+548)字节,其中1个icmp头(8B),2个ip头(20B+20B)和icmp数据部分(2000)。所以可以看出,即使发送的数据量超过了MTU值,IP层也会进行分片,以适配设定的MTU大小。那么,如果将发送MTU设置为9000字节并启用巨型帧,会发生什么情况?[root@centos~]#ifconfigeno16777736mtu9000up[root@centos~]#ifconfigeno16777736eno16777736:flags=4163mtu9000设置完jumboframe我们再ping个大包Whata这次的区别。[root@centos~]#ping-s2000-c110.245.194.61PING10.245.194.61(10.245.194.61)2000(2028)bytesofdata.---10.245.194.61pingstatistics---1packetstransmitted,0收到,100%丢包,时间0ms。..增加MTU后,ping不通!这是怎么回事???查看网络包:pingwithjumboframe嗯,没问题,MTU设置应该成功,这次IP层没有分片,发送的数据也是2000字节,但是为什么服务器没有响应呢?其实这只是说明这个网络不支持巨型帧。只有当网络中存在MTU值不为9000B的转发节点且发送方请求不分片时(第170行,DF:Set),转发节点才会丢弃该消息。这就是返回超时丢包错误的原因。简单来说,当一个转发点收到一条IP报文时,首先会检查报文的大小是否超过了自己的MTU值。如果超过,则检查是否设置了DF标志(Don'tFragment)。如果设置,这条消息将被直接丢弃。如果不设置Don'tFragment,节点会将消息分片转发给下一个路由节点。