NS3之路---拓撲搭建


在tutorial的這一章中,一共介紹了3種拓撲,分別使用first.cc、second.cc、third.cc三個程序。並且拓撲的形式是遞增式的。

第一個拓撲是點對點鏈路(兩個節點),第二個拓撲在點對點鏈路的基礎上增加了一個4節點csma網絡,第三個拓撲則是在前兩個的基礎上增加了wifi網絡。

下面是我大概翻譯的這一章節內容

拓撲搭建

根據tutorial中的內容,這章主要包括三部分:搭建總線拓撲、模型-屬性-實現、搭建無線拓撲。下面分別介紹不同部分。

搭建總線拓撲

本章將前面介紹過的節點、鏈路、信道,等等結合起來,搭建一條總線型拓撲。鏈路上采用載波偵聽多路訪問協議(Carrier Sense Multiple Access, CSMA)。用於模擬一個簡單的以太網絡。真實以太網采用的是CSMA/CD協議,多了沖突檢測部分。

在前面first.cc中我們使用了helper對象構造點對點鏈路,同樣構造csma鏈路的時候我們也可以使用對應的helper對象。基本上,整個過程和構造點對點鏈路是一樣的,除了安裝channel協議的時候使用csma對應的類。

這部分對應的代碼在second.cc中,同樣可以在tutorial中找到。打開之后你會發現,基本上和first.cc差不多,這說明構造過程基本是一致的。那么本文也就不需要再細致講解已經重復過的內容了。我會從中挑出前面沒有介紹過的進行說明。

學過c語言的相信對變量的定義並不陌生。開始定義了兩個變量,暫且不必管他們是干嘛的。看下面語句:

CommandLine cmd;

cmd.AddValue(“nCsma”,”Number of …”,nCsma);

cmd.Parse(argc,argv);

第一句定義命令行變量,最后一句說明開始對參數進行解析。主要介紹中間那句。指添加一個可以通過命令行修改的參數。AddValue函數具有有三個參數,1對應的參數名字,2是說明和幫助,3對應程序中的變量。在命令行的使用方式是(100是例子) :--nCsma=100。運行時可以如此:./waf --run “PROGRAM  --nCsma=100”。

程序中使用csma的地方主要在helper處,如下:

CsmaHelper csma;

csma.SetChannelAttribute(“DataRate”,StringValue(“100Mbps”));

除了變量的定義使用CsmaHelper之外,可以看出其他地方沒變化。因為csma和point-to-point一樣,都是鏈路上的協議,並沒有實體存在。在整個仿真環境中,它們必須依附其他的實例對象存在。唯一的體現個人感覺就是定義的名字。

在鏈路協議安裝完成后,剩下的工作:安裝協議棧,分配IP地址等等工作就和first.cc中一樣了。由於拓撲較最開始的點對點,稍微復雜了一點點,程序中采用了路由機制:

Ipv4GlobalRoutingHelper::PopulateRoutingTables();

直接調用ns3提供的某一路由算法,參閱nsnam的document,該函數的功能為:建立一個路由數據庫,初始化仿真中的節點路由表。Make所有的節點成為路由器(也就是具有路由器的功能)。

在最后,程序添加了產生Pcap文件部分,前面說過,Pcap文件可以使用wireshark(有界面,使用方便,推薦)讀取,其中記錄着所有的信息,可以看到網絡運行的狀態(包、統計信息,等)。

PointToPoint.EnablePcapAll(“second”);

csma.EnablePcap(“second”, csmaDevice.get(1), true);

上面代碼是什么意思呢?第一句指點對點網絡中的所有網卡產生Pcap文件,而csma中則只選擇了一個節點產生Pcap信息。

但是linux也自帶工具識別pcap文件,即tcpdump命令。Tcpdump的使用可參考linux下的--help。具體讀出來的信息格式需自行分析。

另外需要注意的是,second.cc中定義的拓撲是點對點網絡和總線網絡的結合,因此在分配ip地址的時候需要划分網段。

 

ModelsAttributeReality

模型是現實的抽象,通過模型能夠了解到部分外部世界。因此必須清楚模型所模擬的部分。例如:csma,通過閱讀csma.h會發現這部分其實並沒有對沖突檢測進行建模。這就是與現實世界的差別。因此多花點時間了解現實的東西是個什么樣子的,對於實際仿真的時候是非常有幫助的。

Ns3為每個模型提供了Attribute屬性,用戶可以通過修改Attribute來改變模型的行為。在csma中,考慮CsmaNetDevice兩個屬性:MTU和EncapsulationMode。首先MTU表示設備的最大傳輸單元。這是設備在單位時間內所能傳輸的最大數據單元。CsmaNetDevice中默認的MTU為1500字節(來自RFC894)。這個數值是從10Base-5(粗同軸電纜、基帶傳輸方式、最大網段長度為500m)以太網中的最大數據包size—1518bytes。除去封裝使用的18byte,剩下的剛好是1500字節。IEEE802.3網絡規定的MTU為1492bytes,加上封裝使用的8bytes,也剛好是1500字節。兩種情況下,底層設備都只能發送1518字節,其中數據部分的size是不一樣的。

在設置封裝模式的時候,CsmaNetDevice提供的EncapsulationMode分別有Dix和Llc,這兩種模型分別對應的是以太網(Ethernet)和LLC/SNAP框架。假設包大小為1500字節,但是使用LLC/SNAP框架封裝,那么得到的整體大小為1526字節,而這個值在很多網絡中是不允許的,因為規定的最大MTU為1518。這樣的設置導致的結果就是仿真的結果可能距離實際情況差別比較大。

