当数据包太大时,IEEE 802.1ad(又名 VLAN Tagging,QinQ)如何有效?

网络工程 以太网 VLAN 琴琴
2021-08-01 22:25:18

最近我一直在处理 MTU 问题这一切似乎源于这样一个事实,即较新计算机上的以太网适配器默认帧大小为 1504 字节:

>netsh interface ipv4 show subinterfaces

   MTU  MediaSenseState   Bytes In  Bytes Out  Interface
------  ---------------  ---------  ---------  -------------
  1504                1  3954161316  804790885  Local Area Connection

现在,根据NetworkEngineering.stackexchange.com上的一个随机人的说法,任何太大的数据包都会被任何接收网络接口卡 (NIC) 丢弃,因为以太网数据包太大:

...任何 MTU 大于 802.3 规范 1500 的帧

大于设置最大值的帧被 NIC 丢弃——这是一个错误,操作系统永远不会知道它。(超大的帧计数器会向上点击,但仅此而已。)

当计算机尝试将数据包发送到网关机器时,这会导致问题。理想情况下,我将依赖路径 MTU发现。但是由于生成的以太网数据包太大,其他任何机器都无法接收,因此没有机会返回IP数据包太大的碎片消息

根本不会有“碎片化”。如果指示“需要分段”,则第 2 层(以太网)没有任何意义。这是在第 3 层 (IP) 上通过路由器在必须丢弃数据包时发送 ICMP 消息来解决的,因为它不适合下一跳接口。

这让我首先想到我的第二个问题:

  • 为什么有一个规范故意创建无效的以太网帧?这里的预期行为是什么?鉴于其他网络接口卡无法接收这些新的默认大小的数据包,他们期望发生什么。

然后这让我想到了我的第一个问题。这是以前被问过的问题 - 很多。

  • 4 字节的 QinQ 标签是以太网帧头的一部分,还是以太网负载的一部分?如果它是标头的一部分,为什么有效载荷主体增加了 4 个字节?如果它是以太网有效负载的一部分,为什么有效负载 MTU 增加了 4 个字节(当我们知道增加 4 个字节会使它成为无效数据包时)?

更大的问题是……

如果我们退后片刻,我们会有一个更大的问题:

我们应该怎么做?

一定有人设计了这个标准。他们希望人们对生成这些过大数据包的设备做什么?

我真的想问 我认为我们并不打算访问每个硬件设备并撤消 MTU 1504 的增加并将其恢复为 1500:

netsh interface ipv4>set subinterface "Local Area Connection" mtu=1500 store=persistent
Ok.

那将是(并且正在成为)配置噩梦。

这个想法可能是关闭 VLAN 标记?除了配置噩梦之外,它根本不起作用:

  • 步骤 1:禁用 VLAN 标记

    在此处输入图片说明

  • 第 2 步:观察它不起作用:

    netsh 接口 ipv4 显示子接口

     MTU  MediaSenseState   Bytes In  Bytes Out  Interface
    

    1504                1     238125     245855  Local Area Connection
    

如果对此的解决方案是手动强制所有网卡恢复为 1500 的 MTU,那么为什么他们首先将其提高到 1504 字节并创建无效数据包?

我遗漏了一块拼图。

奖金喋喋不休

 Without 802.1Q tagging        Without 802.1Q tagging   
+------------------------+    +------------------------+
|Destination MAC: 6 bytes|    |Destination MAC: 6 bytes|
|Source MAC: 6 bytes     |    |Source MAC: 6 bytes     |
|Ethertype: 2 bytes      |    |802.1Q tag: 4 bytes     |
+------------------------+    |Ethertype: 2 bytes      |
|                        |    +------------------------+
|                        |    |                        |
/ Payload: 1500 bytes    /    / Payload: 1500 bytes    /
|                        |    |                        |
|                        |    |                        |
+------------------------+    |                        |
| Frame Check Sequence:  |    +------------------------+
|                 4 bytes|    | Frame Check Sequence:  |
+------------------------+    |                 4 bytes|
                              +------------------------+

网络图

+------------------+      +----------------+     +------------------+
| Realtek PCIe GBe |      | NetGear 10/100 |     | Realtek 10/100   |
|       (on-board) |      |     Switch     |     |     (on-board)   |
|                  |      +----------------+     |                  |
| Windows 7        |           ^    ^            |                  |
|                  |           |    |            |                  |
| 192.168.1.98/24  |-----------+    +------------| 192.168.1.10/24  |
| MTU = 1504 bytes |                             | MTU = 1500 bytes |
+------------------+                             +------------------+

您还可以替换任何您喜欢的配置,生成大于最大允许1500字节的数据包

+------------------+      +----------------+     +------------------+
| Realtek PCIe GBe |      | NetGear 10/100 |     | Realtek 10/100   |
|       (on-board) |      |     Switch     |     |     (on-board)   |
|                  |      +----------------+     |                  |
| Windows 7        |           ^    ^            | MTU = 1500 bytes |
| MTU = 16384bytes |           |    |            |                  |
|                  |-----------+    +------------|                  |
+------------------+                             +------------------+

我试图找到一个站点,该站点可能能够解决我的技术、概念、逻辑、基本、理论问题,即当某些设备有意生成无效数据包时以太网如何工作。

