无论站点基础设施的 MTU 设置如何,家庭 PPPoE 连接是否可以访问所有网站?

无论站点基础设施的 MTU 设置如何,家庭 PPPoE 连接是否可以访问所有网站?

我只是想了解一下 MTU、MRU 和 MSS。

我的兴趣最初来自于这篇文章的答案: PING 的安全风险?

某些 ICMP 数据包类型绝不能被阻止,特别是“目标不可达”ICMP 消息,因为阻止该消息会破坏路径 MTU 发现,症状是 DSL 用户(在将 MTU 限制为 1492 字节的 PPPoE 层后面)无法访问阻止这些数据包的网站(除非他们使用其 ISP 提供的 Web 代理)。

我发现本文支持这一观点的是:

一些运行 Web 服务器的人(尤其是一些银行)设置了他们的网络,以便阻止数据包太大时发回的错误消息。如果他们没有尝试发送设置了 DF 位的 1,500 字节数据包,情况就不会太糟。结果是当数据包到达低于 1,500 MTU 的链路时被丢弃,并且必须重试。最终它可能会尝试更小的数据包大小,但这可能需要 20 秒。这是运行 Web 服务器的人愚蠢的网络设置。

我的问题是:这真的是一个问题吗?据我所知,我从未在使用 PPPoE 的 BT Infinity 连接上看到过这种情况。据推测,这具有与上述相同的限制(我的路由器 MTU 设置为 1492)。

难道我的路由器默默地雇用MSS 夹紧

答案1

MTU 代表最大传输单元即 IP 数据报大小限制(以字节为单位)。以太网允许的默认最大 MTU 为 1500。

假设我们有一个如下所示的网络。C 是客户端;S 是服务器;X 和 Y 是路由器。

 ___          ___          ___          ___
| C |        | X |        | Y |        | S |
|___|========|___|--------|___|========|___|

C 和 S 之间有四个网络。其中三个的最大 MTU 为 1500,一个的 MTU 较低,为 1200(仅作为示例)。MTU 较低的网络以破折号标记。

C 在到 S 的路径上尝试路径 MTU 发现。它发送一个 IP 数据报,该数据报包含 20 B 报头和 1480 B 有效负载,总共 1500 B。不要分裂IP 头中设置了(DF)标志。

数据报到达 X。X 尝试将其进一步传递给 Y,但 Y 响应需要碎片化ICMP 消息,因为其 MTU 太低,并且设置了 DF 标志。C 收到该消息并获悉路径 MTU 低于 1500。然后它再次尝试使用较小的有效载荷,每次都收到需要碎片化,直到有效载荷大小达到1180B。1180+20=1200,因此数据报最终成功到达S,并且发现路径MTU。

PMTUD 仅在 Y 回复时起作用需要碎片化ICMP 消息。否则 C 不会知道数据报已被丢弃。

您的路由器发送正确的 ICMP 消息,一切都按预期工作,没有理由因为较低的 MTU 而导致互联网中断。


如果 PMTUD 不起作用会发生什么情况?(例如,由于任一方向的 ICMP 都被阻止)

连接的两端实际上都不需要知道路径 MTU。IP 协议可以处理这个问题。它可能不是最优的,但它可以工作。

无论路径 MTU 是多少,IP 都能够传输任意大小的有效载荷。此属性由OSI 模型:IP 在第 3 层工作。第 4 层不必关心底层协议,因此可以对有效负载设置任何大小限制。

基本 IP 报头长度为 20 个字节。此报头包含两个有趣的标志:不要分裂(DF)和更多片段(MF),以及片段偏移字段(FO)。我之前已经提到过 20 B 的报头大小和 DF 标志。(我说的是IPv4 报头,IPv6 不同)

IP 能够将较大的有效载荷分割成片段,然后在目的地重新组装。

假设我们要将 5000 B 的有效载荷从 C 传输到 D,它们都位于同一网络中(即通过交换机或集线器连接)。C 和 D 的 NIC 的 MTU 为 1500。每个片段的标头长度为 20 B,因此单个数据报的最大数据大小为 1480 B(1500 - 20)。有效载荷将分 4 个数据报发送:(MF -更多片段, FO -片段偏移

  1. 字节 1-1480,MF:1,FO:0
  2. 字节 1481-2560,MF:1,FO:1480
  3. 字节 2561-4440,MF:1,FO:2560
  4. 字节 4441-5000,MF:0,FO:4440

在这种情况下,DF 标志无关紧要。MF 为 0 表示最后一个片段,否则为 1。FO 是片段中第一个字节的偏移量(偏移量从 0 开始索引)。这些数据报将在目标 NIC 上自动重组。

现在 C 想要向 S 发送一个 5000 B 的有效载荷。我们假设它神奇地知道路径 MTU(或者 C 的 NIC 配置为 MTU=1200,因此 C 发送 1200 B 数据报)。它将像这样对有效载荷进行分段:

  1. 字节 1-1180,MF:1,FO:0
  2. 字节 1181-2360,MF:1,FO:1180
  3. 字节 2361-3540,MF:1,FO:2360
  4. 字节 3541-4720,MF:1,FO:3540
  5. 字节 4721-5000,MF:0,FO:4720

这是有效载荷的最优分片。

如果 C 不知道并且无法确定路径 MTU,则必须依靠中间节点来正确分割有效载荷。C 的 MTU=1500,因此它会发送 4 个数据报,如上面的 C→D 示例所示。但是,这些数据报必须再次分割才能通过 X—Y 连接传输。Y 收到的每个数据报的长度最多为 1200 B,因此 1500 B 长的数据报将分成两部分:1200 B 和 320 B(第二个报头额外 20 B)。这种分割导致 7 个数据报(因此有 7 个报头)从 X 传输到 S,而不是最佳的 5 个:

  1. 字节 1-1180,MF:1,FO:0
  2. 字节 1181-1480,MF:1,FO:1180
  3. 字节 1481-2260,MF:1,FO:1480
  4. 字节 2261-2560,MF:1,FO:2260
  5. 字节 2561-4140,MF:1,FO:2560
  6. 字节 4141-4440,MF:1,FO:4140
  7. 字节 4441-5000,MF:0,FO:4440

注意,这次碎片并不相等。数据报不会在中间节点重新组合并再次以最佳方式进行碎片化,而只会进行碎片化。

实际上,中间路由器可能被配置为拒绝自己执行分段,并要求传输端点使用最佳 MTU,因此不应依赖中间节点分段。PMTUD 是首选。

相关内容