众所周知,UDP不支持重传以及其他一些事情。
我们也知道像MTU这样的东西基本上按以下方式工作 - 当源点和目标点之间的路径上的一个网络设备不支持某种大小的数据包时,它就会丢弃它。
在TCP的情况下,它不是问题 - 它已经知道握手后的MSS总是小于MTU(我是对的吗?),所以不可能发送一个包大小超过MTU。
但是,我想知道在UDP的情况下它是如何工作的?正如我已经说过的那样,在这个协议中没有重传,并且没有像MSS这样的东西。那么当数据包由于超过MTU而被丢弃会发生什么呢?
或者它只是因为MTU性质而有效(它实际上属于IP层,而不是UDP或TCP等传输层协议)?那么IP层以较小的单位重建丢弃的数据包并再次发送它?
答案 0 :(得分:-1)
首先,您必须区分本地链路的MTU本地MTU和本地链路的最小MTU路径MTU(PMTU)。请考虑以下拓扑:
1500 1480 1500
A -------- B -------- C -------- D
然后A的本地MTU是1500,但是PMTU只有1480.
当路由器B接收到需要转发的大小为1500的数据包并且设置了DF比特时,它会将ICMP数据包发送回具有下一跳MTU的发送方,在这种情况下为1480。然后发件人可以减小数据包大小。
在TCP中,这是由网络堆栈透明地完成的。在UDP中,应用程序需要处理它。有三种方法可以做到:
始终发送足够小的数据包; 1024始终对IPv6安全,512通常(但不总是)比IPv4更安全;
使用连接的UDP套接字,并通过减小数据包大小来对EMSGSIZE
错误作出反应;或
使用任何类型的UDP套接字,请求PMTU辅助数据,并使用提供的数据。
技术(3)是最有效的。对于IPv6,它在Section 11.3 of RFC 3542中描述。