【发布时间】: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