2011-02-24 34 views
3

说有两种方案的计算机上运行(为了简化起见,运行在Linux上的唯一用户程序),它的一个调用的recv(),并且其中一个是使用PCAP以检测传入的数据包。一个数据包到达,它被程序使用pcap和程序使用recv检测到。但是,是否有任何情况(例如recv()在对pcap_next())的调用之间返回,其中两个中的哪一个不会获取数据包?recv是否从pcaps缓冲区中移除数据包?

我真的不明白的缓冲系统是如何工作的在这里,所以更详细的解释越好 - 有没有在这些计划的人会看到一个包,其他没有任何可能的情况下?如果是这样,那是什么,我该如何预防它?

回答

2

据我所知,确实存在,其中一个将接收到数据的情况下,另一个不会(双向)。我可能在这里弄错了一些细节,但我确定有人会纠正我。

PCAP使用不同的机制来嗅探接口,但这里的一般情况下是如何工作的:

  • 网卡接收数据包(驱动程序通过中断通知)
  • 内核的地方是包为适当的聆听队列:例如,
    • TCP堆栈。
    • 桥接驱动程序,如果接口被桥接。
    • PCAP使用的接口(原始套接字连接)。
  • 这些缓冲器被刷新彼此独立地:
    • 作为TCP流被组装和数据传送到处理。
    • 由于网桥将数据包发送到适当的连接接口。
    • 随着PCAP读取收到的数据包。

我猜想,有保证两个程序同时接收数据包没有艰辛的道路。这需要在缓冲区满时阻塞(这可能导致饥饿,死锁,各种问题)。以太网以外的其他互联可能是可能的,但总体思路是尽力而为。

,除非系统重负载下不过,我要说的是,损失率是相当低的,大多数的数据包将被所有人接受。您可以通过增加缓冲区大小来降低丢失风险。快速谷歌搜索调整this了,但我相信有更多的方法来做到这一点。

如果需要硬性保证,我觉得需要一个更强大的网络模型。我听说过关于Netgraph这些类型任务的很棒的东西。你也可以安装一个检查数据包的物理盒子(你可以得到最难的保证)。