我正在编写一个客户端 – 服务器python应用程序,其中的一部分正在使用UDP多播进行通信。 而我目前关心的是分裂。
RFC 791 (第24页)说:
每个互联网模块必须能够转发一个68字节的数据报,而不会有进一步的碎片。 这是因为互联网标题可能高达60个八位字节,最小的片段是8个八位字节。
通过阅读上面我明白,我们可以有一个应用层PDU,8字节的大小,可以通过没有碎片。
在Packet Tracer(一个可以在虚拟环境中configuration路由器的应用程序)上,允许的最小MTU是64(见下图)。 这意味着应用层PDU的保证大小可以是4个字节?

我可能没有正确理解这个,所以我希望你的帮助。
问题是:应用层PDU的大小应该是多less,以便包含它的IP数据包可以通过而不被分割? 4或8字节?
RFC791仅指定IP。 由于您将使用UDP,所以您必须读取RFC791以及指定UDP的RFC768 。 UDP Datagram报头是8个八位字节,包括一个最小值为8(报头长度)的两字节长度的字段。
在68字节的最小第3层(IP)PDU中,如果使用UDP作为第4层协议,则可以在不分段的情况下传输最大的高层数据包(当使用最大IP头长度为60个八位字节时)为零八位字节 – UDP数据报头使用的最小八位字节!
如果您希望使用基于IP的UDP传输8个八位字节的应用层数据包,并且您希望IP报头定期达到60个八位字节的最大长度,那么您将需要一个带有76个八位字节或更大MTU的链接,以确保您的数据包不会需要分散。
但是,您应该注意RFC791也说明(页13):
The maximal internet header is 60 octets, and a typical internet Header is 20 octets
如果您假定一个典型的Internet标头大小,通过一个MTU为64个字节的(错误configuration的)链接,您仍然可以在分片之前传输36个字节的应用程序数据包:
MTU - IP_HDR - UDP_HDR = 64 - 20 - 8 = 36 octets
但是,在大多数现实世界的情况下,您不应该遇到这样小的MTU的networking(除非您正在与embedded式/ SCADA世界中的PLC通信,或者另一个类似受限的环境中)。