内核是否进行了碎片整理

Is kernel did de-fragmentation

当我在 linux 收到带有 recv 的数据包时,内核是否进行了碎片整理,所以我会得到碎片整理数据?或者我应该在 user-space?

上处理它

当通过 SOCK_DGRAM 类型的套接字接收 UDP 数据时,您只会收到完整的数据报(假设您的输入缓冲区足够大,可以接收它)。

任何 IP 碎片都是从用户空间透明处理的。

如果您使用的是原始套接字,那么您需要自己处理碎片整理。

ip 碎片发生在协议栈的 IP 层。由于分段,TCP 和 UDP 层已经接收到重组的数据包,因此 TCP 可以接收完整的段(尽管 TCP 试图从不发送导致分段数据包的段)并且 UPD 接收完整的数据报以保留数据报边界。

仅当您使用原始套接字时,您才会收到原始数据包。 (这意味着 IP 数据包的片段)TCP 为您提供已经可靠的数据流(保留数据序列、重复和重传 missing/faulty 数据包),udp 为您提供发送时的数据报,或者什么也没有。

当然,所有这些模块都在内核中,所以重组数据包的是内核。值得注意的是,一旦一个数据包被分片,它在到达目的地之前不会被重组,所以它是目的地的 IP 层负责重组碎片。