我的计算机的以太网适配器使用 1,500 字节以太网帧。通常这意味着我的本地连接MTU 以字节为1500
单位。
但是我的 (IPv4) 互联网连接有一些开销。这意味着我与互联网通信时的实际 MTU 是1492
。这导致了所有因接口 MTU 配置错误而存在的常见问题。
路由器可以修复它
显然我可以使用netsh
,并用自定义 MTU 覆盖我的网络接口。但我不想这样做。我的路由器的 DHCP 服务器已经知道 MTU 是1492
。如果被询问,DHCP 服务器将使用 DHCP 选项 26 进行响应:
- 二十六MTU 接口=
1492
所以我真的很困惑为什么 DHCP 服务器不告诉我的 Windows 7 机器将 MTU 设置作为它在DHCP 提供:
- 54DHCP 服务器标识符=
192.168.1.1
- 51IP 地址租用时间=
2 hours
- 1子网掩码=
255.255.255.0
- 15域名=
example.local
- 3路由器=
192.168.1.1
- 6域名服务器=
8.8.8.8
,,8.8.4.4
74.82.42.42
不MTU 接口!所以我的机器的以太网卡在了1500
字节数上。
DHCP 服务器做了它应该做的事
经过进一步挖掘,我意识到 DHCP 服务器只向客户端提供问在我的 Windows 7DHCP 发现之后,Windows 7 会枚举它想要返回的所有 DHCP 选项的列表:
- 1子网掩码
- 15域名
- 3路由器
- 6域名服务器
- 四十四TCP/IP 名称服务器上的 NetBIOS
- 四十六TCP/IP 上的 NetBIOS 节点类型
- 四十七TCP/IP 上的 NetBIOS 范围
- 31执行路由器发现
- 33静态路由
- 121无类静态路由
- 249无类静态路由(微软)
- 43供应商特定信息
Windows 7 甚至还没有询问为了最大传输单元!
它必须知道自己在做什么
Windows 必须有一个原因为什么它不要求 MTU;但我不知道它是什么。起初我以为是因为它正在使用路径最大 MTU 发现。但PMTU
只对 TCP 连接有效,使用 TCP MSS
(最大段大小)选项,并且要求本地MSS
选项正确。
在我的例子中,TCP MSS 设置(来自 MTU 选项)是错误的。1460 bytes
1500 interface MTU
- 20 bytes IP header = 1480 bytes
- 20 bytes TCP header
= 1460 bytes MSS
这太高了。
笔记:我可以确认 Windows 正在使用卫星发射系统
SYN
当建立 TCP 连接时,每个数据包的大小为 1460 字节。
如果不是 PathMTU,那是什么?
Windows 7 的想法是什么?故意的行为如何?微软的网络堆栈开发人员认为应该发生什么?
现在假设我的 Internet MTU 实际上是 1472(事实确实如此),并且假设我的以太网适配器实际上使用8,192
字节以太网帧(事实确实如此)。公司应该做什么?我应该走到企业中的每台机器前并输入:
>netsh interface ipv4 set interface interface="Local Area Connection" mtu=1472 store=persistent
这不合理。即使合理,也不是我要求的。
我正在尝试了解 Windows想要发生这样的事。我试图理解它是如何发生的应该表现好。我正试图在这里学习一些东西。假设我的互联网网关是一台 576 字节的 ATM;我该如何指示 Windows 7 机器,如果它们要发送到互联网,MTU 是 576 字节?
额外阅读
答案1
路径 MTU 并非仅限于 TCP,也不使用 MSS(尽管正如您所猜测的,MSS 源自 MTU)。任何接收到太大而无法转发的数据包的跳跃都会将数据ICMP fragmentation needed
包发送回原点。这是第 3 层的一部分,与 TCP 无关。
PMTU 的问题在于传入的 ICMP 数据包经常被丢弃或不转发到源站,因此源站不知道减少数据包大小。
由于您的路由器知道下一跳 MTU 是 1472,因此它应该向您的客户端发送 PMTU 数据包。您可以使用 wireshark 检查这一点,如果没有这样做,则需要修复。
您有几个解决方法。一种是将路由器 MTU 的内部接口设置为 1472,这意味着在路由器进行任何处理之前,它会被执行。另一个选项是(如果您可以使用路由器执行此操作)为每个数据包打开 DF 位。这是一个相当残酷的解决方法,因为任何全尺寸数据包最终都会变成两个单独的数据包,一个小,一个大,从而产生开销。
在公司环境中,可以使用所有这三种方法,但在路由器 LAN 接口上硬设置 mtu 非常常见。
(我从未遇到过使用 DHCP 来调解 MTU 的情况,在大多数情况下它都不是正确的地方,因为内部 MTU 和边界 MTU 通常不同,您可能在内部使用巨型帧,但需要减小到正常大小以适应互联网流量)