文档

网络最大传输单元MTU

更新时间:
重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

网络最大传输单元MTU(Maximum Transmission Unit)决定了网络上单次可传输数据包的最大尺寸,包含IP数据包头和载荷,不包含以太网头部。理论上MTU越大,可在单个数据包中传递的数据越多,网络通信越高效。本文介绍巨型帧相关功能以及如何修改ECS实例网卡的MTU。

巨型帧(Jumbo frames)

巨型帧是指有效负载超过IEEE 802.3标准所限制的1500字节的以太网帧,增大的有效载荷百分比有助于提高链路利用率,获得更好的网络性能。阿里云支持8500字节的巨型帧,允许您发送8500字节载荷的以太网帧。

当前所有ECS实例都支持1500 MTU,8代主售实例规格族(g8i/c8i/r8i/g8a/c8a/r8a/g8ae/c8ae/r8ae/g8y/c8y/r8y)还可以支持8500 MTU。更多信息,请参见实例规格族

然而能否使用巨型帧进行网络通信还需要考虑到网络链路以及对端主机的MTU限制,超过MTU限制的数据包将会被阿里云转发组件分片或丢弃。更多信息,请参见超过链路MTU时的处理

重要

目前已知在以下场景使用巨型帧可能存在连通性或性能问题:

  • 使用非TCP(UDP/ICMP)的巨型帧访问云服务或者目的主机使用负载均衡产品时,可能由于分片报文无法被负载均衡器正常转发而丢弃,造成网络不通的风险。更多信息,请参见云网络产品MTU限制

  • 使用非TCP(UDP/ICMP)的巨型帧在MTU不匹配的场景下进行通信时,可能因为分片而导致网络性能下降。更多信息,请参见ECS互访链路MTU限制云网络产品MTU限制

因此,建议在使能巨型帧的ECS内部署业务之前,先测试业务场景下是否存在因为MTU不匹配带来的连通性和性能问题,并管理好这些场景下的数据包尺寸以降低不必要的性能损失。

开启/关闭巨型帧

您可以通过以下方式开启、关闭ECS实例的巨型帧。

  • 方式一:

    创建ECS实例时开启、关闭巨型帧。具体操作,请参见自定义购买实例

  • 方式二:

    实例创建完成后,在ECS实例详情页面开启、关闭巨型帧。

    1. 在实例详情页面的网络信息区域,选择更多 > 修改巨型帧配置修改Jumbo配置

    2. 修改巨型帧配置对话框,根据实际需要开启、关闭巨型帧。

  • 方式三:

    通过调用ModifyInstanceAttribute接口开启、关闭巨型帧。

通过方式二或者方式三开启、关闭巨型帧后,根据操作系统的不同,您还需要完成如下操作才能使配置生效:

  1. 重启ECS实例。

  2. (可选)登录系统内部修改MTU配置,仅Windows系统开启巨型帧场景需要完成该操作。具体操作,请参见修改ECS网卡MTU

    说明
    • Linux系统的DHCP服务器会自动获取MTU,重启后无需手动修改即可在实例内部看到开启或者关闭后的MTU(开启8500、关闭1500)。

    • Windows系统关闭巨型帧后,重启后无需再登录系统内部手动修改MTU配置即可生效(即MTU为1500)。

ECS互访链路MTU限制

在阿里云网络内,链路默认支持1500 MTU,对于不支持巨型帧的ECS实例通信时,只需要关注VPN网关等网络组件自身的MTU限制即可。更多信息,请参见云网络产品MTU限制

支持巨型帧的ECS实例作为源主机时,目的主机在不同通信场景下的链路最大MTU限制如下表所示:

目的主机

允许的最大MTU

“同VPC内” 或 “同region对等连接的VPC内” 开启巨型帧的ECS实例

8500

“同VPC内” 或 “同region对等连接的VPC内” 未开启巨型帧的ECS实例

1500

“通过CEN实现互通的VPC内”任意ECS实例

“通过高速通道连接的线下IDC内”的主机

“通过EIP、PIP访问”的外部主机

更多信息,请参见VPC对等连接概述VPC连接

重要

对于超过链路最大MTU限制的数据包,阿里云转发组件会依据RFC标准对报文进行分片或协商,但是这只能保证连通性,不能保证网络通信的性能。因此在链路最大MTU为1500的通信场景下,尽量避免使用巨型帧进行UDP、ICMP通信。对于阿里云上转发组件在数据包大于链路最大MTU场景下的行为,请参见超过链路MTU时的处理

