NS2常用命令總結
set ns [new Simulator] ;#新建一個Simulator對象ns
set n0 [$ns node] ;#創建一個單播節點n0
set ns [new Simulator -Multicast on] ;#將ns內部的-Multicast屬性設置爲on
set n1 [$ns node] ;#創建一個多播節點n1
注:一旦-Multicast的屬性值設置爲on,在此之後調用$ns node過程建立的節點都將是多播節點,如果要再創建單播節點,必須先將-Multicast的值重新設置爲off。
*******************************************************************************
$ns simplex-link <node1> <node2> <bandwidth> <delay> <queue_type>
;#建立一條node1到node2的單向鏈路
;# <bandwidth>鏈路帶寬,即數據的傳輸速率,即每秒鐘在該鏈路上傳輸的數據量,單位bit/s,kb/s,Mb/s
;# <delay>鏈路的時延,指一個分組從鏈路的一端傳輸到另一端所需要的時間
;# <queue_type>隊列的類型,NS-2當前支持的隊列管理算法有如下幾種:
1) XCP: 顯示擁塞控制協議(eXplicit Congestion control Protocol)
2) REM: 隨機指數標記(random exponential marking)
3) Vq: 虛擬隊列(Virtual queueing)
4) PI: 成比例積分(proportional integral)
5) dsRED: DiffServ中使用的多RED隊列
6) JoBS: 基於類的隊列(Class-Based Queueing)
7) SRR: 簡單輪詢(Simple Round Robin)
8) DRR: 差額輪詢(Deficit Round Robin)
9) FQ: 公平隊列(Fair Queueing)
10) SFQ: 隨機公平隊列(Stochastic Fair Queueing)
11) RED: 隨機早期檢測(Random Early Detection)
12) SimpleIntServ: 簡單綜合服務(simple integrated service)
13) DropTail: 丟棄隊尾先進先出隊列
$ns duplex-link <node1> <node2> <bandwidth> <delay> <queue_type>
;#建立一條node1到node2的雙向鏈路
注:一條雙向鏈路其實是由兩條方向不同的單向鏈路構成。
$ns simplex-link-op <node1> <node2> <option> <args>
$ns duplex -link-op <node1> <node2> <option> <args>
;#設置鏈路的屬性,包括方向、顏色、標籤、隊列位置,設置這些屬性主要用於Nam的動畫顯示。
$ns queue-limit $n0 $n1 10
;#設置節點n0到節點n1之間的鏈路的最大隊列長度是10個分組的長度。
*******************************************************************************
set udp0 [new Agent/UDP] ;#創建一個UDP Agent對象udp0
$ns attach-agent $n0 $udp0 ;#將udp0綁定在節點n0上,作爲分組的發送器
$udp0 set packetSize_536 ;#設置UDP數據分組大小爲536字節
set null0 [new Agent/Null] ;#創建一個空代理對象null0
$ns attach-agent $n1 $null0 ;#將null0綁定在節點n1上,作爲分組的接收器
$ns connect $udp0 $null0 ;#在兩個Agent對象之間建立連接
注:Agent/Null是空代理類,空代理將接收到的分組不做任何處理直接丟棄,因此空代理作爲UDP代理的接收器是合適的,因爲UDP協議是一種無連接的不可靠的協議,它並不要求接收端對分組做出任何響應。
*******************************************************************************
set tcp0 [new Agent/TCP] ;#創建一個TCP Agent對象tcp0
$ns attach-agent $n0 $tcp0 ;#將tcp0綁定在節點n0上,作爲分組的發送器
$tcp0 set fid_1 ;#設置IP層數據流fid
$tcp0 set window_20 ;#設置TCP滑動窗口的大小爲20
set sink0 [new Agent/TCPSink] ;#創建分組的接收代理對象sink0
$ns attach-agent $n1 $sink0 ;#將接收器sink0綁定在節點n1上,作爲分組的接收器
$ns connect $tcp0 $sink0 ;#在兩個Agent對象之間建立連接
注:傳輸層的代理Agent的主要功能是在源節點和目的節點之間創建了一條端到端的連接即邏輯上的連接,但並不產生業務流,在NS-2中業務流是由應用層程序Application產生的。
在NS-2中,應用層程序構建在傳輸層之上,它分爲兩大類:
1) 流量產生器(traffic generator):一般用在UDP代理之上;
2) 應用模擬器(simulated application):一般用在TCP代理之上。
*******************************************************************************
set e [new Application/Traffic/Exponential]
;#創建一個指數分佈流量產生器,該流量產生器按照指數On/Off分佈產生數據,在On階段,分組以固定的速率發送;在Off階段,分組停止發送。On和Off兩種狀態的時間都符合指數分佈。
set e [new Application/Traffic/Pareto]
;#創建一個Pareto分佈流量產生器,該產生器的On和Off兩種狀態的時間符合Pareto分佈,其它時間按指數On/Off分佈。
set e [new Application/Traffic/CBR]
;#創建一個固定比特率流量產生器,該產生器按照一個固定的速率產生業務流,分組的長度爲一個常數值,可以選擇需要時對分組發送的時間間隔產生隨機抖動。
set tfile [new Tracefile] ;# 創建一個Trace文件對象
$tfile filename ex-trace ;#將Trace文件命名爲ex-trace
set e [new Application/Traffic/Trace] ;#創建一個Trace文件流量產生器,該產生器按照一個Trace文件產生數據。Trace文件中的每條記錄包含兩個字段,第一個字段爲兩個相鄰分組產生的時間間隔,第二個字段爲下一個分組的大小,單位爲字節。
$e attach-tracefile $tfile ;#將流量產生器e與Trace文件綁定
注:還可以對流量產生器設置屬性,如:
packetSize_250 ;#數據分組的大小爲250字節
burst_time_300ms ;#處於On狀態的平均時間爲300ms
idle_time_300ms ;#處於Off狀態的平均時間爲300ms
rate_50kb ;#在On狀態時數據的發送速率50kb/s
random_true ;#是否在CBR流量產生器的分組的發送時間上加入隨機噪聲的標誌位
流量產生器對象創建以後,必須和傳輸層的源代理綁定。假設UDP的源代理udp0和流量產生器e已經創建,有兩種方法實現綁定:
1) $e attach-agent $udp0
2) $udp0 attach-app $e
$ns at 0.0 “$e start” ;#在0.0秒啓動流量產生器
$ns at 5.0 “$e stop” ;#在5.0秒停止流量產生器
*******************************************************************************
set ftp1 [new Application/FTP] ;#創建一個FTP應用模擬器對象
$ftp1 attach-agent $tcp0 ;#將ftp1和傳輸層TCP的源代理tcp0綁定
$ns at 5.0 “ftp1 start” ;#在5.0秒的時候啓動Application/FTP,發送數據
在NS-2中,有兩種主要不同的數據監視器對象:
1) Trace:該對象可以記錄整個模擬過程的事件,將所有模擬細節都記錄下來,也可以根據需要記錄模擬過程中的某些細節,並存儲於Trace文件中;
2) Monitor:用來記錄各種有用的數值,比如到達、離開鏈路或隊列的數據分組數、字節數等。
*******************************************************************************
set tracefile [open out.tr w] ;#以寫方式打開一個名爲out.tr的文件(如果該文件不存在則創建該文件),並將該文件的句柄賦給變量tracefile
$ns trace-all $tracefile ;#調用Simulator類的trace-all方法將整個模擬過程的數據寫入out.tr文件中
$ns trace-queue $n0 $n1 $tracefile ;#調用Simulator類的trace- queue方法將節點n0和n1之間的鏈路事件數據寫入out.tr文件中
Trace文件格式:
1) Event:發生時間的類型:
a) + 分組進入鏈路隊列(enqueue)
b) - 分組離開鏈路隊列(dequeue)
c) r 目的節點接收分組(receive)
d) d 隊列丟棄(drop)分組事件
2) Time:事件發生的時間
3) From node:發送節點的id
4) To node:目的節點的id
5) Pkt type:分組類型
6) Pkt size:分組大小
7) Flags:標誌位(一般不使用)
8) Fid:流標誌符(Flow id)
9) Scr addr:發送節點的地址(節點號.端口號,即id.port)
10) Dst addr:接收節點的地址(節點號.端口號,即id.port)
11) Seq num:分組的序列號
12) Pkt id:分組的唯一標識符
*******************************************************************************
Monitor有兩種:
1) 隊列監測(Queue Monitoring)
2) 流監測(Per-Flow Monitoring)
$ns monitor-queue <n1> <n2> <qtrace> <optional:sampleinterval>
;#創建一個隊列監視器,跟蹤在節點n1和n2之間的鏈路上隊列的平均長度,並將相關數據寫入名爲qtrace的Trace文件中,可選項< sampleinterval>爲兩次記錄之間的時間間隔,默認值爲0.1秒。
set monfile [open mon.tr w] ;#監測文件
set fmon [$ns makeflowmon Fid] ;#採用流標記創建一個數據流的監視對象
$ns attach-fmon $flink $fmon ;#將監測對象$fmon與需要監測的鏈路$flink關聯
$fmon attach $monfile ;#將監測記錄文件$monfile與監測器對象$fmon關聯
注:每個流監視都包含了一個數據分組和字節的到達、離開和丟棄的整體統計,這樣就無需再創建一個隊列監視來記錄整體的統計數據。
*******************************************************************************
使用gawk分析Trace文件:
1) gawk從輸入文件讀取的基本單位是“記錄(record)”,一般而言,一條記錄相當於數據文件中的一行數據。
2) gawk讀入一條記錄後,會將該記錄的每個字段(以空格符分隔)的值自動存入變量:
a) 變量$0:當前gawk讀入的一條記錄
b) 變量$1:$0上第一個字段的值
c) 變量$2:$0上第二個字段的值
d) ……
$gawk ‘program’ inputfile1
#如果gawk程序很短,則可以直接在命令行上執行gawk程序
$gawk -f programfile inputfile1
#如果程序較長,將gawk程序存爲文件programfile,然後執行上述命令
$gawk -f programfile inputfile1>xfile
#如果要把gawk的結果存到一個文件xfile,可採用重定向的方式
*******************************************************************************
$xgraph filename <-options>
#xgraph的運作是把數據文件filename的第一列當作x軸的數據,第二列當作是y軸的數據,然後把圖給畫出來。xgraph可以將多個數據文件畫在一張圖上,有利於數據的比較。-options可以設定相關參數,例如繪圖的顏色、輸出圖形文件的格式、圖形的標題等。
*******************************************************************************
gnuplot也可以從數據文件中讀入數據並繪製圖形,其要求的數據文件格式與xgraph相似,就是兩列或多列數據。數據文件中#符號開頭的行將作爲註釋,不會被gunplot分析,數據文件中的第一列當作x軸的數據,第二列當作是y軸的數據。
$gnuplot
#進入交互方式
gnuplot>plot “filename”
#繪製filename的圖
gnuplot> plot “cbr_delay” with linespoints
#把cbr_delay中的數據用lines和points連起來。
gnuplot> set terminal gif
#把輸出設成存成gif格式,內定爲X11 terminal
gnuplot> set output “cbr_delay.gif”
#把輸出的檔名設爲cbr_delay.gif
gnuplot> replot
#把數據重新繪一次