UDP对MTU一无所知。UDP数据包的大小可以在8到65535字节之间。UDP下的协议层可以发送特定大小的数据包,或者如果太大则拒绝发送错误的数据包。
UDP下的层通常是IP,即IPv4或IPv6。IP数据包的大小可以从20(IPv4)/ 40(IPv6)到65535字节,与UDP相同。但是,IP支持一种称为碎片的机制。如果IP数据包的大小大于下一层可以传输的大小,则IP可以将单个数据包拆分为多个称为片段的数据包。实际上,每个片段都是一个自己的IP数据包(具有自己的IP头),并且还自己发送到目的地。然后,目标的任务是收集所有片段并从中重建完整的数据包,然后再将接收的数据传递到下一个更高的层(例如UDP)。
以太网协议只能传输有效载荷介于46到1500字节之间的帧(有例外,但这不在此答复的范围之内)。如果有效载荷数据小于46字节,则将其填充为有效的46字节。如果有效载荷数据超过1500个字节,则接口将拒绝接受它。如果发生这种情况,则由IP层决定是对数据包进行分段,以便没有分段大于1500个字节,或者如果已为此特定连接禁用或禁止分段,则向下一个更高层报告错误。
通常应避免碎片,因为
- 在发送方浪费资源。
- 它浪费了接收方的资源。
- 对于相同数量的有效负载数据,它增加了协议开销。
- 如果单个片段丢失,则整个数据包都会丢失。
- 如果单个片段损坏,则整个数据包都会损坏。
- 如果重新发送,则必须重新发送所有片段。
这就是为什么TCP会智能地采用其帧大小,以便数据包从不需要IP对其进行分段的原因。这可以通过禁止IP对数据包进行分段来完成,如果IP报告数据包太大而无法发送,则TCP会减小帧大小并重试,直到不再报告错误为止。
但是,对于UDP来说,这将是应用程序本身的任务,因为UDP是“哑”协议,它没有自己的管理逻辑,这使其非常灵活,快速和简单。
始终可传输的唯一UDP大小是576减去8个字节的UDP标头和减去20(v4)/ 40(v6)字节的IP标头,因为IP标准要求每个IP主机都必须能够接收带有总大小为576个字节。如果您的协议实现不能接受至少那个大小的数据包,则它不是标准的。但是请注意,该标准不会说没有分段的576,因此即使是576字节的IP数据包也可能会在两个主机之间分段。
无需分段即可传输的唯一数据包大小是IPv4的24个字节和IPv6的56个字节,因为一个片段的最小IP标头为20/48字节(v4 / v6),并且一个片段必须至少具有4/8字节(v4 / v6)有效负载数据。因此,IP层以下的传输系统至少不能传输这些大小的数据包,因此不能用于传输IP流量。
在任何人评论IPv6标头只有40个字节之前:是正确的,但是与IPv4标头不同,标准IPv6标头没有用于分段的标头字段。如果必须对数据包进行分段,则必须在IPv6基本头下方添加分段扩展头,并且此扩展头的长度为8个字节。同样与IPv4不同,IPv6中的分段偏移是以8个字节而不是4个字节为单位进行计数的,因此,在IPv6的情况下,分段只能携带8字节倍数的有效负载。