Sil*_*Fox 1 networking router pppoe mtu icmp
我只是想了解一下 MTU、MRU 和 MSS。
我的兴趣最初来自这篇文章的答案: PING 的安全风险?:
某些 ICMP 数据包类型不得被阻止,特别是“目标不可达”ICMP 消息,因为阻止它会破坏路径 MTU 发现,症状是 DSL 用户(在将 MTU 限制为 1492 字节的 PPPoE 层后面)无法访问网站阻止这些数据包(除非它们使用其 ISP 提供的 Web 代理)。
从那以后,我发现这篇文章支持了这一点:
一些运行网络服务器的人(特别是一些银行)设置了他们的网络,以便他们阻止在数据包太大时发回的错误消息。如果他们不尝试发送 DF 位设置的 1,500 字节数据包,这也不会太糟糕。结果是数据包在到达低于 1,500 MTU 的链路时被丢弃并且必须重试。最终它可能会尝试更小的数据包大小,但这可能会在 20 秒之后。这是运行 Web 服务器的人的愚蠢网络设置。
我的问题是:这实际上是一个真正的问题吗?据我所知,我从未在使用 PPPoE 的 BT Infinity 连接上看到这种情况。据推测,这具有与上述相同的限制(我的路由器 MTU 设置为 1492)。
MTU 代表最大传输单元,即。IP 数据报大小限制(以字节为单位)。以太网允许的默认和最大 MTU 为 1500。
假设我们有一个像下面这样的网络。C是客户;S是服务器;X 和 Y 是路由器。
___ ___ ___ ___
| C | | X | | Y | | S |
|___|========|___|--------|___|========|___|
Run Code Online (Sandbox Code Playgroud)
C 和 S 之间有四个网络。其中三个的最大 MTU 为 1500,一个的 MTU 较低,为 1200(仅作为示例)。低 MTU 网络用破折号标记。
C 在到 S 的路径上尝试 Path MTU Discovery。它发送一个带有 20 B 标头和 1480 B 有效载荷的 IP 数据报,总共 1500 B。在不片段(DF)标志是在IP报头中设置。
数据报到达 X。X 试图将其进一步传递给 Y,但 Y 以需要分段的ICMP 消息响应,因为它的 MTU 太低并且设置了 DF 标志。C 收到该消息并获知路径 MTU 低于 1500。然后它再次尝试使用较小的有效载荷,每次接收Fragmentation required,直到有效载荷大小达到 1180 B。1180 + 20 = 1200,因此数据报最终成功到达 S 和路径MTU 被发现。
PMTUD 仅在 Y 回复需要 Fragmentation 的ICMP 消息时才起作用。否则 C 不会知道数据报被丢弃了。
您的路由器发送正确的 ICMP 消息,一切都按预期工作,没有理由因为 MTU 较低而导致 Internet 中断。
如果 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 -片段偏移)
在这种情况下,DF 标志无关紧要。最后一个片段的 MF 为 0,否则为 1。FO 是片段中第一个字节的偏移量(偏移量从 0 开始索引)。这些数据报将在目标 NIC 上自动重新组装。
现在 C 要向 S 发送 5000 B 的有效负载。假设它神奇地知道路径 MTU(或者 C 的 NIC 配置为 MTU=1200,因此 C 发送 1200 B 数据报)。它将像这样对有效负载进行分段:
这是有效载荷的最佳分段。
如果 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 个:
请注意,这次片段不相等。数据报不会在中间节点中重新组合和再次分片,只执行分片。
在实践中,中间路由器可能被配置为拒绝执行分段并要求传输端点使用最佳 MTU,因此不应依赖中间节点分段。PMTUD 是首选。
| 归档时间: |
|
| 查看次数: |
438 次 |
| 最近记录: |