4

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

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

4

1 回答 1

2

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

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

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

我猜想没有硬性方法可以保证两个程序都接收到两个数据包。这将需要在缓冲区已满时对其进行阻塞(这可能导致饥饿、死锁和各种问题)。使用以太网以外的互连可能是可能的,但总体理念是尽力而为。

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

If you need hard guarantees, I think a more powerful model of the network is needed. I've heard great things about Netgraph for these kinds of tasks. You could also just install a physical box that inspects packets (the hardest guarantee you can get).

于 2011-02-24T20:59:15.463 回答