当我尝试将无效的以太网数据包发送到另一个以太网设备时,问题出现了:

  • 计算机生成以太网数据包

    Source MAC:      xx-xx-xx-xx-xx-xx
    Destination MAC: yy-yy-yy-yy-yy-yy
    Ethertype:       0x0800
    Payload:         ...1504 bytes...  (or could be ...16384 bytes, anything larger than 1500...)
    CRC:             4 bytes                
    

此数据包无效,因为它太大而无法被目标 802.3u 设备接收。因为目标的主机操作系统永远不会看到数据包,并且因为以太网没有向发送方报告无效数据包的功能,所以“大”数据包丢失了。

奖金喋喋不休

来自Cisco 的交换机间链路和 IEEE 802.1Q 帧格式

框架尺寸

接口的默认最大传输单元 (MTU) 为 1500 字节。将外部 VLAN 标记附加到以太网帧后,数据包大小会增加 4 个字节。因此,建议您适当增加提供商网络上每个接口的MTU。建议的最小 MTU 为 1504 字节。

同时:

IEEE 802.3 以太网标准仅强制要求支持 1500 字节 MTU 帧。

2个回答

在帖子中回应个人关注...

关于路径 MTU 发现

理想情况下,我将依赖路径 MTU 发现。但是由于生成的以太网数据包太大,其他任何机器都无法接收,因此没有机会返回 IP 数据包太大的碎片消息

根据您的图表,我同意PMTUD无法在同一 LAN 网段中的两台不同 PC 之间运行;PC 不会生成PMTUD所需的 ICMP 错误消息

巨型帧

一些供应商(例如 Cisco)的交换机型号支持大于 1500 字节的以太网负载。IEEE官方并不认可这种配置,但业界有合理的需求来明智地偏离原始 1500 字节 MTU。我有充分利用巨型帧的存储 LAN/备份网络;但是,当我部署巨型帧时,我确保所有 MTU 在同一个 vlan 内匹配。

广播域内的 MTU 不匹配

最重要的是,在同一个以太网广播域中永远不应该有不匹配的以太网 MTU;如果你这样做,这是一个错误或配置错误。无论是错误还是错误,您都必须解决这些问题,有时需要手动解决。

所有这些讨论都会导致下一个问题......

为什么有一个规范故意创建无效的以太网帧?

我不确定我是否同意...我不明白 IEEE 802.3 系列或RFC 894 如何创建无效帧。主机实现或主机错误配置会创建无效帧。要了解您的实现是否遵循规范,我们需要更多证据...

该图至少是您的 MTU 在广播域内不匹配的初步证据......

+------------------+      +----------------+     +------------------+
| Realtek PCIe GBe |      | NetGear 10/100 |     | Realtek 10/100   |
|       (on-board) |      |     Switch     |     |     (on-board)   |
|                  |      +----------------+     |                  |
| Windows 7        |           ^    ^            |                  |
|                  |           |    |            |                  |
| 192.168.1.98/24  |-----------+    +------------| 192.168.1.10/24  |
| MTU = 1504 bytes |                             | MTU = 1500 bytes |
+------------------+                             +------------------+

符合 802.3 的实施应如何应对 MTU 不匹配?

他们(“规范”的作者)希望人们对产生这些过大数据包的设备做什么?

同一广播域内的 MTU 1504 和 MTU 1500 只是配置错误;不应该期望它比不匹配的 IP 网络掩码或不匹配的 IP 子网更有效。您的公司将不得不全力以赴并修复 MTU 不匹配的根本原因……此时很难说根本原因是用户错误、实施错误还是上述的某种组合。

如果受影响的 Windows 计算机成功登录到 Active Directory 域,则可以编写 Windows 登录脚本以根据域登录脚本中的一些构建良好的测试自动修复 MTU 问题(假设域控制器不是 MTU 的一部分)问题)。

如果机器未登录到域,则手动劳动是另一种选择。

遏制损害的其他可能性

使用第 3 层交换机Note 1为任何已损坏 MTU 的设备构建自定义 vlan,并设置第 3 层交换机的以太网 MTU 以匹配损坏的机器;这依赖于PMTUD来解决 IP 层的 MTU 问题。第 3 层交换机生成PMTUD所需的 ICMP 错误

如果您可以使用 DHCP 重新寻址损坏的机器,则此选项最有效;并且您可以通过 mac 地址识别损坏的机器。

... 为什么他们首先将其增加到 1504 字节,并创建无效的数据包?

目前很难说

802.1ad 与 802.1q

当数据包太大时,IEEE 802.1ad(又名 VLAN Tagging,QinQ)如何有效?

到目前为止,我还没有看到您使用QinQ 的证据从我目前看到的有限证据来看,您使用的是简单的802.1q封装,假设 NIC 驱动程序支持802.1q封装,它应该可以在 Windows 中正常工作


尾注

注 1任何第 3 层交换机都应该做... Cisco、Juniper 和 Brocades 都可以执行这种功能。

我可以尝试回答您的概念性问题。

我找不到实际报价,但很明显 .1ad 和 .1q 从未打算由 PC 或其他终端主机处理。它们(通常)仅由基础设施设备处理。我不知道设计者的想法是什么,但很难想象在现实生活中QinQ 数据包会去往PC。基础设施设备(路由、交换机等)上的以太网接口可以处理更大的数据包。

所以这些数据包只对 PC 无效,理论上应该永远不会看到它们。