为啥UDP不使用路径MTU?

Posted

技术标签:

【中文标题】为啥UDP不使用路径MTU?【英文标题】:Why UDP does not employ the path MTU?为什么UDP不使用路径MTU? 【发布时间】:2015-04-17 07:22:53 【问题描述】:

据我所知,UDP 不使用路径 MTU 来避免碎片,但 TCP 会这样做。我试图为这种特殊设计提出一个理由。

TCP 需要避免分片,因为即使只有一个分片被丢弃,它也必须重新传输整个数据报。相反,UDP不需要重传数据报,由应用层来保证完整性。

总之,fragment 会减慢 TCP 传输协议而不是 UDP 传输协议。

问题来了,对于需要完整性的通信,无论是采用天然保证完整性的TCP,还是基于UDP开发应用层重传协议,如果没有ACK,就需要重新发送整个数据报。然后,分片会减慢 UDP 上的应用层重传协议,就像 TCP 一样。

我的推理有什么问题?

【问题讨论】:

不清楚您的建议是什么。 UDP 实现会对路径 MTU 做什么?假设路径 MTU 为 1,500 字节,应用程序尝试发送 1,600 字节数据报。目前,数据报由 IP 层分段。你的建议到底是什么? UDP 有何不同之处? 【参考方案1】:

UDP 是一种数据报协议,其中每个数据包都表示一个实体,独立于其他数据包(UDP 未检测到重复、重新排序等)。相反,TCP 是一种流协议,即整个传输由一个类似于大文件的非结构化八位字节流组成。为了使此流的传输更有效,检测连接的 MTU 并尝试发送最大程度超出此 MTU 的大部分数据包是有意义的,从而减少传输的开销。为了进一步减少开销,TCP 会将多个连续写入合并到尽可能少的数据包中(最大 MTU)。

UDP本身无法避免分片,因为它按原样传输数据报,即数据报边界由数据包边界决定。任何减少开销的优化都必须由应用程序本身完成。

因此,TCP 最适合需要保证和有序交付以及有效利用带宽等特性的应用程序。不幸的是,这些功能有一些缺点,例如连接设置速度较慢、延迟较高(在丢包的情况下)等。但是有些应用程序不需要所有好的部分,但必须避免坏部分。例如,实时音频和视频可以处理数据包丢失,但需要低延迟,即所有数据是否都到达并不重要,但它们必须快速到达。在这些情况下,更简单的 UDP 协议更适合。

【讨论】:

【参考方案2】:
    因为它对 MTU 没有任何用处。这是一个数据报协议。 因为没有路径。这是一个无连接协议。

【讨论】:

以上是关于为啥UDP不使用路径MTU?的主要内容,如果未能解决你的问题,请参考以下文章

TCP/IP协议中,传输层如何获知网络层最大传输单元MTU的长度?

TCP路径MTU发现

如何找到我可以在不分段的情况下发送的最大 UDP 数据包?

MTU的概念,什么是路径MTU? MTU发现机制,TraceRoute(了解)

为啥数据报很少超过1500字节

Python网络编程4--实现IP分片与网络路径MTU探测