gpt4 book ai didi

c - pcap unix 缓冲如何工作?

转载 作者:太空狗 更新时间:2023-10-29 16:44:58 26 4
gpt4 key购买 nike

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

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

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

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

最佳答案

Linux 案例(BSD 可能有些类似,使用 mbuf 而不是 skbuff):

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

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

当某人不再需要 skbuff 时,kfree_skb() 就是它了。 kfree_skb() 递减引用计数,当引用计数达到零时,skbuff 被释放。考虑克隆稍微复杂一些,但这是一般的想法。

关于c - pcap unix 缓冲如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5094957/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com