在second.cc這個例子中,通過命令行,可以很容易的建立100個csma節點(同樣也可以建立500、600等)。但是實際網絡中,最大的長度沒有超過500米。基本上每隔2.5米就會有一個接頭。像這些細節是在網絡仿真中要注意的地方。

Ns3提供了較大的靈活性,大部分模型都支持自設置相關的Attribute。

……

個人感覺這一節更像是對使用NS3仿真的一些細節與建議,用戶可選擇性跳過。

 

搭建無線網絡拓撲

同樣,無線網絡拓撲的搭建也是使用helper。前面提到PointToPoint和Csma網絡的搭建過程幾乎一致是因為它們只是協議上的差別。而無線網絡則不同,除了協議上的差別,還涉及到移動設備的移動特性的刻畫,每個接入的移動設備的表述(MAC、IP),wifi的無線信道刻畫(與有線信道相區別),ssid,等等。因此和點對點網絡、csma網絡還是有較大區別的。

同樣,ns3也給出相應的程序代碼,即third.cc。這個程序中是在second.cc的基礎上進行擴展的。即原有的“點對點鏈路+csma總線”,再加上wifi網絡。將wifi網絡與有線網絡聯系起來就需要有一個接入點(Access Point, AP),程序使用點對點鏈路中的一個節點作為AP。另外還定義了3個移動節點,連接到該AP上。

程序最開始定義了wifi節點數變量,以及對命令行參數的設置解析等過程。這個過程和csma的搭建一致。下面介紹與second.cc不同的代碼的功能,首先:

NodeContainer  wifiStaNodes;

wifiStaNodes.Create(nWifi);

NodeContainer wifiApNode = p2pNodes.Get(0);

節點容器相信並不陌生,第二行創建了幾個wifi節點。最后一行將p2p鏈路中的節點0設置為wifi網絡的AP。然后開始構造wifi設備和wifi節點之間的互連信道,那么首先就需要配置PHY以及信道helper。

YansWifiChannelHelper  channel  =  YansWifiChannelHelper::Default();

YansWifiPhyHelper  phy  =  YansWifiChannelHelper::Default();

程序為了簡單,直接創建默認的Channel和PHY。然后再將所有的PHY與Channel聯系起來,保證其共享同樣的無線媒介。

phy.SetChannel(channel.Create());

PHY層配置好之后,開始配置MAC層(程序使用的是Non-Qos  MAC)。

WifiHelper  wifi  =  WifiHelper::Default();

wifi.SetRemoteStationManager(“ns3::AsrfWifiManager”);

NqosWifiMacHelper   mac   =   NqosWifiMacHelper::Default();

SetRemoteStationManager其實是設置了速率控制算法。這里的速率在tutorial中也沒有說清楚,我覺得應該是wifi信道的數據傳播速率。下面設置基礎網絡的SSID(相信大家對這個並不陌生,全稱是service set identifier)以及MAC。

Ssid  ssid  =  Ssid (“ns3-ssid”);

mac.SetType(“ns3-StaWifiMac”, “Ssid”, SsidValue(ssid), “ActiveProbing”, False);

第一個參數是wifimac的type。緊接着依次為參數1的名字、value,參數2的名字,value…….。其中probing=false,說明該mac不會發送probe(查詢)請求。至此,構建wifi網絡需要的PHY,MAC和NODE都已經具備了,直接使用INSTALL安裝即可。

NetDeviceContainer ndc = wifi.Install(phy, mac, wifiStaNodes);

注意,以上是StaNodes,指移動的設備節點,並不包括AP。AP的設置稍微有點不同(在於mac的type),具體如下:

mac.SetType(“ns3-ApWifiMac”, “Ssid”, SsidValue(ssid), “ActiveProbing”, False);

NetDeviceContainer ndc = wifi.Install(phy, mac, wifiApNodes);

接下來,除了AP節點固定之外,其他wifi節點都應該是移動的、隨機的位置。同樣這部分也使用Helper來幫助我們,叫做MobilityHelper。

MobilityHelper  mobility;

Mobility.SetAllocation(“ns3::GridPositionAllocator”, “MinX”, VALUE1, “MinY”, VALUE2, “DeltaX”, VALUE3, “DeltaY”, VALUE4, “GridWidth”, VALUE5, “LayoutType”, VALUE6).

顯然可以看出上面的語句定義了一個移動模型,設定的是二維的網格空間。初始化了節點的移動空間。其中,參數1為移動模型的類型,剩下的屬性參數倆倆分別為“名字+VALUE”。很顯然,MinX,MinY,DeltaX,DeltaY,GridWidth,LayoutType分別為最小坐標(X,Y)、坐標增量Delta、網格寬度、布局類型。

規定好了活動范圍之后,剩下的事就該規定wifi節點如何運動了。

mobility.SetMobilityModel(“ns3::RandomWalk2dMobilityModel”, “Bounds”, RectangleValue());

第一個參數是指節點移動的方式,其次是移動的矩陣。將移動模型安裝到StaNodes中。

Mobility.Install(wifiStaNodes);

移動節點的mobility和AP的mobility不同,所以也需要重新設計AP的部分。

mobility.SetMobilityMode(“ns3::ConstantPositionMobilityModel”);

mobility.Install(wifiApNode);

到這一步,無線網絡已經配置完畢。剩下的過程和first.cc、second.cc沒什么區別,也就不在做介紹了。

可能在運行之后,只能看到數字的變化。如果想要看到圖像效果,那么推薦使用插件NetAnim和PyViz,這是ns3支持的兩種圖形化界面。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM