【发布时间】:2021-01-07 18:03:15
【问题描述】:
当我在 linux 收到带有recv 的数据包时,内核是否进行了碎片整理,所以我将获得碎片整理数据?还是我应该在用户空间处理它?
【问题讨论】:
当我在 linux 收到带有recv 的数据包时,内核是否进行了碎片整理,所以我将获得碎片整理数据?还是我应该在用户空间处理它?
【问题讨论】:
ip 分片发生在协议栈的 IP 级别。由于分段,TCP 和 UDP 层已经接收到重组的数据包,因此 TCP 可以接收完整的分段(尽管 TCP 尝试从不发送导致分段数据包的分段)并且 UPD 接收完整的数据报以保留数据报边界。
仅当您使用原始套接字时,您才会收到原始数据包。 (这意味着 IP 数据包的片段)TCP 为您提供已经可靠的数据流(保留数据序列、丢失/错误数据包的重复和重新传输),而 udp 为您提供发送时的数据报,或者什么都没有。
当然,所有这些模块都在内核中,所以重构数据包的是内核。值得注意的是,一旦一个数据包被分片,它直到到达目的地才会被重组,所以目的地的 IP 层负责重组分片。
【讨论】:
当通过SOCK_DGRAM 类型的套接字接收 UDP 数据时,您只会收到完整的数据报(假设您的输入缓冲区足够大以接收它)。
任何 IP 分片都是从用户空间透明处理的。
如果您使用的是原始套接字,那么您需要自己处理碎片整理。
【讨论】:
SOCK_DGRAM ?
socket 函数的内容知道套接字类型。
libpcap 使用的是原始套接字吗?