2011-02-24 102 views
3

說有兩種方案的計算機上運行(爲了簡化起見,運行在Linux上的唯一用戶程序),它的一個調用的recv(),並且其中一個是使用PCAP以檢測傳入的數據包。一個數據包到達,它被程序使用pcap和程序使用recv檢測到。但是,是否有任何情況(例如recv()在對pcap_next())的調用之間返回,其中兩個中的哪一個不會獲取數據包?recv是否從pcaps緩衝區中移除數據包?

我真的不明白的緩衝系統是如何工作的在這裏,所以更詳細的解釋越好 - 有沒有在這些計劃的人會看到一個包,其他沒有任何可能的情況下?如果是這樣,那是什麼,我該如何預防它?

回答

2

據我所知,確實存在,其中一個將接收到數據的情況下,另一個不會(雙向)。我可能在這裏弄錯了一些細節,但我確定有人會糾正我。

PCAP使用不同的機制來嗅探接口,但這裏的一般情況下是如何工作的:

  • 網卡接收數據包(驅動程序通過中斷通知)
  • 內核的地方是包爲適當的聆聽隊列:例如,
    • TCP堆棧。
    • 橋接驅動程序,如果接口被橋接。
    • PCAP使用的接口(原始套接字連接)。
  • 這些緩衝器被刷新彼此獨立地:
    • 作爲TCP流被組裝和數據傳送到處理。
    • 由於網橋將數據包發送到適當的連接接口。
    • 隨着PCAP讀取收到的數據包。

我猜想,有保證兩個程序同時接收數據包沒有艱辛的道路。這需要在緩衝區滿時阻塞(這可能導致飢餓,死鎖,各種問題)。以太網以外的其他互聯可能是可能的,但總體思路是盡力而爲。

,除非系統重負載下不過,我要說的是,損失率是相當低的,大多數的數據包將被所有人接受。您可以通過增加緩衝區大小來降低丟失風險。快速谷歌搜索調整this了,但我相信有更多的方法來做到這一點。

如果需要硬性保證,我覺得需要一個更強大的網絡模型。我聽說過關於Netgraph這些類型任務的很棒的東西。你也可以安裝一個檢查數據包的物理盒子(你可以得到最難的保證)。