路由器可以修复它

路由器可以修复它

我的计算机的以太网适配器使用 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.474.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 通常不同,您可能在内部使用巨型帧,但需要减小到正常大小以适应互联网流量)

相关内容