在本小節中,筆者將介紹如何把實際網路的流量灌到NS2內。以筆者的研究來說,筆者需要做多媒體傳輸的效能分析,但是NS2並沒有提供一個比較適合筆者的應用程式類型,雖然說有些學者是用On-Off model with exponential distribution來模擬多媒體傳輸,但是以筆者的研究,這樣的模型還是有點粗糙,所以筆者現在所使用的方法,都是直接拿一套多媒體傳輸軟體在自己所架設的私有網路上做傳輸,然後寫一個類似sniffer的軟體去收集應用程式所送出來封包的資訊,然後在把這個所收集到資訊灌到ns2中做網路效能分析。

 

[方法]

        NS2模擬軟體中,NS2提供了一種類型的應用程式Traffic Trace,它可以讀取使用者所提供的資訊,然後產生出對應的封包。在使用Traffic Trace時,需要使用者提供一個二進位的檔案(Binary File),裡面包含了兩個欄位的資料,第一個欄位的資料是inter-packet time,單位是us (10-6);第二欄位是封包的大小,這邊要提醒大家一下,若是第二欄位的值大於網路模擬環境中UDP封包的最大值,則所提供的值就會被切割成許多封包然後在同一時間發送出去,例如,提供的值是2050,而UDPpacketSize_是設為1000,則會產生三個封包( 1000bytes1000bytes50bytes)並且會在同一時間送出。

        在這裡筆者用一個範例來介紹Traffic Trace的應用。

 

[Tcl Code]

set ns [new Simulator]

 

set nf [open out.nam w]

$ns namtrace-all $nf

 

# generate the sending node:

#產生一個傳送節點

set send_node [$ns node]

 

# generate the routers:

#產生兩個路由器節點

set router_node_1 [$ns node]

set router_node_2 [$ns node]

 

# generate the receiving node:

#產生一個接收節點

set recv_node [$ns node]

 

# define the links between the nodes:

# 定義節點與節點之間的連線

$ns duplex-link $send_node $router_node_1 1Mb 10ms DropTail

$ns duplex-link $router_node_1 $router_node_2 1Mb 10ms DropTail

$ns duplex-link $router_node_2 $recv_node 1Mb 10ms DropTail

 

# set the maximal queue lengths of the routers:

# 設定佇列的buffer size

$ns queue-limit $router_node_1 $router_node_2 10

$ns queue-limit $router_node_2 $recv_node 10

 

# define the source

# 定義傳送端

set udp [new Agent/UDP]

$ns attach-agent $send_node $udp

 

# define the destination:

# 定義接收端

set snk [new Agent/Null]

$ns attach-agent $recv_node $snk

 

# 把傳送端和接收端連結起來

$ns connect $udp $snk

 

# generate the video trace file ("Verbose_Jurassic_64.dat" is only an example):

# Verbose_Jurassic_64.dat的資料中要產生一個trace file,以提供Traffic Trace

set original_file_name Verbose_Jurassic_64.dat

set trace_file_name video.dat

set original_file_id [open $original_file_name r]

set trace_file_id [open $trace_file_name w]

 

set last_time 0

 

while {[eof $original_file_id] == 0} {

  gets $original_file_id current_line

 

  if {[string length $current_line] == 0 ||

      [string compare [string index $current_line 0] "#"] == 0} {

    continue 

  }

 

  scan $current_line "%d%s%d" next_time type length

 

  set time [expr 1000*($next_time-$last_time)]

 

  set last_time $next_time

 

#產生binary file,要提供資料給Traffic Trace

  puts -nonewline $trace_file_id [binary format "II" $time $length]

}

 

close $original_file_id

close $trace_file_id

 

# set the simulation end time:

# 設定模擬結束時間

set end_sim_time [expr 1.0*$last_time/1000+0.001]

 

# read the video trace file:

#資料提功給Traffic Trace

set trace_file [new Tracefile]

$trace_file filename $trace_file_name

set video [new Application/Traffic/Trace]

$video attach-agent $udp

$video attach-tracefile $trace_file

 

# start the simulation:

# 開始模擬

$ns at 0.0 “$video start”

 

# stop the simulation:

# 結束模擬

$ns at $end_sim_time “finish”

 

#定義一個程序

proc finish {} {

  global ns nf

  $ns flush-trace

  close $nf

  exec nam out.nam &

  exit 0

}

 

#開始模擬

$ns run

 

完整的範例可以到http://www.tkn.tu-berlin.de/research/trace/simulation/nsExample.tar.gz下載。

 

關於如何做多媒體的效能分析,筆者會在Multimedia Communication這個章節說明。

 

[參考資料]

1. http://www.tkn.tu-berlin.de/research/trace/trace.html