Networking 在UDP情况下,MTU重传如何工作

Networking 在UDP情况下,MTU重传如何工作,networking,tcp,network-programming,udp,mtu,Networking,Tcp,Network Programming,Udp,Mtu,众所周知,UDP不支持重传以及其他一些功能 我们也知道MTU这样的东西基本上是这样工作的——当源点和目标点之间的路径上的一个网络设备不支持某种大小的数据包时,它只会丢弃它 在TCP的情况下,这不是问题——它已经知道握手后的MSS总是小于MTU(对吗?),所以不可能发送大于MTU的数据包 然而,我想知道在UDP的情况下它是如何工作的?正如我已经说过的,在这个协议中没有重传,也没有像MSS这样的东西。那么,当数据包由于超过MTU而被丢弃时会发生什么情况呢 或者它只是因为MTU的特性而工作(它实际上属

众所周知,UDP不支持重传以及其他一些功能

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

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

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


或者它只是因为MTU的特性而工作(它实际上属于IP层,而不是UDP或TCP之类的传输层协议)?因此,IP层以较小的单位重建丢弃的数据包并再次发送?

首先,您必须区分本地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中,应用程序需要处理它。有三种方法可以做到这一点:

  • 始终发送足够小的数据包;1024在IPv6上始终是安全的,512在IPv4上通常(但不总是)是安全的

  • 使用连接的UDP套接字,并通过减小数据包大小对
    EMSGSIZE
    错误作出反应;或

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


  • 技术(3)是最有效的。对于IPv6,如中所述。

    首先,您必须区分本地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中,应用程序需要处理它。有三种方法可以做到这一点:

  • 始终发送足够小的数据包;1024在IPv6上始终是安全的,512在IPv4上通常(但不总是)是安全的

  • 使用连接的UDP套接字,并通过减小数据包大小对
    EMSGSIZE
    错误作出反应;或

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


  • 技术(3)是最有效的。对于IPv6,如中所述。

    这就是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位,路由器将不会分段。这就是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位,路由器不会断开。576在IPv4中始终是安全的。感谢您的回答。如果没有设置DF位怎么办?@EJP 576只有在未设置DF位的情况下才在IPv4中是安全的-允许MTU低于576(最小值为68),但每个节点必须能够重新组装576个八位数据包。FrozenHeart,如果没有设置DF位,路由器B将对发送方透明地分割数据包;这是我