2025年网络协议——最大传输单元 MTU

网络协议——最大传输单元 MTUMTU Maximum Transmission Unit 最大传输单元 指的是数据链路层的最大 payload 由硬件网卡设置 MTU 是一个硬性限制 留给网络层的数据长度 以太网的有效载荷 Payload 只有 64 18 1518 18 46 1500

大家好,我是讯享网,很高兴认识大家。

MTU

Maximum Transmission Unit,最大传输单元,指的是数据链路层的最大payload,由硬件网卡设置MTU,是一个硬性限制
留给网络层的数据长度(以太网的有效载荷:Payload)只有 [64 -18, 1518 - 18] = [46, 1500]
留给传输层数据只有:[46-20, 1500-20] = [26, 1480]
TCP 协议头占了 20 Byte, UDP 协议头占了 8 Byte(TCP 之所以协议头比 UDP 大,因它功能比较多:可靠、流速控制、自动分包等
TCP 可以传的用户数据实际上只有 [26 - 20, 1480 - 20] = [6, 1460]
UDP 没有协商的能力,所以它只能直接把用户发送的数据,传给网络层(IP层),由网络层来进行分片。用 UDP 协议发送,那么如果网络发生了波动,丢失了某个 IP 包分片, 对于 UDP 而言, 它没有反馈丢失了哪个分片给发送方的能力,这就意味着:50k 的数据全都丢失了,如果需要重传,就得再次完整的传递这 50k 的数据。UDP 协议头有 2 byte 表示长度的字段。所以实际 UDP 数据包的长度不能超过65507字节(65,535 − 8字节UDP报头 − 20字节IP头部)所以如果一个应用采用 UDP 来通讯,一般都会特意控制下单个包体的大小,从而提高传输效率。
TCP 是流数据,没有该限制,而 TCP 只会重传这一个丢失的分片包。
tcpdump可以看到分片的情况,udp header只出现在一个ip分片中。(第一个,后面是ip-proto-17)(icmp也是,后面是ip-proto-1,1/17是协议号)

拓展

  1. tcp/ip 协议栈Linux源码分析一 IPv4分片报文重组分析

Q&A

  • tcpdump抓包是在tcp分片重组之前?看到的是很大的包
  • 1500字节包含链路层的头部和尾部吗?——不包含。
  • MTU里包含802.1Q的头部VLAN tag吗?——包含。当网卡配置VLAN tag时,VLAN tag + Data <= MTU,有时VLAN tag不只有一个,可能是双标签,那这个VLAN tag就是4Byte*2=8Byte。——MTU(1514) = 14 + 802.1Qvlantag(4)+IPHeader(20) + icmpHeader(8) + (ping -s 1472)
  • 对于IP协议来说,IP包的大小由MTU决定(IP数据包长度就是MTU-28(包头长度)。 MTU值越大,封包就越大,理论上可增加传送速率,但 MTU值又不能设得太大,因为封包太大,传送时出现错误的机会大增。一般默认的设置,PPPoE连接的最高MTU值是1492, 而以太网 (Ethernet)的最高MTU值则是1500,而在Internet上,默认的MTU大小是576字节。
  • 网络分片是在哪一层完成的?——网络层。网络层必须将发给网卡API的包 <= MTU。网络层如果发现链路层的MTU小于IP包的大小(网络层可以调用函数获取链路层信息),也并不会立刻开始分片,还需要看IP包的是否允许分片位DF(Don’t Fragment),如果允许分片,就会分成多个ID一样的IP包
  • 对于TCP包(MTU = 1500),payload最大值是多少,才可以不用分片?——MTU(1500) = IPHeader(20) + TCPHeader(20) + Data,Data = 1500 -20 - 20 = 1100
  • 对于ICMP request/reply包(MTU = 1500),payload最大值是多少,才可以不用分片?——MTU(1500) = IPHeader(20) + ICMPHeader(8) + Data,Data = 1500 -20 - 20 = 1472
  • 对于UDP包(MTU = 1500),payload最大值是多少,才可以不用分片?——MTU(1500) = IPHeader(20) + UDPHeader(8) + Data,Data = 1500 -20 - 8 = 1472
  • 用wireshark捕包。 为什么frame那一行是1514bytes?—— 以太网封装IP数据包的最大长度是1500字节,也就是说以太网最大帧长应该是以太网首部加上1500,再加上7字节的前导同步码和1字节的帧开始定界符,具体就是:7字节前导同步码+1字节帧开始定界符+6字节的目的MAC+6字节的源MAC+2字节的帧类型+1500+4字节的CRC校验。按照上述,最大帧应该是1526字节,但是实际上我们抓包得到的最大帧是1514字节,为什么不是1526字节呢?原因是当数据帧到达网卡时,在物理层上网卡要先去掉前导同步码和帧开始定界符,然后对帧进行CRC检验,如果帧校验和错,就丢弃此帧。如果校验和正确,就判断帧的目的硬件地址是否符合自己的接收条件(目的地址是自己的物理硬件地址、广播地址、可接收的多播硬件地址等),如果符合,就将帧交“设备驱动程序”做进一步处理。这时我们的抓包软件才能抓到数据,因此,抓包软件抓到的是去掉前导同步码、帧开始分界符、CRC校验之外的数据,其最大值是6+6+2+1500=1514。 同理,tcpdump抓包看到的最小帧长度=60B。以太网EthernetII规定,以太网帧数据域部分最小为46字节,也就是以太网帧最小是6+6+2+46+4=64。除去4个字节的FCS,因此,抓包时就是60字节。 当数据字段的长度小于46字节时,MAC子层就会在数据字段的后面填充以满足数据帧长不小于64字节。由于填充数据是由MAC子层负责,也就是设备驱动程序。不同的抓包程序和设备驱动程序所处的优先层次可能不同,抓包程序的优先级可能比设备驱动程序更高,也就是说,我们的抓包程序可能在设备驱动程序还没有填充不到64字节的帧的时候,抓包程序已经捕获了数据。因此不同的抓包工具抓到的数据帧的大小可能不同。对于TCP 的ACK确认帧的大小一个是54字节,一个是60字节,wireshark抓取时没有填充数据段,sniffer抓取时有填充数据段。具体格式如下:
Preamble Destination MAC address Source MAC address Type/Length User Data Frame Check Sequence
8 6 6 2 46 - 1500 4
  • 最小帧长度,性能测试,数据以server端收到的为主(指标pps以最小包发包)
    UDP:
[root@network ~]# iperf3 -c 30.0.1.8 -u -t 1 -l 18 //<=18的,帧长度都为64B,区别是IP payload长度不同,用padding补齐,参见下图 [root@compute2 ~]# tcpdump -i enp0s8 -nev udp and port 5201 06:24:36. 08:00:27:51:c8:85 > 08:00:27:94:16:65, ethertype IPv4 (0x0800), length 60: (tos 0x0, ttl 64, id 19856, offset 0, flags [DF], proto UDP (17), length 46) 30.0.1.6.56764 > 30.0.1.8.targus-getdata1: UDP, length 18 

讯享网
  • UDP如何分片?——网络层并不会在每个分片里复制一次UDP头,它是把完整的UDP包切开,加上IP头发送出去,除了第一个分片有UDP头,后面的分片都不包含UDP头。(ICMP也是)
  • 目的主机的网络层接收到多个UDP分片包后,网络层必须重组才能交给上层,为什么?——因为多个分片包只有第一个是有UDP头的,它可以根据UDP头里的端口号通知相应的应用取走,但是后面的分片包由于没有UDP头,传输层无法把分片包交给正确的应用程序。所以UDP分片包必须在网络层重组成一个完整的UDP包,交给传输层处理
  • 网络层根据什么重组呢?——分片的时候会分成多个ID一样的IP包
  • 如果某些分片包没有被目的主机的网络层接收到,造成UDP包重组失败,接收方会丢弃整个数据包,这是UDP不可靠传输的一个表现。而TCP发生组包错误时,该包会被重传,保证可靠传输
  • mtu 不一致会出现什么问题?

分片包长(当MTU=1500)

我们在用Socket编程时,UDP协议要求包小于64K。TCP没有限定,TCP包头中就没有“包长度”字段,而完全依靠IP层去处理分帧。这就是为什么TCP常常被称作一种“流协议”的原因,开发者在使用TCP服务的时候,不必去关心数据包的大小,只需讲SOCKET看作一条数据流的入口,往里面放数据就是了,TCP协议本身会进行拥塞/流量控制。

用TCP协议发送时,由于TCP是数据流协议,因此不存在包大小的限制(暂不考虑缓冲区的大小),这是指在用send函数时,数据长度参数不受限制。而实际上,所指定的这段数据并不一定会一次性发送出去,如果这段数据比较长,会被分段发送,如果比较短,可能会等待和下一次数据一起发送。

不分片的最大负载

iperf -l指定的包长指的是udp头之后的长度,mtu=1500的时候,-l不分片的最大长度为1472,此时tcpdump抓包看到的总体包长为1516

  • ICMP (Ping) 包的大小就应该是 1500 - IP头(20) - ICMP头(8) = 1472(Bytes)
  • UDP 包的大小就应该是 1500 - IP头(20) - UDP头(8) = 1472(Bytes)
  • TCP 包的大小就应该是 1500 - IP头(20) - TCP头(20) = 1460 (Bytes)

ICMP 不分片 (以太包长度 1514 = IP头(20)+ ICMP(1480 = Type(1)+ Code(1))+ 校验和(2)+标识符(2)+序号(2)+ 1472)

讯享网ping 10.164.16.54 -s 1472 20:44:13. 08:00:27:27:50:1c > 08:00:27:3b:d9:78, ethertype IPv4 (0x0800), length 1514: (tos 0x0, ttl 64, id 35178, offset 0, flags [DF], proto ICMP (1), length 1500) 10.164.16.57 > 10.164.16.54: ICMP echo request, id 1419, seq 1, length 1480 

分片(fragmentation)

icmp 的 payload=1473(两个包 : (第一个包:以太包长度1514,IP包长度1500,ICMP payload:1472) +,第二个包:以太包长度:60,IP包长:21,ICMP payload:1)

[root@network ~]# ping 30.0.1.8 -s 1473 05:29:28. 08:00:27:51:c8:85 > 08:00:27:94:16:65, ethertype IPv4 (0x0800), length 1514: (tos 0x0, ttl 64, id 18292, offset 0, flags [+], proto ICMP (1), length 1500) 30.0.1.6 > 30.0.1.8: ICMP echo request, id 64616, seq 1, length 1480 05:29:28. 08:00:27:51:c8:85 > 08:00:27:94:16:65, ethertype IPv4 (0x0800), length 60: (tos 0x0, ttl 64, id 18292, offset 1480, flags [none], proto ICMP (1), length 21) 30.0.1.6 > 30.0.1.8: ip-proto-1 

第二个包涉及到以太网最小帧长=64字节,只有一个Byte=c0的负载,后面的全0为padding
在这里插入图片描述
讯享网

iperf

讯享网tcpdump fa:16:3e:69:88:12 > fa:16:3e:3f:c5:b6, ethertype IPv4 (0x0800), length 58: 172.31.3.27.40761 > 172.31.1.160.5201: UDP, length 16 

MTU 对 TCP 的影响

MTU 和 MSS 的关系

MSS的主要作用是限制另一端主机发送的数据的长度,同时,主机本身也控制自己发送数据报的长度,这将使以较小MTU连接到一个网络上的主机避免分段。

对于一个以太网来说,TCP的最大报文段长度即MSS一般是1460字节(1500(MTU) - 20(IP head) - 20(TCP head) = 1460 Byte),减去12字节的TCP timestamp option,留给TCP正文数据是 1448字节 。另外,TCP流量控制采用了滑动窗口机制,发送窗口的大小要小于min(接收端通告的接收窗口大小,发送端拥塞窗口大小)。
Linux 2.6.39内核之前的TCP实现中,发送端初始拥塞窗口为3,单位是MSS (server机器内核版本未知,估计是2.6.39以前的)。也就是说TCP连接建立后,初始拥塞窗口限制第一次发送的数据长度要小于等于 1448 * 3 = 4344 字节,所以客户端 第一次recv 调用只收到了4344字节 数据。
在这里插入图片描述

路径 MTU

  • 重要的不是两台主机所在网络的 M T U 的值,重要的是两台通信主机路径中的最小 MTU。它被称作路径 MTU
  • 两台主机之间的路径 MTU不一定是个常数。它取决于当时所选择的路由。而选路不一定是对称的(从A到B的路由可能与从B到A的路由不同),因此路径MTU在两个方向上不一定是一致的。
  • traceroute 程序也是用这个方法来确定到达目的节点的路径 MTU

路径 MTU 发现机制:
在这里插入图片描述

Neutron 中的那些 MTU

在这里插入图片描述
在这里插入图片描述

  • global_physnet_mtu ,底层物理网络的MTU。Neutron使用这个值来计算所有虚拟网络组件的MTU。对于flat网络和VLAN网络,neutron直接使用这个值而不作修改。对于VXLAN等overlay网络,neutron会自动从这个值中减去 overlay 协议的开销(比如 vxlan=50)。默认为1500,这是以太网的标准值。
    在这里插入图片描述
# Default network MTU value when not configured DEFAULT_NETWORK_MTU = 1500 
  • physical_network_mtus,物理网络与MTU值的映射列表。映射的格式是<physnet>: <mtu val>。这种映射允许指定与默认的 global_physnet_mtu 值不同的物理网络 MTU 值。
    在这里插入图片描述
    path_mtu,在使用 overlay/tunnel 协议时,可以穿越底层物理网络基础设施而不产生碎片的IP数据包的最大尺寸(MTU)。 这个选项允许指定一个与默认的global_physnet_mtu值不同的物理网络MTU值。(如果配置了该值,计算overlay/tunnel 类型的mtu时以此为准,若未配置,则使用global_physnet_mtu的值来计算overlay/tunnel 类型的网络的mtu)
    在这里插入图片描述

报文格式

Ethernet Ⅱ 以太帧

在这里插入图片描述

在tcpdump -ne的输出中,第一个length指的是链路层帧的长度,即链路层帧的数据部分的长度,不包括链路层帧头和帧尾的长度。在以太网中,链路层帧的最小长度是64字节,最大长度是1518字节。如果链路层帧的数据部分长度小于64字节,则会被填充到64字节。如果链路层帧的数据部分长度大于1518字节,则会被拆成多个帧进行传输。

为什么我抓包看到的length的最大长度为1514呢?

你提到的长度为1514是因为在以太网中,链路层帧的数据部分最大长度为1500字节。加上链路层帧头和帧尾的长度,链路层帧的总长度最大为1518字节。因此,当你使用tcpdump抓取以太网数据包时,显示的第一个length字段的最大值为1514字节。这是因为tcpdump会排除链路层帧头和帧尾的长度,只显示链路层帧的数据部分长度。

为什么我抓包看到的length的最小长度为58呢?而不是所谓的64B

你提到的长度为58是因为在以太网中,链路层帧的最小长度为64字节,但是这个长度包括链路层帧头和帧尾的长度。链路层帧头的长度为14字节,帧尾的长度为4字节(FCS校验码)。因此,链路层帧的数据部分最小长度为46字节(64 - 14 - 4),而不是64字节。

当你使用tcpdump抓取以太网数据包时,显示的第一个length字段的最小值为58字节,这是因为tcpdump会将链路层帧头和帧尾的长度都计入到了length字段中。因此,即使链路层帧的数据部分长度小于46字节,tcpdump也会显示一个至少为58字节的length值。

在这里插入图片描述

在这里插入图片描述
各Type值对应的协议

协议
0x0800 Internet Protocol (IP) [RFC894]
0x0801 X.75 Internet
0x0805 X.25 Level 3
0x0806 Address Resolution Protocol (ARP)[RFC7042]
0x0808 Frame Relay ARP [RFC1701]
0x8000 IS-IS
0x8035 Reverse Address Resolution Protocol (RARP) [RFC903]
0x8137 Novell NetWare IPX/SPX (old)
0x8138 Novell, Inc.
0x8100 IEEE Std 802.1Q - Customer VLAN Tag Type
0x814C SNMP over Ethernet [RFC1089]
0x86DD IP Protocol version 6 (IPv6) [RFC7042]
0x8808 IEEE Std 802.3 - Ethernet Passive Optical Network (EPON) [RFC7042]
0x880B Point-to-Point Protocol (PPP) [RFC7042]
0x880C General Switch Management Protocol (GSMP)
0x8847 MPLS (multiprotocol label switching) label stack - unicast [RFC 3032]
0x8848 MPLS (multiprotocol label switching) label stack - multicast [RFC 3032]
0x8863 PPP over Ethernet (PPPoE) Discovery Stage [RFC2516]
0x8864 PPP over Ethernet (PPPoE) Session Stage [RFC2516]
0x888E IEEE Std 802.1X - Port-based network access control
0x88A8 IEEE Std 802.1Q - Service VLAN tag identifier (S-Tag)
0x88B7 IEEE Std 802 - OUI Extended Ethertype
0x88C7 IEEE Std 802.11 - Pre-Authentication (802.11i)
0x88CC IEEE Std 802.1AB - Link Layer Discovery Protocol (LLDP)
0x88E5 IEEE Std 802.1AE - Media Access Control Security
0x88F5 IEEE Std 802.1Q - Multiple VLAN Registration Protocol (MVRP)
0x88F6 IEEE Std 802.1Q - Multiple Multicast Registration Protocol (MMRP)
标准 描述
IEEE 802.3 Carrier sense multiple access with collision detection (CSMA/CD) access method and physical layer specifications
IEEE 802.3ae Media Access Control (MAC) Parameters, Physical Layers, and Management parameters for 10Gb/s Operation
RFC 894 A Standard for the Transmission of IP Datagrams over Ethernet Networks
RFC 1042 A Standard for the Transmission of IP Datagrams over IEEE 802 Networks

VLAN 帧格式

图1 VLAN帧格式
在这里插入图片描述
在这里插入图片描述

标准 描述
RFC 3069 VLAN Aggregation for Efficient IP Address Allocation
IEEE 802.1Q IEEE Standards for Local and Metropolitan Area Networks : Virtual Bridged Local Area Networks

TCP 可以传的用户数据实际上只有 [26 - 20, 1480 - 20] = [6, 1460]
在这里插入图片描述
UDP 可以传的用户数据实际上只有 [26 - 8, 1480 -8] = [18, 1472]
在这里插入图片描述

网络性能

网络性能

在Linux中常见的网络性能指标如下

  • 带宽
    表示链路的最大传输速率,单位是b/s 比特/秒,在位服务器选网卡时,带宽就是最核心的参考指标,常用的带宽有1000M,10G,40G,100G等网络带宽测试,测试的不是带宽,而是网络吞吐量,Linux服务器的网络吞吐量一般会比带宽小,而对交换机等专门的网络设备来说,吞吐量一般会接近带宽
  • 吞吐量,表示没有丢包时最大的数据传输速率,单位通常是b/s比特/秒,或B/s字节/秒,吞吐量受带宽的限制,吞吐量/带宽也是该网络链路的使用率
  • 延迟,表示从网络请求发出后,一直到收到远端响应所需要的时间延迟,这个指标在不同场景中有不同含义,它可以表示建立连接需要的时间(TCP握手延时),或者一个数据包往返所需时间RTT
  • PPS,Packet Per Second,表示已网络包为单位的传输速率,PPS通常用来评估网络的转发能力,基于Linux服务器的转发,很容易受到网络包大小的影响(交换机通常不会受太大影响,交换机可以线性转发)PPS,通常用在需要大量转发的场景中,而对TCP或者Web服务器来说,更多会用并发连接数和每秒请求数(QPS Query per Second)等指标,他们更能反映实际应用程序的性能

网络测试基准

Linux网络基于TCP/IP协议栈,不同协议层的行为不同,在测试之前,根据应用程序基于的协议层进行针对性网络性能评估,比如:
基于HTTP或HTTPS的Web应用程序,属于应用层,需要我们测试HTTP/HTTPS的性能
大多数游戏服务器,为了支持更大的同时在线人数,通常会基于TCP或UDP,与客户端交互,这时就需要测试TCP/UDP的性能
针对把Linux作为一个软交换机或路由器来用的场景,需要关注网络包的处理能力PPS,重点关注网络层的转发性能
低层协议是其上的各层网络协议的基础,低层协议的性能,也就决定了高层网络性能

PPS包转发率

传输过程中,帧之间有间距(12个字节),每个帧前面还有前导(7个字节)、帧首界定符(1个字节)。
帧理论转发率= BitRate/8 / (帧前导+帧间距+帧首界定符+报文长度)

在这里插入图片描述

以太网链路的最大帧速率和吞吐量计算

在这里插入图片描述

最大吞吐量(最大帧大小:1538B,最大以太帧大小:1518B)

最大的以太网吞吐量是通过单个传输节点实现的,当以太网帧处于最大大小时,该传输节点不会发生任何冲突。

以太网的帧开销是18字节,目的MAC(6)+源MAC(6)+Type(2)+CRC(4)。局域网规定IP最大传输单元1500字节,实际上加上以太网帧的18字节,再加上8B就是1518字节

最大帧率(最小帧大小:84B,最小以太帧:64B,最小以太网帧有效载荷:46B)

以太网是无连接的,不可靠的服务,采用尽力传输的机制。IEEE标准,一个碰撞域内,最远的两台机器之间的round-trip time 要小于512bit time.(来回时间小于512位时,所谓位时就是传输一个比特需要的时间)。这也是我们常说的一个碰撞域直径。512个位时,也就是64字节的传输时间,如果以太网数据包大于或等于64个字节,就能保证碰撞信号到达A的时候,数据包还没有传完。这就是为什么以太网要最小64个字节,同样,在正常的情况下,碰撞信号应该出现在64个字节之内,这是正常的以太网碰撞,如果碰撞信号出现在64个字节之后,叫 late collision。这是不正常的。
在这里插入图片描述

PPS 理论上限

Mbps 即 Milionbit pro second(百万位每秒);
Kbps 即 Kilobit pro second(千位每秒);
bps 即 bit pro second(位每秒);
1Mbps=1000 000bps

百兆端口线速包转发率=100Mbps/672=0.Mpps,约等于0.14881Mpps,14万pps
千兆端口线速包转发率=1000Mbps/672=1.Mpps,约等于1.4881Mpps,148万pps
万兆端口线速包转发率=10000Mbps/(848bit)=14.88095Mpps,约等于14.881Mpps,1488万pps
2500M
1000*1000/8/1538=20万pps # 麒麟系统到达20万pps时,ksoftirqd 就达到100%了
在这里插入图片描述

arrival为每个数据包之间的时间间隔。

基线测试

在性能测试中首先要做的是建立基线(Baseline),这样后续的调整才会有一个参考标准。值得注意的是,在测试基线的时候,一定要保证系统工作在正常的状态下。

在这里插入图片描述
在这里插入图片描述

这是通常用来衡量带宽的单位,指每秒钟传输的二进制位数;
而通常软件上显示的速度则是指每秒种传输的字节数(Byte)通常用B(大写)表示;MB即百万字节也称兆字节;KB即千字节;B即字节;
之间关系为1MB=1024KB=1024*1024B;
1B=8b;
1M带宽即指1Mbps=1000Kbps=1000/8KBps=125KBps。因此1M的带宽下载的速度一般不会超过125KB每秒。
2M、3M带宽分别是250KBps、375KBps;
2M、3M带宽的下载速度分别不会超过250KB、375KB每秒。
假设要对10kbps进行换算,则有 10kbps=10000bps=0.01Mpbs.
数据传输速率的衡量单位K是十进制含义,但数据存储的K是2进制含义。
1kbit/s就是1000bit/s,而KB是1024个字节,注意KB和kbit的区别,另外,数据传输速率的单位是bit/s 记作:bps 。
1kbps=1000bps,1Mbps=1000,000bps.
1Mbps与 1m/s 是有区别的,1m/s指的是是1024KB/S
而1Mbps指的是1000/8KB/S也就是125KB/S,
记住K和k是没区别的 ,区别在于bps属于位每秒的单位,而m/s ,KB/S这两个属于字节每秒的单位,一字节等于8位,即1k=8b

ref

http://023wg.com/message/message/cd_feature_link-layer.html

小讯
上一篇 2025-01-08 19:24
下一篇 2025-02-15 16:45

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/69629.html