云网络产品MTU限制

除此之外,在使用非TCP协议(UDP、ICMP)访问特定网络产品时,需要注意不同网络产品自身的MTU限制。当前阿里云云产品普遍不支持巨型帧,部分网络产品的最大MTU限制如下表所示:

网络产品

支持的最大MTU

说明

NAT网关

1500

负载均衡(包括ALB、NLB、CLB)

ALB和CLB不支持分片报文的转发,因此使用UDP/ICMP进行通信时,需要严格控制源ECS实例发出的数据包的整包大小不超过1500。

云服务(OSS,RDS等)

由于流量会经过负载均衡产品,需注意负载均衡产品的限制。

全球加速

云防火墙

私网连接PrivateLink

VPN网关

1399

更多信息,请参见MTU配置说明

重要

对于超过云产品最大MTU限制的数据包,阿里云转发组件会依据RFC标准对报文进行分片或协商,但是这只能保证连通性,不能保证网络通信的性能。因此在云产品最大MTU为1500或1399的通信场景下,尽量避免使用巨型帧进行UDP、ICMP通信。对于阿里云上转发组件在数据包大于云产品最大MTU场景下的行为,请参见超过链路MTU时的处理

超过链路MTU时的处理

为了保证网络连通性,当数据包超过网络链路最大MTU限制时,阿里云转发组件会依据RFC标准进行如下处理。

TCP-固定MSS

在TCP建立连接期间,两个主机会为连接通告自己的最大分段大小 (MSS),MSS表示系统在TCP分段(不包括TCP和IP标头)中接受的最大数据包长度。MSS与MTU的关系为:MSS = MTU - (IP标头 + TCP标头)。因此,为了保证数据包正常通信,MSS加上TCP标头(20字节)和IP标头(对于IPv4是20字节,对于IPv6是40字节),必须小于或等于网络链路的最大MTU限制。

对于MSS值与链路MTU不匹配时,阿里云网络转发组件会修改MSS值,从而降低同步序列编号SYN(Synchronize Sequence Numbers)数据包中发送者通告的MSS值或SYN-ACK数据包中接收者通告的MSS值。

非TCP(UDP/ICMP)-路径MTU发现(PMTUD)

对于非TCP数据包,缺乏类似TCP MSS的端到端MTU协商机制,阿里云转发组件通过PMTUD机制去帮助用户探测和协商MTU。

当数据包超过路径上的MTU限制时,按照标准,如果没有设置Don't-Fragment (DF) 位,转发组件需要对该数据包按照链路MTU进行分片转发;如果DF位为1,则该数据包会被直接丢弃。数据包被丢弃后:

重要
  • PMTUD机制是以丢包为代价地协商MTU,只能保证网络连通性,构造和响应PMTU、以及对分片报文的处理,都会增加ECS系统内核与底层转发组件的资源开销,极大地降低性能。因此为了更好的性能,建议在MTU不匹配的通信场景下,通过ModifyInstanceAttribute接口关闭巨型帧,并重启ECS实例生效。

  • ECS实例响应PMTUD机制依赖操作系统支持,要求操作系统支持且打开了PMTU响应(例如在Linux系统中,/proc/sys/net/ipv4/ip_no_pmtu_disc文件内容为0),同时实例的安全组配置也需要设置为放行ICMP流量以接收来自不同转发组件的ICMP协商数据包。

修改ECS网卡MTU

在阿里云上,一些通信场景或网络产品(例如VPN网关、流量镜像)对ECS发出的数据包大小有着更加严格的要求,需要您主动缩小数据包尺寸,以保证网络连通性或更好的用户体验。您可以通过如下操作方法来修改ECS网卡的MTU值,以满足这些产品的要求。

警告

修改ECS网卡MTU时,注意不要超过ECS实例支持的最大MTU上限(开启巨型帧时为8500,关闭或不支持巨型帧时为1500),否则可能导致网络不通。

  • Linux系统MTU会通过DHCP服务器自动获取,除了VPN网关等隧道场景,一般情况下无需手动修改网卡MTU。

  • Windows系统不支持DHCP自动获取MTU,在开启/关闭巨型帧时,才需要用此方法修改网卡MTU。

