【问题标题】:Is kernel did de-fragmentation内核是否进行了碎片整理
【发布时间】:2021-01-07 18:03:15
【问题描述】:

当我在 linux 收到带有recv 的数据包时,内核是否进行了碎片整理,所以我将获得碎片整理数据?还是我应该在用户空间处理它?

【问题讨论】:

    标签: c linux udp fragment recv


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 如何通过 /proc/net/udp` 验证套接字是原始的还是 SOCK_DGRAM
      • @axi85136Bcaoo.com 您可以通过传递给socket 函数的内容知道套接字类型。
      • libpcap 使用的是原始套接字吗?
      • @axi85136Bcaoo.com 你需要看看代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-03
      • 2016-03-12
      • 2012-05-13
      • 2019-02-25
      • 1970-01-01
      • 2012-02-22
      相关资源
      最近更新 更多