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).