在本示例中,我们演示不同操作系统下修改ECS网卡MTU到1399字节。

Windows

以Windows Server 2019为例,操作步骤如下:

  1. 远程连接Windows实例。

  2. 打开PowerShell。

  3. 执行以下命令,查看系统网卡设备列表。

    Get-NetAdapter

    回显类似如下所示,表示系统网卡的网卡名称为以太网。设备列表

  4. 执行以下命令,查看以太网网卡的MTU。

    Get-NetAdapterAdvancedProperty -Name "以太网"

    回显类似如下所示,表示以太网网卡当前的MTU值为1514。当前MTU

    说明

    Windows系统的MTU计算方式随驱动有差异,大部分场景下驱动计算MTU包含了14字节以太网头,因此默认值是1514。

  5. 执行以下命令,根据需要设置网卡MTU值。

    Get-NetAdapterAdvancedProperty -Name <"网卡名称"> -RegistryKeyword "*JumboPacket" -RegistryValue <目标MTU值>

    例如,将以太网网卡的MTU值设置为1413(包含以太网数据包头的14字节):

    Set-NetAdapterAdvancedProperty -Name "以太网" -RegistryKeyword "*JumboPacket" -RegistryValue 1413

    设置完成后,您可以执行Get-NetAdapterAdvancedProperty -Name "以太网" -RegistryKeyword "*JumboPacket"命令查看以网卡的MTU值是否生效。

    回显类似如下所示,以太网网卡的MTU值已变为1413(包含以太网数据包头的14字节)。

    修改后MTU

Ubuntu

以Ubuntu16.04为例,操作步骤如下:

  1. 远程连接ECS实例。

  2. 执行以下命令,查看系统网卡以及网卡的MTU值。

    ifconfig

    回显类似如下所示,系统网卡eth0的MTU值为1500。查看网卡

  3. 执行以下命令,根据需要设置网卡MTU值。

    例如,设置eth0网卡的MTU为1399:

    mtu=1399
    ifconfig eth0 mtu ${mtu}
    echo "/sbin/ifconfig eth0 mtu ${mtu}" > /etc/network/if-up.d/setmtu && chmod a+x /etc/network/if-up.d/setmtu

    设置完成后,您可以执行ifconfig命令查看网卡的MTU值是否生效。

    回显类似如下所示,eth0网卡的MTU值已变为1399。

    修改后MTU值

CentOS

以CentOS 7.8为例,操作步骤如下:

  1. 远程连接ECS实例。

  2. 执行以下命令,查看IP地址绑定的网卡,如eth0。

    ifconfig

    回显类似如下所示,系统网卡eth0的MTU值为1500。MTU改之前

  3. 执行以下命令,根据需要设置网卡MTU值。

    例如,设置eth0网卡的MTU为1399:

    mtu=1399
    echo "${mtu}" > /sys/class/net/eth0/mtu
    echo "echo \""${mtu}"\" > /sys/class/net/eth0/mtu">> /etc/rc.d/rc.local && chmod +x /etc/rc.d/rc.local

    设置完成后,您可以执行ifconfig命令查看网卡的MTU值是否生效。

    回显类似如下所示,eth0网卡的MTU值已变为1399。

    MTU改之后

常见问题

  1. 问题描述:使用巨型帧进行UDP/ICMP通信时,如果遇到性能急剧下降的情况,如何解决?

    解决方案:检查数据包分片情况,必要时关闭ECS实例的巨型帧。具体操作,请参见开启/关闭巨型帧

  2. 问题描述:ECS实例开启巨型帧的情况下,通过UDP/ICMP协议访问云服务(OSS、RDS等)时,遇到网络不通的问题,如何解决?

    问题原因:当前ECS访问云服务的流量会经过负载均衡产品,受限于负载均衡产品不支持分片报文的转发,因而可能网络不通。

    解决方案:缩小ECS访问云服务的消息大小,以确保数据包不分片,且尺寸小于等于1500字节。

  3. 问题描述:ECS实例无法接收到PMTU消息(ICMP差错报文),如何解决?

    问题原因:PMTU消息被安全组丢弃或者因为超过限速值丢弃。

    解决方案:

    1. 检查安全组设置是否放行ICMP流量。更多信息,请参见查询安全组规则

    2. 检查网络流量是否达到限速值。