茹新宇,劉 淵
(1.江南大學(xué) 數(shù)字媒體學(xué)院,江蘇 無錫 214122;2.江蘇聯(lián)合職業(yè)技術(shù)學(xué)院 無錫交通分院,江蘇 無錫 214151)
仿真所固有的低成本、虛擬化優(yōu)勢,使其成為極具吸引力的重要科研手段[1]。網(wǎng)絡(luò)仿真目前已是互聯(lián)網(wǎng)算法性能、協(xié)議拓?fù)渥罱?jīng)濟(jì)快捷的評價方法之一。網(wǎng)絡(luò)仿真器主要通過部署虛擬環(huán)境,允許對特定節(jié)點(diǎn)或路徑模擬其網(wǎng)絡(luò)行為,并提供仿真結(jié)果,以便研究、參考或改進(jìn)。借助仿真的高靈活度和可擴(kuò)展性,不同網(wǎng)絡(luò)實(shí)體的協(xié)議算法、概念模型及其拓?fù)浼軜?gòu)可在虛擬環(huán)境中搭建、測試并實(shí)施?,F(xiàn)有工具,如QualNet、OPNET[2]和REAL等,由于使用條款、實(shí)施成本及代碼開源等因素而遠(yuǎn)未普及。鑒于現(xiàn)場布置及情景再現(xiàn)等客觀條件,新網(wǎng)絡(luò)仿真器NS3應(yīng)運(yùn)而生。作為NS2的繼任者,它運(yùn)用全新理念來解決和減輕NS2存在的問題,現(xiàn)已大量部署于實(shí)驗(yàn)場景。它支持當(dāng)前主流協(xié)議,為實(shí)驗(yàn)提供仿真結(jié)果。
文中對NS3進(jìn)行了深入探究,重點(diǎn)闡述了其TCP實(shí)現(xiàn)過程,并提出了具有前瞻性的研究方向。
NS系列仿真器是由UC Berkeley開發(fā)的優(yōu)秀網(wǎng)絡(luò)仿真軟件,使用經(jīng)典的Unix語言作為環(huán)境工具,在GNU/Linux平臺下開發(fā)[3]。為便于安裝、維護(hù)及更新,如今已被移植進(jìn)Windows/Cygwin,BSD及Mac OSX等系統(tǒng)。NS2作為一款開源軟件,支持多種協(xié)議且易于擴(kuò)展,但同時也存在較多問題。如它采用分裂對象模型,在OTcl中編寫腳本,仿真結(jié)果由NAM實(shí)現(xiàn)可視化,卻無法單純從C++運(yùn)行。另外,網(wǎng)絡(luò)層抽象仿真,結(jié)果跟蹤困難,需借助解析文件提取,模型之間互操作及耦合性不足,分析工具“各自為政”。
目前仍在大規(guī)模開發(fā)的NS3項(xiàng)目始于2006年,它廣泛汲取主流仿真器NS2、YANS和GTNets的技術(shù)經(jīng)驗(yàn),用C++語言實(shí)現(xiàn),兼容時下流行的Python,目前已發(fā)展至3.26穩(wěn)定版本。NS2部分模型已移植進(jìn)NS3,使之在功能實(shí)現(xiàn)、版本更新、用戶體驗(yàn)等方面都具有良好表現(xiàn)[4]。其核心及各功能模塊由C++代碼完成[5],對外提供豐富的擴(kuò)展接口[6],可按需更改或增減模塊。NS3包含網(wǎng)絡(luò)組件模擬接口,擁有事件調(diào)度器,可通過執(zhí)行相關(guān)事件,模擬真實(shí)通信“行為”。同時它還具備完美的跟蹤機(jī)制,便于用戶解析數(shù)據(jù)、傳輸過程及分析結(jié)果,詳細(xì)介紹如表1所示。
表1 NS3仿真器的優(yōu)點(diǎn)與特點(diǎn)
NS2及其后繼者NS3具有相同背景、概念和類似目標(biāo),是一離散事件模擬器。雖然目前NS2仍有很大用戶群,但由于NS3的特征及設(shè)計優(yōu)勢,使之日趨成為NS2的可靠替代品。它可較好地規(guī)避前者存在的問題,其協(xié)議和場景均用C++編寫。第三方軟件依賴和源代碼構(gòu)建過程截然不同并優(yōu)于NS2,系統(tǒng)集成度較好。兩者的部分特征對比如表2所示。
表3總結(jié)了現(xiàn)NS2已有模型與NS3計劃或已開發(fā)模型間的對比[7]。
表2 NS2與NS3的部分特征對比
表3 NS2與NS3的項(xiàng)目模型對比
NS3由一系列層次分明的功能模塊拼接而成,其組織結(jié)構(gòu)及模塊間的基本依賴關(guān)系如圖1所示。
圖1 NS3的基本模塊體系結(jié)構(gòu)
2.1.1常用模塊
Core:內(nèi)核模塊,是NS3基本機(jī)制的實(shí)現(xiàn),如智能指針(Ptr)、屬性(attribute)、回調(diào)(callback)、隨機(jī)變量(random variable)、日志(logging)、追蹤(tracing)和事件調(diào)度(event scheduler)等內(nèi)容。
Network:數(shù)據(jù)分組(packet)模塊。
Internet:關(guān)于TCP/IPv4/6的相關(guān)協(xié)議族的實(shí)現(xiàn),包括TCP/IPv4/6、ARP、UDP及鄰居發(fā)現(xiàn)等相關(guān)協(xié)議。
Topolopy-read:讀取指定軌跡文件數(shù)據(jù),按指定格式生成相應(yīng)網(wǎng)絡(luò)拓?fù)洹?/p>
Protocol Status:協(xié)議框架模塊,收集、統(tǒng)計和分析數(shù)據(jù)。
另有,Tools:統(tǒng)計工具(包括gnuplot作圖接口);ApplicatioNS:應(yīng)用模塊;Mobility:移動模塊;Visualizer:可視化工具;Netanim:動畫演示器;Propagation:傳播模型模塊;Flow-monitor:流量監(jiān)控模塊等。
2.1.2典型模塊
CSMA:基于IEEE802.3以太網(wǎng),包括MAC層、物理層和媒體信道。
Point-to-point:實(shí)現(xiàn)網(wǎng)絡(luò)間的點(diǎn)對點(diǎn)通信。
Wifi:基于IEEE802.11a/b/g無線網(wǎng),包括AdHoc。
其他還有,Mesh:基于IEEE802.11s的無線網(wǎng)絡(luò);Wimax:基于IEEE802.16的無線城域網(wǎng);LTE:3GPP通用移動通信系統(tǒng)(UMTS)技術(shù)長期演進(jìn);UAN:水聲通信網(wǎng)絡(luò);MPI:并行分布式離散事件標(biāo)準(zhǔn)信息傳遞接口;Click:集成可編程模塊化路由;Openflow:仿真交換機(jī);Emu:集成實(shí)驗(yàn)床和虛擬機(jī)環(huán)境等。
2.1.3最新技術(shù)
Waf是基于Python框架開發(fā)的編譯工具,NS3自身及將要執(zhí)行的仿真代碼都由Waf編譯運(yùn)行。Scratch目錄存放用戶腳本,運(yùn)行案例可拷至該目錄。Example舉例如何使用NS3,內(nèi)含許多模塊的使用。Doc目錄是幫助文檔,可使用./waf--doxygen編譯本地Doxygen文檔。Build編譯目錄,內(nèi)含編譯文件時使用的共享庫和頭文件(build/NS3)。Src是NS3的源碼目錄。
模塊中的wscript文件結(jié)構(gòu)固定,用來注冊模塊中的源碼和使用其他模塊情況。Model目錄包含模塊代碼的.cc和.h文件。Helper目錄存放模塊對應(yīng)的helper類代碼的源文件。Test目錄包含原模塊測試代碼,而examples目錄存放應(yīng)用該模塊的實(shí)例代碼。Doc是幫助文檔,bindings目錄則被模塊用來綁定Python語言。
NS3以較低層次的抽象來構(gòu)造組件,模擬真實(shí)環(huán)境[8],其基本對象是節(jié)點(diǎn)、應(yīng)用、信道和網(wǎng)絡(luò)設(shè)備等,由類表示或?qū)崿F(xiàn)。
(1)節(jié)點(diǎn)(Node):網(wǎng)絡(luò)上所連接的基本計算單元或終端都抽象為節(jié)點(diǎn),在C++中由Node類描述(如Nodeontainer類),用于追蹤一組節(jié)點(diǎn)指針。用戶可通過對節(jié)點(diǎn)添加應(yīng)用、協(xié)議和網(wǎng)卡等進(jìn)行二次開發(fā)[9]。
(2)應(yīng)用(Application):被仿真的用戶程序抽象為應(yīng)用。NS3以“Time”為參數(shù),記錄接收和發(fā)送時間。在C++中抽象成Application類表示,實(shí)現(xiàn)時需繼承該類,將其部署在節(jié)點(diǎn),驅(qū)動仿真器運(yùn)行。由應(yīng)用程序生成和回顯仿真數(shù)據(jù)包的客戶/服務(wù)器端程序集,如Application類稱為“UdpEchoClient Application”和“UdpEchoServer Application”。
(3)信道(Channel):基本的通信子網(wǎng)被抽象為信道。在C++中由Channel類描述,提供管理通信子網(wǎng)對象和節(jié)點(diǎn)連接至它們的各種方法。它可模擬簡單線纜、無線網(wǎng),甚至以太網(wǎng)交換機(jī)。NS3包括Csma Channel、Point To Point Channel以及Wifi Channel等信道。
(4)網(wǎng)絡(luò)設(shè)備(NetDevice):硬件設(shè)備和軟件驅(qū)動的抽象表示,由C++的NetDevice類實(shí)現(xiàn)。通過綁定與類型匹配的信道,提供管理節(jié)點(diǎn)和信道對象連接。與信道對應(yīng),NetDevice也分為Csma NetDevice、Point To Point NetDevice和Wifi NetDevice等[10]。若需要一個所有被創(chuàng)建的NetDevice對象列表,則需用一個NetDeviceContainer對象來存放。
(5)分組(Packet):每個分組包含字節(jié)緩沖器、標(biāo)簽和元數(shù)據(jù)。緩沖器是頭部和尾部的逐位串行表示,標(biāo)簽則是任意用戶提供的數(shù)據(jù)結(jié)構(gòu)的集合,而元數(shù)據(jù)可用以描述已序列化的頭和尾的類型。
(6)套接字(Socket):作為應(yīng)用程序與網(wǎng)絡(luò)堆棧間的接口。NS3提供了兩種類型的套接字API,一是NS3API,二是使用本機(jī)API服務(wù)來提供類似POSIX的API,作為整個應(yīng)用程序進(jìn)程的一部分。
(7)拓?fù)鋷椭?Topology Helper):NS3用Topology Helper類來整合大量分立步驟,使其成為一簡單易用的操作。由拓?fù)渖善髡{(diào)用底層核心完成節(jié)點(diǎn)、網(wǎng)絡(luò)設(shè)備、MAC地址、信道及協(xié)議棧等創(chuàng)建與配置。它可實(shí)現(xiàn)多節(jié)點(diǎn)連接及多子網(wǎng)聯(lián)網(wǎng)、分配IP地址等功能。如Topology Reader Helper類可簡化配置并使用通用Topology Reader。Internet Stack Helper是個安裝Point To Point Helper對象和點(diǎn)到點(diǎn)網(wǎng)絡(luò)設(shè)備的網(wǎng)絡(luò)協(xié)議棧的拓?fù)渖善黝悺?/p>
(8)典型容器助手(typical containers and helpers)。NS3分容器類和助手類,NodeContainer、NetDevice Container和Ipv4AddressContainer是不同容器類,而InternetStackHelper、WifiHelper、MobilityHelper和OlsrHelper則屬不同助手類。
NS3體系結(jié)構(gòu)類似OSI模型,便于對網(wǎng)絡(luò)層次及協(xié)議仿真研究。數(shù)據(jù)按TCP/IP形式發(fā)送,以類方式實(shí)現(xiàn)。事件由節(jié)點(diǎn)觸發(fā),當(dāng)數(shù)據(jù)包到達(dá)節(jié)點(diǎn),仿真器按事件預(yù)定的執(zhí)行時間排序隊列、按步處理。數(shù)據(jù)包傳遞時,通過指針交互完成轉(zhuǎn)發(fā),傳輸過程如圖2所示[11]。
圖2 NS3數(shù)據(jù)包傳輸過程
首先應(yīng)用層創(chuàng)建數(shù)據(jù)包并通過套接字傳送至傳輸層(用套接字指針取代應(yīng)用層指向該數(shù)據(jù)包)。在該層完成TCP或UDP頭的封裝后轉(zhuǎn)交至網(wǎng)絡(luò)層[12]。由該層判斷數(shù)據(jù)包的目的地址,若非當(dāng)前節(jié)點(diǎn)則查詢路由,將數(shù)據(jù)包交至網(wǎng)絡(luò)設(shè)備層。該層查詢ARP,將數(shù)據(jù)包轉(zhuǎn)至指定接口,由該口將包發(fā)送至信道。信道通過入隊、鏈路延遲處理、TTL檢驗(yàn)及出隊等完成數(shù)據(jù)包的發(fā)送。若出現(xiàn)隊列已滿或TTL生命期結(jié)束,則丟棄該包。當(dāng)數(shù)據(jù)包經(jīng)過信道傳輸?shù)竭_(dá)目的節(jié)點(diǎn)后,再由網(wǎng)絡(luò)設(shè)備層開始逐層上傳,最后通過端口找到API套接字,并通過該套接字將包交由應(yīng)用模塊處理。綜上所述,NS3的數(shù)據(jù)包傳輸過程與物理網(wǎng)絡(luò)類似,其仿真可信度較高。
NS3從拓?fù)浣㈤_始,定義所選模型,而后通過設(shè)置參數(shù)、賦予地址來配置模型并執(zhí)行代碼。仿真生成的Pcap包文件可采用trace格式跟蹤輸出,最后用Wireshark等工具跟蹤結(jié)果并分析數(shù)據(jù),或由Net Anim來實(shí)現(xiàn)可視化輸出。其代碼創(chuàng)建過程如圖3所示。
圖3 NS3代碼體系結(jié)構(gòu)
使用NS3進(jìn)行網(wǎng)絡(luò)仿真時,一般需要4步:
(1)選擇或開發(fā)相應(yīng)模塊;
(2)編寫仿真腳本(C++或Python)。包括:生成節(jié)點(diǎn)(如網(wǎng)卡、應(yīng)用程序和協(xié)議棧等);安裝網(wǎng)絡(luò)設(shè)備(如CSMA、WiFi);安裝協(xié)議(一般TCP/IP及應(yīng)用層協(xié)議);其他配置(如節(jié)點(diǎn)移動或能量管理等);
(3)啟動仿真器;
(4)仿真結(jié)果分析(包括輸出網(wǎng)絡(luò)場景和數(shù)據(jù)圖像等)。
NS3有兩類跟蹤:一是用Logging系統(tǒng)直接將執(zhí)行過程顯示在命令行,有助于調(diào)試仿真腳本;另外常用Tracing系統(tǒng)將采集的數(shù)據(jù)直接存于一文件中,以便后期分析處理。
Logging系統(tǒng)從低到高可分7個等級,高的包含低的消息。通過.cc文件對程序添加記錄,通過環(huán)境變量修改系統(tǒng)等級,隨后終端運(yùn)行。而Tracing系統(tǒng)則存儲大量信息,它包含3個基本概念:跟蹤源(Tracing Sources)、跟蹤宿(Tracing Sink)以及兩者的連接機(jī)制。該系統(tǒng)基于回調(diào)函數(shù)收集統(tǒng)計信息,當(dāng)某跟蹤源產(chǎn)生一新事件,可通過回調(diào)了解其內(nèi)部正在發(fā)生的模擬情形及設(shè)備運(yùn)行狀況。
4.2.1TCP類及其相互作用
TCP類在網(wǎng)絡(luò)模型中與IPv4/6協(xié)議一起駐留,實(shí)現(xiàn)彼此通信的多個類與網(wǎng)絡(luò)層交互,并向應(yīng)用層提供可靠的數(shù)據(jù)傳送。下面列出NS3中關(guān)于TCP實(shí)現(xiàn)的主要類別以及它們之間的相互作用,如圖4所示[13]。
TcpSocket:這個抽象類包含TCP套接字的基本屬性。
TcpSocketBase:此類為應(yīng)用程序?qū)犹峁┝岁P(guān)鍵的TCP特性和一個套接字接口。它從TcpSocket繼承,用作所有TCP變體的基類。
Tcp Header:此類定義了TCP段的頭。
TcpTxBuffer:此類提供一個緩沖區(qū),發(fā)送方在發(fā)送和確認(rèn)之前,緩沖從應(yīng)用程序接收的所有數(shù)據(jù)。
TcpRxBuffer:該類實(shí)現(xiàn)一個緩沖區(qū),用于接收從網(wǎng)絡(luò)層收到的數(shù)據(jù),然后將其傳遞給應(yīng)用程序。
TcpL4Protocol:是TCP套接字和網(wǎng)絡(luò)層接口類,負(fù)責(zé)向網(wǎng)絡(luò)層收發(fā)數(shù)據(jù)包,并且負(fù)責(zé)傳入數(shù)據(jù)校驗(yàn)和驗(yàn)證。
除了上述主類外,NS3還包含了基于繼承TCP套接字的子類,可以實(shí)現(xiàn)多種變體。如Tcp Tahoe、Tcp Reno和Tcp NewReno及Tcp Westwood等。
4.2.2全局變量
現(xiàn)有的變體都是基于繼承TCP套接字的同一類實(shí)現(xiàn)的,它包括以下各全局變量,用以實(shí)現(xiàn)擁塞控制算法及其帶寬估計等。
m_cWnd是一uint32_t型變量,用于表示擁塞窗口。發(fā)送方用來確定可進(jìn)入網(wǎng)絡(luò)而不致鏈路過載的字節(jié)數(shù)。當(dāng)發(fā)生丟包時,使用m_cWnd來估計帶寬。
m_ssThresh也是uint32_t型變量,用于標(biāo)記慢啟動結(jié)束門限閾值,其值取決于丟包時的鏈路帶寬估計。
m_initialcWnd是指定m_cWnd初值的uint32_t變量。
m_inFastRec是指示快速恢復(fù)開始和結(jié)束的布爾型變量。
m_prevAckNo類型為SequenceNumber32,用以保存最后接收到的ACK號。
m_accountedFor為uint32_t型變量,其在丟包時可跟蹤DUP ACK段數(shù)量,并在估計帶寬時使用。
m_lastAck是前一ACK到達(dá)時間的雙精度浮點(diǎn)型變量。
m_currentBW表示當(dāng)前帶寬估計的雙精度浮點(diǎn)型變量。
m_minRtt是指定的最小RTT的時間類型變量。
m_lastBW是雙精度浮點(diǎn)型變量,其在通過Tustin濾波器之后,保存最后所估計的帶寬值。
m_lastSampleBW是雙精度浮點(diǎn)型變量,其保存測量帶寬的最后一個樣本值。
m_ackedSegments是整型變量,它保存當(dāng)前RTT期間已確認(rèn)的段的總數(shù)。
m_IsCount是一個布爾型變量,用于指示m_acked段計數(shù)過程的開始。
m_bwEstimateEvent是指定帶寬采樣事件類型EventId的變量。
圖4 TCP類圖一覽
4.2.3算法實(shí)現(xiàn)
NS3支持多種類型的TCP算法的實(shí)現(xiàn),這些實(shí)現(xiàn)繼承自src/network目錄下的一些通用類,這樣用戶就能以最少的代價實(shí)現(xiàn)自己的算法。這里首先描述聚合的概念,在NS2中已廣泛使用的繼承和多態(tài)被用來擴(kuò)展協(xié)議模型,如RenoTcpAgent就是通過重寫方法繼承自TcpAgent的,這促成了NS3的對象聚合系統(tǒng)。然后再介紹兩個重要的抽象基類:class TcpSocket,這在src/internet/model/tcp-socket. {cc,h}中定義。這個類主要用來管理能被不同算法重用的一些屬性。例如,屬性InitialCwnd可用于從TcpSocket類派生的任何實(shí)現(xiàn)。而class TcpSocketFactory則由協(xié)議的第4層實(shí)例使用,以創(chuàng)建正確的TCP套接字類型。
目前對于NS3,有四種方式實(shí)現(xiàn)TCP:NS3自帶的TCP實(shí)現(xiàn);支持直接代碼執(zhí)行(DCE);支持網(wǎng)絡(luò)模擬通訊座(NSC);虛擬機(jī)與NS3的組合。鑒于復(fù)雜程度,文中只介紹第一種實(shí)現(xiàn)方式。NS3自帶的TCP模型具有建立連接和關(guān)閉邏輯的雙向TCP功能。支持多種擁塞控制算法,如NewReno、Westwood、Hybla和HighSpeed等,暫不支持多路TCP和TCP SACK算法。
以前的擁塞控制被認(rèn)為是通過繼承父類的獨(dú)立的TCP,每個擁塞控制(如NewReno)是TcpSocketBase的子類,需修改一些繼承的方法。但從NS3.25開始,TCP模塊經(jīng)過了重新設(shè)計,其中擁塞避免、快速重傳與恢復(fù)算法已修改,并完成了在TcpSocketBase內(nèi)的合并。架構(gòu)被重做,以避免之前的繼承,讓每個擁塞控制都具有一個單獨(dú)的類,并且建立一個接口,用以在TcpSocketBase和擁塞模塊之間交換數(shù)據(jù),可以為創(chuàng)建和執(zhí)行自動化測試創(chuàng)造更好的環(huán)境。一般在src/applications/helper和src/network/helper中定義幫助函數(shù),通過NS3使用套接字,在應(yīng)用層設(shè)置TCP的使用,具體步驟及方法如下:
(1)創(chuàng)建TCP接收器。
// Create a packet sink on the star "hub" to receive these packets
uint16_t port=50000;
AddresssinkLocalAddress(InetSocketAddress
(Ipv4Address::GetAny (), port));
PacketSinkHelper sinkHelper("ns3::TcpSocketFactory", sinkLocalAddress);
ApplicationContainer sinkApp=sinkHelper.Install
(serverNode);
sinkApp.Start (Seconds (1.0));
sinkApp.Stop (Seconds (10.0));
類似的,以下代碼片段將OnOffApplication流量源配置為使用TCP:
//Create the OnOff applications to send TCP to the server
OnOffHelper clientHelper ("ns3::TcpSocketFactory", Address ());
這里已指定了抽象基類TcpSocketFactory的TypeId。NS3如何判斷腳本需要的是它自帶的TCP模型還是其他來源,當(dāng)網(wǎng)絡(luò)堆棧添加到節(jié)點(diǎn)時,聚合到該節(jié)點(diǎn)的默認(rèn)TCP實(shí)現(xiàn)是NS3TCP。因此,默認(rèn)情況下,在使用NS3helper API時,聚合到具有Internet堆棧的節(jié)點(diǎn)的TCP是NS3TCP。
(2)配置TCP行為。
通過NS3屬性,系統(tǒng)導(dǎo)出參數(shù),記錄在TcpSocket類的Doxygen中,例如最大段大小是可設(shè)置的屬性。要在創(chuàng)建任何Internet堆棧相關(guān)對象之前設(shè)置默認(rèn)套接字的類型,可在仿真程序的頂部放置以下語句:
Config::SetDefault ("ns3::TcpL4Protocol::SocketType",StringValue ("ns3::TcpNewReno"));
(3)綁定Socket套接字。
對于用戶,希望有一個指向?qū)嶋H套接字的指針,需要用函數(shù)Bind()來綁定套接字。設(shè)置選項(xiàng)等可在每個套接字的基礎(chǔ)上完成,TCP的套接字可通過使用Socket::CreateSocket()的方法進(jìn)行創(chuàng)建。傳遞給CreateSocket()的TypeId必須是類型ns3::SocketFactory。因此需要通過與底層TcpL4Protocol對象相關(guān)聯(lián)的屬性來完成底層套接字類型的配置,也可通過屬性配置系統(tǒng)完成。在下面的示例中,訪問節(jié)點(diǎn)容器“n0n1”以獲取第零個元素,并在此節(jié)點(diǎn)上創(chuàng)建綁定套接字。
// Create and bind the socket...
TypeId tid =TypeId::LookupByName("ns3::TcpNewReno");
Config::Set ("/NodeList/*/$ns3::TcpL4Protocol/SocketType", TypeIdValue (tid));
Ptr
(n0n1.Get(0), TcpSocketFactory::GetTypeId ( ));
上面節(jié)點(diǎn)號的“*”通配符被傳遞給屬性配置系統(tǒng),以后所有節(jié)點(diǎn)上的套接字都被設(shè)置為NewReno,而不僅僅是節(jié)點(diǎn)'n0n1.Get(0)'了。如果想要將其限制為僅指定的節(jié)點(diǎn),則必須執(zhí)行以下操作:
// Create and bind the socket...
TypeId tid=TypeId::LookupByName
("ns3::TcpNewReno");
std::stringstream nodeId;
nodeId<
std::string specificNode="/NodeList/"+nodeId.str()+"/$ns3::TcpL4Protocol/SocketType";
Config::Set (specificNode, TypeIdValue (tid));
Ptr
(n0n1.Get(0),TcpSocketFactory::GetTypeId ());
一旦創(chuàng)建了TCP套接字,就需要遵循傳統(tǒng)的套接字邏輯以及connect()和send()(對于客戶端)或bind()、listen()和accept()(對于服務(wù)器端)。有關(guān)在NS3中使用套接字的信息,可以參閱Sockets API相關(guān)文獻(xiàn)[14]。
若要對已存在算法進(jìn)行驗(yàn)證,通常TCP測試從一個名為TcpGeneralTest的類繼承,該類提供了涉及TCP對象測試場景的操作設(shè)置,其位于src/internet/test目錄下。有關(guān)編寫新測試的更多信息,請參閱有關(guān)TCP測試文獻(xiàn)。一些測試存于src/test/ns3tcp目錄,其具有Internet模塊之外的依賴關(guān)系。更多信息可在NS3官網(wǎng)的Wiki頁面上找到。
NS3具有更好的開發(fā)環(huán)境(包括COM類接口聚合與查詢、自動內(nèi)存管理及對象回調(diào)等核心功能),便于仿真全新的復(fù)雜模型。它克服了NS2的諸多缺陷和明顯弱點(diǎn),越來越多的網(wǎng)絡(luò)仿真功能現(xiàn)已逐漸推行并植入到NS3中,使之適用于更多場景。文中結(jié)合項(xiàng)目開發(fā)經(jīng)驗(yàn),從不同角度和深度對新一代網(wǎng)絡(luò)仿真器NS3作了較為全面的闡述與介紹,對其體系結(jié)構(gòu)和主要功能模塊進(jìn)行了深入剖析,尤其對NS3的TCP實(shí)現(xiàn)機(jī)制作了重點(diǎn)探究。為NS3的使用及研發(fā)者提供了較好的理論指導(dǎo)意義和應(yīng)用參考價值,為網(wǎng)絡(luò)相關(guān)課題的后續(xù)研究及深入學(xué)習(xí)提供了強(qiáng)有力的支持。目前,NS3的一些新功能正在積極開發(fā)之中,如節(jié)點(diǎn)多接口處理、IP尋址以及更多的因特網(wǎng)協(xié)議設(shè)計,包括更詳細(xì)的802.11模型等都非常值得期待,NS3最終必將會取代NS2。
[1] 梁軍學(xué),林昭文,馬 嚴(yán).未來互聯(lián)網(wǎng)試驗(yàn)平臺[J].計算機(jī)學(xué)報,2013,36(7):1364-1374.
[2] 袁 曉,蔡志平,劉書昊,等.大規(guī)模網(wǎng)絡(luò)仿真軟件及其仿真技術(shù)[J].計算機(jī)技術(shù)與發(fā)展,2014,24(7):9-12.
[3] 馬浩然.基于NS3的分布式消息系統(tǒng)Kafka的仿真實(shí)現(xiàn)[J].軟件,2015,36(1):94-99.
[4] FONT J L,IIGO P,DOMNGUEZ M,et al.Analysis of source code metrics from ns-2and ns-3network simulators[J].Simulation Modelling Practice & Theory,2011,19(5):1330-1346.
[5] RILEY G F,HENDERSON T R.Modeling & tools for network simulation[M].Berlin:Springer,2010.
[6] DAS B,SUBUDHI B,PATI B B. Cooperative formation control of autonomous underwater vehicles:an overview[J].International Journal of Automation and Computing,2016,13(3):199-225.
[7] RACHNA C,SHWETA S,RITA K,et al.A study of comparison of network simulator-3and network simulator-2[J].International Journal of Computer Science and Information Technologies,2012,3(1):3085-3092.
[8] 閔圣天,曾文序,李滿榮,等.基于NS3的網(wǎng)絡(luò)協(xié)議分析與模擬[J].福建電腦,2014,30(2):99-100.
[9] 張登銀,張保峰.新型網(wǎng)絡(luò)模擬器NS-3研究[J].計算機(jī)技術(shù)與發(fā)展,2009,19(11):80-84.
[10] 欒 俊,李太浩.基于NS-3的WiFi場景仿真[J].農(nóng)業(yè)網(wǎng)絡(luò)信息,2012(1):18-20.
[11] 李廣榮.基于NS-3的虛實(shí)網(wǎng)絡(luò)結(jié)合系統(tǒng)的設(shè)計與實(shí)現(xiàn)[D].哈爾濱:哈爾濱工業(yè)大學(xué),2015.
[12] 楊鳴亮,張嘉毅,孫 振,等.關(guān)于NS3中GRE仿真的研究[J].電子測量技術(shù),2011,34(1):22-26.
[13] GANGADHAR S,NGUYEN T A N,UMAPATHI G,et al.TCP Westwood(+) protocol implementation in ns-3[C]//Proceedings of the6th international ICST conference on simulation tools and techniques.Brussels, Belgium:ICST,2013:167-175.
[14] 袁鵬飛,鄭 濤,楊李冬,等.一種基于CAPPROBE帶寬估計的TCP Westwood算法[J].廈門大學(xué)學(xué)報:自然科學(xué)版,2014,53(4):469-476.