我有一台承载本地网络的消费级 Wi-Fi 路由器。该路由器通过校园网络连接到互联网(即,以太网电缆将 WAN 端口连接到校园以太网插头)。我tcpdump
在路由器的 WLAN 和 WAN 接口上运行,以捕获连接到路由器的设备产生的流量。
让我感到困惑的是,我看到的帧明显长于 MTU 加上第 2 层报头大小所定义的限制。我最初以为这是由于校园网络支持以太网巨型帧所致,但这些(通常)MTU 上限为 9,000 字节,我看到一些帧的长度几乎达到 13,000 字节。
接下来我想,由于设备是通过 Wi-Fi 连接的,因此它们不受以太网 MTU 的限制,而是受 802.11 MTU 的限制,但那个似乎大约有 2304 字节,因此 13KB 的帧仍然太大。附注:这些帧在 Wireshark 中显示为以太网帧,但这显然是由于 802.11 帧在传送到操作系统的网络堆栈之前被转换为“假”以太网帧所导致的,正如所解释的那样这里:
802.11 适配器经常会将 802.11 数据包转换为伪造的以太网数据包,然后再将其提供给主机;即使不这样做,适配器的驱动程序也经常会在将数据包提供给操作系统的网络堆栈和数据包捕获机制之前这样做。
一些有趣的观察可能会帮助你帮助我阐明这一点:
- 对于在路由器的 WLAN 接口捕获的跟踪,只有来自本地设备并发往 Internet 主机的数据包才超过 MTU。所有入站数据包(Internet 主机到本地设备)的长度不超过 1514。
- 对于在路由器的 WAN 接口捕获的跟踪,只有入站流量(Internet 主机到路由器)超过了以太网 MTU。
- 通过交叉引用这两条跟踪,我们确实可以将路由器一侧捕获的大型帧(超过 MTU)“映射”到路由器另一侧的几个 MTU 大小或更小的帧。
- 这些都是 TLS 流量(但这不会产生任何区别,因为这是第 2 层限制)。
我猜测这种行为可能是由于 TSO/GSO 造成的,基于这个答案。然而,它说应该不是如果在网络设备上执行捕获,则会看到这些更大的帧:
[...] 您可能会看到 TCP 发送的段大于 MTU。但是,线路上的数据包将仅为 MTU 大小。您可以通过在网络设备(交换机)等上进行捕获来验证这一点。
我确实在网络设备(路由器)上执行了捕获,但我仍然看到大帧。但是,路由器运行 LEDE/OpenWrt,我猜这使其成为一种“增强型”网络设备,更接近实际主机而不是网络设备......?
我附上了一个超出 MTU 的帧的示例。请注意,此帧是在路由器的 WAN 接口 ( eth0
) 上捕获的。这仅仅是 TSO/GSO 的结果,还是还有其他我不知道的事情?此外,TSO/GSO 是否双向工作,还是仅适用于出站数据包?如果是后者,则 TSO/GSO 不能作为解释,因为示例数据包从路由器的角度来看是入站的。
更新:在路由器的 WAN 和 WLAN 接口上禁用 TSO/GSO 不会改变任何东西;重新运行实验时,大帧仍然存在。
答案1
这只是您的路由器正在执行 LRO(或者可能是 GRO)。
它不是 TSO/GSO,因为您只能在路由器接收的数据包上看到它,而不是在传输的数据包上看到它。