关于 MTU 的困惑

网络工程 层2 国际会议
2021-07-25 23:54:49

我正在研究 IP 分片和 MTU。我所知道的是 MTU 是物理介质的属性,因为它可以处理数据量而无需对数据进行碎片化。机器上的默认 MTU 设置为 1500。从网上阅读我了解到为 ICMP 保留了 28 个字节,所以我的实际 MTU 是 1472。

如果我将 DF 位设置为 1 并将数据包大小设置为 1472,我会收到 ping 响应,并且我会在 Wireshark 中看到相同的流量

ping 8.8.8.8 -f -l 1472

Pinging 8.8.8.8 with 1472 bytes of data:
Reply from 8.8.8.8: bytes=68 (sent 1472) time=60ms TTL=113
Reply from 8.8.8.8: bytes=68 (sent 1472) time=67ms TTL=113
Reply from 8.8.8.8: bytes=68 (sent 1472) time=77ms TTL=113
Reply from 8.8.8.8: bytes=68 (sent 1472) time=44ms TTL=113

但是如果我用数据包大小 1473 ping,我会得到以下信息:

C:\Users\admin>ping 8.8.8.8 -f -l 1473

Pinging 8.8.8.8 with 1473 bytes of data:
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.

当我启动这个 Ping 时,我有一个 Wireshark 正在运行,但我从来没有在 Wireshark 中看到过这个。为什么这在 Wireshark 上看不到?我的意思是我不应该看到一些 ICMP 响应吗?我相信如果我机器上的 TCP/IP 堆栈看到 DF 位被设置并且 MTU 超过那么它自己会丢弃数据包吗?有人可以确认吗?

此外,如果我删除 DF 标志,那么我会在 Wireshark 中看到 ICMP ping,但 ping 失败:

C:\Users\admin>ping 8.8.8.8 -l 1473

Pinging 8.8.8.8 with 1473 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.

为什么这会失败?我尝试将机器上的 MTU 从 1500 手动更改为 1501

  MTU  MediaSenseState   Bytes In  Bytes Out  Interface
------  ---------------  ---------  ---------  -------------
4294967295                1   54991843          0  Loopback Pseudo-Interface 1
  1500                5          0          0  Wi-Fi
  1500                5          0          0  Ethernet
  1500                5          0          0  Local Area Connection* 14
  1500                5          0          0  Local Area Connection* 15
  **1501                1  114787330   26005606  Ethernet 2**
  1500                1          0     755762  VirtualBox Host-Only Network

即使在增加 MTU 之后,我也会收到请求超时。有人可以解释一下吗?是不是因为我的机器容量还是1500字节,改成1500就没有效果了?

2个回答

从网上阅读我了解到 28 个字节是为 ICMP 保留的,所以我的实际 MTU 是 1472。

不,MTU 是数据链路协议有效载荷的大小。对于以太网,即 1500。您混淆了网络层。网络层,例如IP,数据包是数据链路协议的有效载荷,所以MTU是网络数据包可以有多大,但网络数据包不需要和MTU一样大。

一个 IPv4 数据包(包括 IPv4 数据包标头)可以大到 65,535 字节,这比您会发现的任何 MTU 都大得多。IPv6 的做法不同,它的有效载荷可以大到 65,535,不包括 IPv6 数据包头(还有一个 Option 头,允许 IPv6 有效载荷大到 4,294,967,295)。

ICMP,尽管它是 IP(IPv4 和 IPv6)的一个组成部分,但被视为传输层协议,因此它是 IP 的有效载荷。是的,有一个 ICMP 标头,就像有一个 UDP 或 TCP 标头一样。

您似乎想将传输层的最大负载大小计为 MTU,但这是不正确的,它是数据链路协议负载的最大大小。TCP 有一种叫做 MSS 的东西,它可以为您提供最大的 TCP 段大小,但除此之外,您需要根据封装协议计算最大数据大小。

想想万维网。其数据是 HTML,但是它被 HTTP 或 HTTPS 封装,然后被 TCP 封装,然后是 IP 版本之一,然后是数据链接协议。MTU 仅反映数据链路有效负载的最大大小,但您需要弄清楚使用哪些其他协议来确定您可以在每个数据包中发送的最大数据大小,这将因堆栈中使用的协议而异。


设置 DF 位意味着不允许路径中的中间设备(例如路由器)对传输中的 IPv4 数据包进行分段。IPv6 没有该标志,因为在 IPv6 的路径中根本不允许分段。我们现在有了 PMTUD,这是 IPv6 所必需的,因为 IPv6 必须在路径中至少具有 1280 的 MTU 才能工作。许多操作系统和应用程序现在也使用 IPv4 的 PMTUD,这是执行此操作的首选方式。

现在大多数聪明的企业都会丢弃数据包分片以防止分片攻击,分片是资源密集型的,这就是为什么使用 IPv6 将其从 IP 中丢弃的原因。

我尝试将机器上的 MTU 从 1500 手动更改为 1501

除非你有非标准的巨型帧支持,否则不要乱搞,而且你真的知道你在做什么。以太网 MTU 是 1500。一些供应商允许巨型帧支持,但必须在整个帧路径中启用它,否则帧将简单地丢弃在路径中。

最大传输单元是使用特定数据链路连接可以传输的最大 IP 数据报大小 最大传输单元是 sw 值是 LAN 的设计参数,是一个相互约定的值(即源端和目的端)的链接同意使用相同的特定值)对于大多数 isp 或点对点链接。

不同连接之间最大传输单元的大小可能会有很大差异(例如,通常从 128 B 到 10 kB)。Internet 上流行的 Path 最大传输单元现在是 1500 字节,以太网最大传输单元。有一些举措支持网络中更大的 MTU,特别是在研究网络上。但它们的可用性受到 MTU 为 1500 的以太网的最后一英里部署以及路径 MTU 发现缺乏稳健性的阻碍。这导致在 [RFC4821] 中定义了一个更健壮的方法。

传输层(TCP 或 UDP)不知道 IP 数据包在通过网络时所采用的特定路径。因此它不知道要生成多大的 IP 数据包。太小的数据包可能效率低下(即,与大量标头相比,数据可能很少),因此更大的数据包效率更高。过大的IP数据包可能会超过发送数据包的链路的最大传输单元,从而导致分片。