【问题标题】:How does pcap unix buffering work?pcap unix 缓冲如何工作?
【发布时间】:2011-02-23 18:02:33
【问题描述】:

假设场景: 一个 udp 数据包流到达机器 X,它正在运行两个程序 - 一个正在使用 recv() 侦听数据包,另一个正在运行 pcap。

在这种情况下,据我了解,数据包存储在接口中,直到被内核轮询,然后将它们移动到内核内存中的缓冲区,并将数据包复制到另外两个缓冲区 - 一个缓冲区用于使用 recv 监听的程序,以及一个用于使用 pcap 监听的程序的缓冲区。数据包在被读取时从各自的缓冲区中删除——通过 pcap_next() 或 recv(),下一次进程调度程序运行它们(我假设它们在这种情况下是阻塞的)。这个对吗?真的使用了 4 个缓冲区,还是以其他方式处理?

我正在寻找尽可能详细的描述,说明在这种情况下真正涉及哪些缓冲区,以及数据包如何从一个缓冲区移动到另一个缓冲区(例如,一个数据包在它到达之前是否被复制到 pcaps 缓冲区recv 缓冲区,之后,还是未定义?)。

我知道这似乎是个大问题,但我真正关心的只是数据包的存储位置,以及它在那里存放多长时间。项目符号很好。理想情况下,我想要一个一般性的答案,但如果它因操作系统而异,我对 Linux 最感兴趣。

【问题讨论】:

    标签: c operating-system kernel buffer packet


    【解决方案1】:

    Linux 案例(BSD 可能有点相似,使用mbufs 而不是skbuffs):

    Linux 使用 skbuffs(套接字缓冲区)来缓冲网络数据。 skbuff 包含有关某些网络数据的元数据,以及指向该数据的一些指针。

    点击(pcap 用户)创建 skbuff 的克隆。克隆是一个新的 skbuff,但它指向相同的数据。当有人需要修改多个 skbuff(原始 skbuff 及其克隆)共享的数据时,首先需要创建一个新副本(copy-on-write)。

    当某人不再需要 skbuff 时,kfree_skb() 就是它。 kfree_skb() 减少引用计数,当引用计数达到零时,释放 skbuff。考虑克隆会稍微复杂一些,但这是大体思路。

    【讨论】:

    • 那么,您是说 recv() 函数使用内核缓冲区,但每个 pcap 实例都有自己的缓冲区副本?这些克隆是在什么阶段制作的 - 当收到数据包时? pcap 什么时候想读?
    • 每个 pcap 实例都有自己的元数据副本,但它们都共享相同的数据。收到数据包时会进行克隆(在skb_deliver() IIRC 中)。
    猜你喜欢
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2012-01-14
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 2013-03-04
    相关资源
    最近更新 更多