recv是否从pcaps缓冲区中删除数据包?

假设计算机上运行了两个程序(为简化起见,在
linux上运行的唯一用户程序),其中一个调用recv(),其中一个使用pcap来检测传入的数据包.数据包到达,程序使用pcap检测,程序使用recv检测.但是,有没有任何情况(例如recv()在调用pcap_next()之间返回),其中这两个中的一个不会获得数据包?

我真的不明白缓冲系统如何在这里工作,所以更详细的解释越好 – 是否有任何可以想象的情况,其中一个程序会看到另一个没有的数据包?如果是这样,它是什么以及如何防止它?

最佳答案 AFAIK,确实存在一个人会收到数据而另一个人不会(两个方面)的情况.我可能在这里弄错了一些细节,但我相信有人会纠正我.

Pcap使用不同的机制来嗅探接口,但这是一般情况的工作方式:

>网卡接收数据包(通过中断通知驱动程序)
>内核将该数据包放入适当的侦听队列:例如,

> TCP堆栈.
>桥接驱动程序,如果接口已桥接.
> PCAP使用的接口(原始套接字连接).

>这些缓冲区彼此独立刷新:

>随着TCP流的组装和数据传递到流程.
>当网桥将数据包发送到适当的连接接口时.
>当PCAP读取收到的数据包.

我猜想没有什么难的方法可以保证两个程序都收到这两个数据包.这将需要在缓冲区满时阻塞缓冲区(这可能导致饥饿,死锁,各种问题).除了以太网之外的互连可能是可能的,但是一般的理念是尽力而为.

但是,除非系统负载很重,否则我会说损失率非常低,大多数数据包都会被所有人接收.您可以通过增加缓冲区大小来降低丢失风险.一个快速的谷歌搜索调整了this,但我敢肯定有更多的方法来做到这一点.

如果你需要硬保证,我认为需要一个更强大的网络模型.我听说过Netgraph这些任务的好消息.您还可以安装一个检查数据包的物理盒(这是您可以获得的最难保证).

点赞