【问题标题】:How does MTU retransmission work in case of UDP在 UDP 的情况下 MTU 重传如何工作
【发布时间】:2016-12-13 13:22:57
【问题描述】:

众所周知,UDP 不支持重传以及其他一些事情。

我们也知道像 MTU 这样的东西,它基本上以以下方式工作——当源点和目标点之间路径上的一个网络设备不支持某种大小的数据包时,它就会丢弃它。

在 TCP 的情况下,这不是问题——它在握手后已经知道 MSS 总是小于 MTU(对吗?),因此不可能发送大小大于 MTU 的数据包。

但是,我想知道在 UDP 的情况下它是如何工作的?正如我已经说过的,这个协议中没有重传,也没有像 MSS 这样的东西。那么当超过 MTU 导致丢包时会发生什么?

或者它只是因为 MTU 的性质而起作用(它实际上属于 IP 层,而不是像 UDP 或 TCP 这样的传输层协议)?那么 IP 层以更小的单元重构丢弃的数据包并再次发送?

【问题讨论】:

  • 这就是 ICMP 的用途。由于 MTU 而丢弃数据包的路由器将向发送者发送 ICMP 错误消息。
  • @Ron Maupin 然后会发生什么?
  • 您可以忽略该消息,也可以调整 MTU。我不确定您为什么如此担心 MTU。您将因拥塞和拥塞避免机制而丢失数据包。例如,RED(随机早期检测)将随机丢弃数据包以防止缓冲区被填满。完整的缓冲区只会丢弃进入其中的所有其他内容,这可能会导致 TCP 出现严重问题。
  • @Ron Maupin 我只是想知道这个级别的情况如何。所以它也适用于 UDP 数据包(不仅适用于 TCP),因为它属于 IP 层,对吧?那么 IP 层收到超过 MTU 大小的 ICMP 数据包并相应地对 TCP 或 UDP 消息进行重组?
  • 如果路由器对数据包进行分段,它不会发送 ICMP 消息,因为它会转发分段。只有当路由器由于 MTU 问题而丢弃数据包时,它才会发送 ICMP 消息。路由器并不真正关心第 4 层协议,因为分段在第 3 层的 IPv4 中。可能数据包设置了DF位,路由器不会分片。

标签: networking tcp network-programming udp mtu


【解决方案1】:

首先要区分local MTU,即本地链路的MTU,和路径MTU(PMTU),即本地链路的最小MTU。考虑以下拓扑:

    1500       1480       1500
A -------- B -------- C -------- D

那么 A 的本地 MTU 为 1500,但 PMTU 仅为 1480。

当路由器 B 收到它需要转发的大小为 1500 的数据包,并且设置了 DF 位时,它会使用下一跳的 MTU(在本例中为 1480)将 ICMP 数据包发送回发送者。然后,发送方可以减小数据包大小。

在 TCP 中,这是由网络堆栈透明地完成的。在 UDP 中,应用程序需要处理它。有三种方法可以做到这一点:

  1. 总是发送足够小的数据包; 1024 总是比 IPv6 安全,512 通常(但不总是)比 IPv4 安全;

  2. 使用已连接的 UDP 套接字,并通过减小数据包大小来响应 EMSGSIZE 错误;或

  3. 使用任何类型的 UDP 套接字,请求 PMTU 辅助数据,并使用提供的数据。

技术(3)是最有效的。对于 IPv6,在Section 11.3 of RFC 3542 中进行了描述。

【讨论】:

  • 576 在 IPv4 中总是安全的。
  • 感谢您的回答。如果没有设置DF位怎么办?
  • @EJP 576 仅在未设置 DF 位的情况下在 IPv4 中是安全的 - 允许低于 576 的 MTU(最小值为 68),但每个节点必须能够重新组装一个 576 字节的数据包。 FrozenHeart,如果没有设置DF位,路由器B会将数据包透明分片给发送方;这是低效的,不应该在现代应用程序中使用。
  • 怎么会这样?您可以通过 MTU 发送 UDP,并且处理它的较低协议以及重传或至少保证节点之间的数据包传递是很重要的。否则 UDP over MTU 将永远无法工作,它确实......
猜你喜欢
  • 2018-09-29
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
相关资源
最近更新 更多