Error Model

 

        在本小節中,筆者參考了The ns Manual當中的Chapter 13 Error Model和在~ns/queue/errmodel.{cc, h}檔案,然後把一些重點跟大家分享。Error Model可以去模擬鏈節層(link-level)的傳送資料的錯誤(error)或者是遺失(loss)。模擬傳送資料發生錯誤的方法就是把封包(packet)的common header中的error_欄位做設定後,讓封包繼續傳送到接收端,最後由接收端的agent來處理這樣的錯誤;而模擬封包遺失就是把封包丟棄。

        使用者在寫TCL程式碼時,若有需要用到Error Model,可以利用unit去指定發生錯誤的單位,這裡所說的單位指的是timebytepkt、或者是bit;可以利用ranvar去指定如何產生錯誤的random variable,例如是Uniform Distribution;另外可以使用rate_去指定錯誤發生率(error rate)。

 

[一個範例]

        在這個範例中有四個節點,n0 - - - n1 - - - n2 - - - n3,其中n0會有一個cbr的應用程式(0.5 Mbps傳送速率),傳送資料到n3。筆者把Error Model放在n1到n2之間。詳細參數設定會在底下的程式碼說明。

 

set ns [new Simulator]

 

#Open a trace file

set nf [open out.nam w]

$ns namtrace-all $nf

 

set nd [open out.tr w]

$ns trace-all $nd

 

#設定模擬時間

set end_time 50.0

 

#Define a 'finish' procedure

proc finish {} {

        global ns nf nd

        #exec nam out.nam &

        $ns flush-trace

        close $nf

        close $nd

        exit 0

}

 

set n0 [$ns node]

set n1 [$ns node]

set n2 [$ns node]

set n3 [$ns node]

 

$ns simplex-link $n0 $n1  1Mb  5ms DropTail

$ns simplex-link $n1 $n0  1Mb  5ms DropTail

$ns simplex-link $n1 $n2  1Mb  5ms DropTail

$ns simplex-link $n2 $n1  1Mb  5ms DropTail

$ns simplex-link $n2 $n3  1Mb  5ms DropTail

$ns simplex-link $n3 $n2  1Mb  5ms DropTail

 

set qn0n1 [[$ns link $n0 $n1] queue]

set qn2n3 [[$ns link $n2 $n3] queue]

 

#產生一個loss module

set em [new ErrorModel]

#設定是以packet為處理單位

$em unit pkt

#設定error rate 0.02

$em set rate_ 0.02

#設定發生錯誤為Uniform Distribution

$em ranvar [new RandomVariable/Uniform]

#設定發生錯誤時的動作是丟棄封包

$em drop-target [new Agent/Null]

 

#指定發生錯誤的Link是在n1n2之間

$ns lossmodel $em $n1 $n2

 

set udp0 [new Agent/UDP]

$ns attach-agent $n0 $udp0

set cbr0 [new Application/Traffic/CBR]

$cbr0 set rate_ 0.5Mb

$cbr0 attach-agent $udp0

set null0 [new Agent/Null]

$ns attach-agent $n3 $null0

$ns connect $udp0 $null0 

 

$ns at 0.0 "$cbr0 start"

$ns at $end_time "finish"

$ns run

 

結果說明:若是按照上面的程式碼去執行,會沒有任何訊息產生,所以就不知道Error Model到底有沒有效,所以筆者修改了在新增或修改n2核心模組介紹中的myfifo queue的程式碼,在enque中去統計了有多少的封包進入了佇列,然後以myfifo取代上面程式碼中n0到n1和n2到n3的DropTail,最後模擬結束後,在把結果秀出來。

 

結果為:傳送出14881個封包,最後接收到的封包為14570,所以packet loss rate為 (14881- 14570) ÷ 14881 = 0.0208,這個數字非常接近我們在TCL中所設定的error rate 0.02,因此Error Model是有效的。

 

[參考文件]

1. The ns Manual ( Chapter 13 Error Model)