2

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

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

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

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

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

4

1 回答 1

-1

首先,必须区分本地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. EMSGSIZE使用连接的 UDP 套接字,并通过减小数据包大小来应对错误;或者

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

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

于 2016-08-07T23:41:42.720 回答