我正在编写一个客户端-服务器 python 应用程序,其中一部分使用 UDP 多播进行通信。我目前担心的是碎片化问题。
RFC 791(第 24 页)说道:
每个互联网模块必须能够转发 68 个八位字节的数据报而无需进一步分片。这是因为互联网报头可能最多为 60 个八位字节,而最小分片为 8 个八位字节。
通过阅读上述内容,我了解到我们可以有一个 8 字节大小的应用层 PDU,它可以无碎片地传递。
在 Packet Tracer(一个可以在虚拟环境中配置路由器的应用程序)上,允许的最小 MTU 为 64(见下图)。这意味着应用层 PDU 保证大小可以是 4 字节?
我可能没有正确理解这一点,所以我需要你的帮助。
问题是:应用层 PDU 的大小应该是多少,以便包含它的 IP 数据包可以不被碎片化地传递?4 字节还是 8 字节?
答案1
RFC791 仅指定 IP。由于您将使用 UDP,因此您必须结合阅读 RFC791RFC768它规定了 UDP。UDP 数据报头为 8 个八位字节,其中包括一个两八位字节的长度字段,其最小值为 8(报头的长度)。
在最小 3 层 (IP) PDU 为 68 个八位字节的情况下,如果使用 UDP 作为第 4 层协议,则可以传输的无碎片最大高层数据包(当使用最大 IP 报头长度为 60 个八位字节时)为零个八位字节 - UDP 数据报报头已使用了 8 个八位字节的最小值!
如果您希望使用 UDP over IP 来获得 8 个八位字节的应用层数据包,并且您预计 IP 报头通常会达到 60 个八位字节的最大长度,那么您将需要一个 MTU 为 76 个八位字节或更大的链路,以确保您的数据包不需要分段。
但是,您应该注意到 RFC791 还指出(第 13 页):
The maximal internet header is 60 octets, and a typical internet Header
is 20 octets
如果您假设典型的 Internet 报头大小,通过 MTU 为 64 个八位字节的(配置不正确的)链路,您仍然能够在碎片化之前传输 36 个八位字节的应用程序数据包:
MTU - IP_HDR - UDP_HDR
= 64 - 20 - 8
= 36 octets
然而,在大多数实际情况下,您不应该遇到具有如此小的 MTU 的网络(除非您正在与嵌入式/SCADA 世界中的 PLC 或其他类似受限制的环境对话)。