我的笔记本电脑和路由器之间有千兆以太网连接,还有可用的 ipv6 互联网连接。我可以从互联网上的站点接收非常大的数据包,大小至少可达 10000 字节(根据 wireshark)。(编辑:原来是 linux 的“通用接收卸载”)但是,当尝试发送任何内容时,我的本地计算机在 ipv6 中碎片化在 1500 字节以下。(在 ipv4 上,我可以向互联网发送至少 1514 字节的 tcp 数据包,我可以使用配置的 mtu 为 6128 的数据包进行 ping,但它们被黑洞了。)
我在 ubuntu 12.04 上。我已使用ip link set dev eth0 mtu 6128
NetworkManager 小程序 gui 为 eth0 配置了 6128 的 mtu(它接受的最大值),然后重新启动了连接。ip link show eth0
显示确实设置了 6128 mtu。ip -6 route
显示内核所知道的所有路径均未设置 mtu。我可以通过 ipv4 ping 最大 6128 字节的数据包(尽管我没有收到响应),但当我这样做时,ping6 myrouter -c3 -s1500 -Mdo
我收到了错误回复从我自己的电脑说数据包太大,mtu 是 1480。我已经使用 Wireshark 确认线路上没有放置任何东西,并且回复确实是由我自己的计算机生成的。
那么,如何让我的计算机使用更大的 mtu?
答案1
您看到的很可能不是巨型帧。毕竟,99.9% 的互联网都在 1500 字节和更低的 MTU 上运行。可能只是您的内核或网卡在合并数据包。
它使用通常称为通用接收卸载 (GRO) 或大型接收卸载 (LRO) 的功能来实现这一点。其工作方式是识别和合并单个流中的数据包,然后将其馈送到 TCP/IP 堆栈。这可以节省大量 CPU 周期,因为它减少了往返堆栈的次数。
试试这个:ethtool -K $INTERFACE gro off
这将关闭此功能并使 wireshark 更高效(但不是你的 CPU)
您仍然可以在本地使用更高的 MTU,但由于这样的功能以及更快的硬件,它不再能为您带来太多好处。此外,它还可能成为管理噩梦。有许多有缺陷的驱动程序和硬件,并且操作系统对通过 DHCP 或 RA 设置 MTU 的支持程度各不相同。由于您希望给定广播域中的所有设备都运行相同的 MTU,这通常会使巨型帧变得不切实际。
答案2
MTU 主要用于本地。在多个网络跳转(如路由器+互联网)上使用巨型帧很棘手,很可能行不通。例如,DSL 通常会限制路径 MTU至 1492 字节。一般来说,路径 MTU 由参与路由器之间最小的链路 MTU 决定。除非您控制整个路径并为每个链路设置较大的 MTU,否则仅在您的计算机上增加 MTU 不会产生任何效果(除了可能提高您的 LAN 速度)。
答案3
根据 Stefan Seidel 的评论,我找到了如何做到这一点的方法。原来还有另一个ip
命令未显示的 mtu 设置。在/proc/sys/net/ipv6/conf/eth0/mtu
(命令中设置一个更高的值可以达到我想要的效果。(这并没有多大帮助,路由器确实丢弃了较大的帧。)此值通过路由器通告定期更新/重置。可以通过在 下的同一文件夹中写入来sudo sh -c "echo 0 > /proc/sys/net/ipv6/conf/eth0/mtu"
禁用 RA 。0
accept_ra
/proc