1. 程式人生 > >分享一個NS3學習思路(ARP傳送時間間隔、傳送次數修改設定)

分享一個NS3學習思路(ARP傳送時間間隔、傳送次數修改設定)

        這段時間,一直在做隨機移動的無線節點間通訊的相關編碼,多次實驗捕包發現,當兩節點距離較遠時(超出了無線通訊距離範圍),傳送的arp探測包是固定在4次的,傳送時間間隔約為1s,無論重複傳送動作多少次,只能捕捉到4個arp包。

        這兩天和小夥伴仔細的看了很多NS3原始碼,順著邏輯推,也還是沒找到其原因。在此過程中,發現使用socket資料傳送時,在arp-la-protocol.cc中,首先呼叫Lookup函式查詢是否存在路由條目,若沒有,則Lookup函式呼叫SendArpRequest函式進行arp詢問。測試發現,Lookup函式無論呼叫多少次,SendArpRequest函式都是呼叫4次,當時判斷,肯定是在Lookup呼叫SendArpRequest函式時對呼叫次數進行了相關設定,但反覆查看了相關函式程式碼後,仍舊沒有找到原因。

        由於這幾天查看了大量程式碼還是沒有找到解決方案,我決定換個思路來解決,想著看看NS3原始碼中能夠實現反覆探測傳送的Application找找思路。在NS3官網看OnOffApplicaiton時,發現其大量使用了Simulator::Schedule函式;對應察看了v4ping.cc,發現其反覆傳送功能是通過在Send函式中,使用Simulator::Schedule (m_interval, &V4Ping::Send, this)實現了對於send的反覆呼叫,類似遞迴思路。然後在官網查看了SendArpRequest函式的被呼叫關係圖,呼叫它的函式為CreateCache和Lookup,Lookup之前已經研究過了,所以就看了一下CreateCache.

        看CreateCache驚然發現,有這麼一個函式,SetArpRequestCallback (MakeCallback (&ArpL3Protocol::SendArpRequest, this)),使用了SendArpRequest。對啊!在遞迴的send呼叫過程中,肯定是使用了回撥函式來結束呼叫的嘛,於是又去看了看SetArpRequestCallback這個函式,它的官網解釋是This callback is set when the ArpCache is set up and allows the cache to generate an Arp request when the WaitReply time expires and a retransmission must be sent.,一個很重要的引數出來了,WaitReply time。再接著看WaitReply time,進而在arp-cache.cc裡找到了想要修改的兩個引數,WaitReplyTimeout和MaxRetries,可改原始碼,也可通過命令列直接修改,終於解決了自己困擾已久的問題。

        因為是剛入門學習NS3使用,走了很多彎路,在此分享一下自己利用官網和原始碼進行學習的思路,幫助自己總結,也希望能給其他小夥伴一些幫助,各位大神如果看到有說的不對的地方,或者有比較好的學習方法,謝謝提出哦~