UDP包划分为IP分片时,如何在第一个UDP分片中填写UDP长度?

Posted

技术标签:

【中文标题】UDP包划分为IP分片时,如何在第一个UDP分片中填写UDP长度?【英文标题】:How to fill the UDP length in the first UDP fragment when UDP package divided to IP fragment? 【发布时间】:2021-09-22 08:18:40 【问题描述】:

例如,一个 2000 字节的 UDP 包(包含 UDP 头),网络 MTU 是 1500。所以这个 UDP 包应该分成两个 IP 片段。只有第一个 IP 包包含 UDP 标头。 第一个 IP 包的 UDP 头中的 UDP 长度应该填什么值? 1480还是2000? 有什么文件可以确认吗?

【问题讨论】:

【参考方案1】:

我想你可能想多了。只需将 UDP 长度设置为您的数据大小即可。

在您不知情的情况下(假设您是发送者),IP 分段可能发生在任何路由器跃点上。在将 UDP 数据报传递给应用程序之前,IP 层负责对数据包进行分段和重组。除非您插入 NIC 驱动程序,否则您将无法可靠地判断数据包是否在途中被分段。

如果在途中丢失了 IP 片段,您将根本不会得到任何 UDP 数据报,从应用程序的角度来看,它只会丢失,即使 IP 层可能已经获得了 10 个片段中的 9 个。

Richard Stevens 等人的开创性著作:TCP/IP Illustrated, Volume 1: The protocols ,第 10.7 节 IP 碎片化对此进行了精彩的描述。

【讨论】:

问题是我们正在驱动程序级别进行生成片段和重新组装工作。所以这是我们需要知道的答案。我们需要知道如何设置此长度的正确方式或协议确认方式。 我检查了你的链接,这也有一些错误或混乱。它说“UDP/IPv4 数据报的长度就是 IPv4 数据报的总长度减去 IPv4 报头的长度。”。所以看起来它说这个UDP长度应该用1480(1500 - 20)填充。我认为这个内容不考虑片段,只考虑应用程序级别。所以仍然没有确切的文字来证实这一点。 您在驱动程序级别的上下文中提出问题的事实将是包含在您的原始帖子中的有用信息。也许这个问题更适合在 SE 的网络工程部分提出。这里的大多数答案都是从应用程序的角度来看的。您确定图 10-9(第 10.7.1 节,第 489 页)没有说明您要查找的内容吗? 不,这不能解释。这也只能解释应用程序级别。 当您说“在应用程序级别”时,您是什么意思?我所指的图直观地解释了 IP 片段、偏移量、MF-flag、UDP 标头、UDP 和 IP 长度等概念。这不是您可以在应用程序级别上控制的东西,因为它通常由驱动程序/IP 堆栈实现。我可以建议阅读一下 Richard Stevens 等人的另一本书“TCP/IP 图解:实现,第 2 卷”吗?它可能包含您正在寻找的信息。它有大量的 C 代码来显示协议通常是如何实现的,但可能有点过时了。【参考方案2】:

UDP Length 是 UDP 标头和 UDP 数据的长度,以字节为单位。碎片化将/不应该改变这一点。

[UDP]“长度是这个用户数据报的八位字节长度,包括这个头和数据”——RFC768,一个互联网标准。它也在 Stevens 链接中引用:“参考图 10-2,UDP Length 字段是 UDP 标头和 UDP 数据的长度,以字节为单位。”

【讨论】:

以上是关于UDP包划分为IP分片时,如何在第一个UDP分片中填写UDP长度?的主要内容,如果未能解决你的问题,请参考以下文章

面试冲刺:54---MTU是什么?IP分片是什么?MSS是什么?TCP和UDP会分片吗?它们的关系是什么?

面试冲刺:54---MTU是什么?IP分片是什么?MSS是什么?TCP和UDP会分片吗?它们的关系是什么?

面试冲刺:54---MTU是什么?IP分片是什么?MSS是什么?TCP和UDP会分片吗?它们的关系是什么?

TCP UDP 分段 IP分片

TCP/IP具体解释--UDP数据报中的IP分片

IP报文分段时,为啥必须把头部复制到每个分段上