2015-01-02 23 views
0

I 需要知道我的Rx正在收到的數據包是否爲ARP以便爲我的進程丟棄它們。我的數據包裏面有什麼協議? (Ns3)

我已經查看了ns3的手冊和教程,但是我沒有在它們兩個中找到關於哪個協議在數據包內的內容。

ns3中有任何功能或部分讓我知道在我的數據包中的協議?或者需要我查找標題的十六進制代碼並將其與ARP一比較?這應該是極其低效的,因爲我必須在我的模擬中接收每個數據包。 (因爲我沒有完成,我不確定這是正確的方式,也不可能)。

感謝您閱讀

+0

我看到你沒有得到任何答覆,所以我提供了一個賞金來幫助你得到你需要的答案。 –

+0

你可以發佈有問題的軟件包的內容嗎? –

+0

我可以創建它,讓我模擬它。但我解釋說,這不僅僅是一個軟件包。我有兩個設備通過WiFi連接。我正在模擬他們之間的溝通(在sinkpack和bulksenda之間)。我用它們之間的幾個距離重複它。爲了讓「大」包(500B)能夠通過,但是ARP(大約64B)仍然可以,錯誤太高了。所以如果我運行這個模擬並生成pcap文件,我可以檢查它們是否是ARP。我需要這個練習,所以我最終通過尺寸對它們進行過濾。但仍然不知道是否有另一種(更正確的)方式。 –

回答

0

GetUid()不相關;它僅僅是分組數據結構的內部ID,與所攜帶的協議無關。

在ns-3中,數據包按照網絡字節順序被串行化到Buffer對象中,類似於Linux內核skbuffs。正如你所提到的,檢查數據包內容的暴力方法是將數據包內容反序列化(複製)到單獨的緩衝區中,然後選擇字節。但是,有更好的方法。

如果您位於Wifi層,並且想要了解您擁有的數據包是否是ARP數據包,則可以通過以下兩種主要方法來學習此知識。首先,您可以檢查數據包的標題。如果您處於堆棧中WifiNetDevice只添加了LlcSnapHeader的位置,您可以嘗試查看標題並查看協議編號(存儲在「類型」字段中)。給定一個PTR PKT,你可以嘗試:

LlcSnapHeader llc; 
pkt->PeekHeader (llc); 
if (llc.GetType() == 0x0806) 
    { 
    // found an ARP packet 
    } 

但是,請注意,如果你是在堆棧的地方正在使用的各種幀類型,不是所有的數據包將有LlcSnapHeader,所以偷看如上述可能不可靠,或者您可能需要檢查其他可能性。另外,如果你不夠幸運,你關心的標題位於數據包的最前端,請記住,複製數據包並從數據包副本中刪除標題並不昂貴(基本上它們會從標題中彈出堆棧)來找到你想要的標題。

如果您在模擬中啓用了數據包元數據,則可以使用第二種技術。這是一個數據結構,其中包含有關已添加的所有標題和結尾的元數據,並且可以作爲可以掃描標題信息的鏈接列表返回給客戶端。默認情況下,它在模擬性能方面的原因被禁用的,但可以通過調用這個在main()程序開始時啓用:

Packet::EnablePrinting(); 

,然後用包類的BeginItem()迭代器(見ns-3 Doxygen)。就我所知,沒有好的示例程序使用它,但src/network/test中存在可能提供提示的測試套件。

+0

不知道我是否理解它。那麼,如果我在拋出一個phy trace的時候收到這個數據包,LLC應該在上面,我可以使用第一種方法?我已經運行了它,並且每個sigle數據包的協議都是「0」。我在PhyRxEnd的Rx回調中進行檢查。 –