内核是否进行了碎片整理
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 层负责重组碎片。
当我在 linux 收到带有 recv
的数据包时,内核是否进行了碎片整理,所以我会得到碎片整理数据?或者我应该在 user-space?
当通过 SOCK_DGRAM
类型的套接字接收 UDP 数据时,您只会收到完整的数据报(假设您的输入缓冲区足够大,可以接收它)。
任何 IP 碎片都是从用户空间透明处理的。
如果您使用的是原始套接字,那么您需要自己处理碎片整理。
ip 碎片发生在协议栈的 IP 层。由于分段,TCP 和 UDP 层已经接收到重组的数据包,因此 TCP 可以接收完整的段(尽管 TCP 试图从不发送导致分段数据包的段)并且 UPD 接收完整的数据报以保留数据报边界。
仅当您使用原始套接字时,您才会收到原始数据包。 (这意味着 IP 数据包的片段)TCP 为您提供已经可靠的数据流(保留数据序列、重复和重传 missing/faulty 数据包),udp 为您提供发送时的数据报,或者什么也没有。
当然,所有这些模块都在内核中,所以重组数据包的是内核。值得注意的是,一旦一个数据包被分片,它在到达目的地之前不会被重组,所以它是目的地的 IP 层负责重组碎片。