![常见 MTU 值](https://linux22.com/image/1030148/%E5%B8%B8%E8%A7%81%20MTU%20%E5%80%BC.png)
网络接口上的 MTU 值是多少?它的值对网络有何影响?如何检查并更改它?如何知道网络运行的 MTU 是多少?
答案1
MTU,即最大传输单元,是有效载荷可以通过接口传输。有效载荷包括任何 L3 报头(例如 TCP/IP),但不包括第 2 层报头(例如以太网帧报头)。
对于以太网,MTU 通常为 1500 字节。这意味着 TCP/IP 数据包最多可以达到 1500 字节。此外,还有一个以太网帧头,因此整个以太网帧在传输过程中为 1518 字节。如果加上 VLAN 标签,MTU 为 1500B,则该值将增加到 1522B。
常见 MTU 值
对于家庭网络,1500B 是 Wi-Fi 和以太网的通用值。虽然 Wi-Fi 和以太网上的帧不同,但两者都能够处理 1500B 的有效载荷。Wi-Fi 最大为 2304B. 对于以太网而言最大的常见的大小为 9000B,但也可以采用更大的大小。
一般来说,在 Wi-Fi 和以太网中,MTU 为 1500B,这应该不是除非有令人信服的理由,否则不得更改 - 因为更改 MTU 会破坏预期的行为。
PPPoE 是一个常见的例外;由于 PPPoE 在以太网上运行,因此它必须适合以太网的 1500B 帧。PPPoE 的报头是 8 个字节,因此可用的 MTU 是 1492B。请注意,即使 Internet 连接的 MTU 为 1492B,您的本地网络也可以在 1500B MTU 上运行,这要归功于路径 MTU 发现。如果大多数流量都流向 Internet,您能降低 MTU,但这样做不会获得显著的好处,而且可能会因为设备期望MTU 为 1500B。
错误的 MTU 设置可能导致哪些问题
同一网络中的不同 MTU
大于 MTU 的帧将被网卡默认丢弃。如果您的 MTU 不同,则意味着一台主机可能会发送网络上其他主机无法接收的帧。这种行为可能很奇怪。
例如,登录和 ssh 可能工作正常,因为 ssh 发送许多小数据包以减少延迟,但 scp 可能会失败,因为 scp 在传输文件时使用较大的数据包,而不是屏幕内容或按键,并且不必等待数据。诸如此类的工具ping
可能不会在默认有效负载大小下指示错误。
还可能出现连接在一个方向上有效,但在另一个方向上无效的情况。SCP 在将数据从主机 A 复制到主机 B 时可能有效,但在尝试从主机 B 复制到主机 A 时会失败。
结果是,如果您不能识别症状并且足够谨慎地检查和验证 MTU 设置,则 MTU 不匹配可能很难诊断...
同一广播段上的每台计算机都应具有相同的 MTU 设置。这包括同一 L2 系统中存在不同接入技术的情况,例如 WiFi 和以太网。
如何找到网络的 MTU?
不能。第 2 层以太网中没有报告 MTU 的机制。如果数据包太大,接收方将无法收到数据包 - 但缺少回复能除了错误的 MTU 之外,还有其他原因。
作为管理员,您必须确保同一第 2 层网段上的所有设备都具有相同的 MTU 设置。这应该总是对于以太网和 WiFi,其值为 1500 字节,除非您有理由采用不同的设置。
在网络之间(例如,数据包被路由到哪里),你可以使用以下方法发现路径 MTU tracepath example.org
- 但这只会告诉你哪些主机相信可以使用。如果主机配置错误,它将失败。
网络之间的 MTU 变化
当网络更改传输接口时,MTU 可能会发生变化。这种情况发生的一个案例是 ADSL 与 PPPoE 接口。由于以太网有 1500B 的有效载荷,而 PPP 占用 8 个字节,因此 PPPoE 接口上的有效载荷最终为 1492B。在这种情况下,中断发生在路由接口上,因此 TCP/IP 数据包可能会被分段,或者路径 MTU 发现将调整最大段大小,这是 TCP/IP 的一个相关概念。
如果接收到的数据包过大,且需要将其转发到无法容纳的接口,则可能会发生以下两种情况之一:
- 如果不分段位 (DF) (IPv4)被设置,它将被丢弃,并且发件人将意识到它太大。
- 如果未设置 DF,则数据包将被分片并作为两个片段发送。
由于 PPPoE 造成的 MTU 中断,它处于路由边界。从 PPP 链路创建的 PPP 接口是不是与任何以太网接口位于同一 L2 域中。
什么是路径 MTU 发现
局部性尿道畸变是一种发现给定路径的 MTU 的技术。请注意,它依赖于 ICMP,在某些网络上可能会被阻止。
但是,如果同一网络上的不同设备具有不同的 MTU 值,路径 MTU 检测将不起作用。它依赖于设备接收设置了“不分段”位但太大而无法通过目标链路的数据包。但是,如果不匹配,它可能适合目标链路 - 但如果目的地具有较低的 MTU,则目的地无法接收。
什么是 MSS?
最大段大小是 TCP/IP 标头中的一个字段。它指定有效载荷是允许的,并且具有与 MTU 相关的功能。但它不是 MTU。
此外,TCP/IP 具有调整 MSS 的机制。MSS 会根据通信伙伴的不同而变化,并且会因同一 TCP/IP 流的不同而变化。
有什么可以设置MTU的吗?
从广义上讲,有三种方法可以在物理接口上设置 MTU:
- 标准设置,例如以太网和 Wi-Fi 为 1500B
- 用户更改默认值
- DHCP 或 IPv6 RA 设置 MTU
不能根据通信伙伴动态设置。
Linux 上的 MTU
虽然这是为 Ubuntu 编写的,但这对所有现代 Linux 发行版来说都很常见。
该命令ip link
可用于显示 MTU:
$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s31f6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff
这里我们可以看到环回接口的MTU是65536B,而enp0s31f6
以太网接口的MTU是1500B。
可以使用来设置ip link set dev <interface> mtu <value>
,其中<interface>
是接口名称。ip link set dev enp0s31f6 mtu 1400
将的 MTU 设置emp0s31f6
为 1400 字节。
我该改变它吗?
一般来说,不是。如果您需要更改它,您可能知道如何做,以及为什么需要这样做。主要情况是增加它以适应高速网络,例如 10Gb 以太网和更快的网络。
我从事网络工作多年,还没有见过通用网络的 MTU 未设置为 1500B。该值在以太网和 Wi-Fi 上根深蒂固,在数据中心网络等专用环境之外更改它会破坏预期的行为。
巨型帧
随着网络速度的提高,帧间空间和报头的开销变得更加明显。在这种情况下,常见的大小是 9000B MTU,而这可能需要达到线速度。
也有其他尺寸用于各种特殊用途,以容纳 MLPS 等有效载荷或匹配虚拟化系统中的页面大小。然而,这属于专用网络类别。
(注意:我知道以太网通常以八位字节而不是字节为单位。但是,一个字节 = 一个八位字节。为了避免混淆,我在这个答案中使用了字节。)