假定情景:
一个UDP数据流到达机器X,该机器同时运行两个程序,其中一个使用recv()监听数据包,另一个正在运行pcap。
在这种情况下,据我所知,数据包存储在接口中,直到内核轮询该接口,然后将它们移动到内核内存中的缓冲区,并将数据包复制到另外两个缓冲区 - 一个用于使用recv监听的程序,另一个用于使用pcap监听的程序。当数据包被读取时,它们会从各自的缓冲区中删除 - 可以通过pcap_next()或recv()读取,或者下次进程调度程序运行它们时(我假设它们在这种情况下是阻塞的)。这样对吗?是否真的使用了4个缓冲区,还是有其他处理方式?
我想要一个尽可能详细的描述,描述涉及到哪些缓冲区,并且数据包如何从一个缓冲区移动到另一个缓冲区(例如,数据包在进入recv缓冲区之前、之后或未定义时是否会被复制到pcap缓冲区)。
我知道这似乎是一个大问题,但我真正关心的只是数据包存储在哪里,以及它在那里停留的时间有多长。简单列出要点即可。理想情况下,我希望得到一个通用的答案,但如果在不同的操作系统之间有所不同,我最感兴趣的是Linux。
在这种情况下,据我所知,数据包存储在接口中,直到内核轮询该接口,然后将它们移动到内核内存中的缓冲区,并将数据包复制到另外两个缓冲区 - 一个用于使用recv监听的程序,另一个用于使用pcap监听的程序。当数据包被读取时,它们会从各自的缓冲区中删除 - 可以通过pcap_next()或recv()读取,或者下次进程调度程序运行它们时(我假设它们在这种情况下是阻塞的)。这样对吗?是否真的使用了4个缓冲区,还是有其他处理方式?
我想要一个尽可能详细的描述,描述涉及到哪些缓冲区,并且数据包如何从一个缓冲区移动到另一个缓冲区(例如,数据包在进入recv缓冲区之前、之后或未定义时是否会被复制到pcap缓冲区)。
我知道这似乎是一个大问题,但我真正关心的只是数据包存储在哪里,以及它在那里停留的时间有多长。简单列出要点即可。理想情况下,我希望得到一个通用的答案,但如果在不同的操作系统之间有所不同,我最感兴趣的是Linux。
skb_deliver()
中如果我没记错的话)。 - ninjalj