当发送超过 PMTU 的 UDP 数据包时,系统提示接收方将以分段形式接收数据包。接收方的网络接口或操作系统是否通常会自动重新组装数据包?
如果我不得不猜测,对于 Linux/POSIX 系统,如果使用原始套接字,答案将是“否” SOCK_RAW
- 但如果使用,情况也是如此吗SOCK_DGRAM
?
有人能说一下 Linux、Windows 或 Mac OS 是否进行 IP 数据包重组吗?
我知道IETF 建议不要使用 IP 碎片化,但我试图了解,作为一名网络应用程序开发人员,我对此有多么担心。
答案1
使用 UDP 套接字时,IP 碎片是透明的。操作系统将负责组装碎片。UDP 套接字甚至没有 API 来获取单独的碎片。
请注意,操作系统不需要重组任意片段,如果数据超过特定大小,它们可能会简单地丢弃数据。这很好,因为 UDP 不提供任何可靠性。引用自维基百科:
在 IPv4 中,主机必须尽最大努力尝试重组碎片 IP 数据包,重组后的总大小最多为 576 字节。它们也可能尝试重组大于 576 字节的碎片 IP 数据包,但它们也可以默默丢弃这些较大的数据包。... [稍后将介绍 IPv6 的类似情况]