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

时间:2011-02-24 18:05:41

标签: c network-programming buffering pcap recv

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

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

1 个答案:

答案 0 :(得分:2)

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

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

  • 网卡接收数据包(通过中断通知驱动程序)
  • 内核将该数据包放入适当的侦听队列:例如,
    • TCP堆栈。
    • 桥接驱动程序,如果接口已桥接。
    • PCAP使用的接口(原始套接字连接)。
  • 这些缓冲区彼此独立刷新:
    • 随着TCP流的组装和数据传递到流程。
    • 当网桥将数据包发送到适当的连接接口时。
    • 当PCAP读取收到的数据包时。

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

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

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