2 ADSL 2Mbps, 10ms 128Kbps, 20ms 2.048Mbps, 20ms Full Duplex tcp 10Mbps, 5ms Full Duplex Sink 3 1 0 ftp
81
Giả sử, một người sử dụng đang làm việc tại nỳt 0 đang tải xuống mỏy làm việc một tập tin bằng giao thức truyền tệp (FTP), giao thức này sử dụng giao thức TCP ở tầng giao vận để truyền tải số liệu.
Để mụ tả một mạng với cỏc tham số cấu hỡnh như trờn thỡ kịch bản sẽ được viết như sau, trong NS:
# tạo mụ phỏng
set ns [new Simulator]
# tạo cỏc nỳt mạng mụ phỏng set n0 [$ns node]
set n1 [$ns node] set n2 [$ns node] set n3 [$ns node]
# liờn giữa hai nỳt 0 và nỳt 1
$ns duplex-link $n0 $n1 10Mb 5ms DropTail # liờn kết từ nỳt 1 đến nỳt 2 $ns simplex-link $n1 $n2 2Mb 10ms DropTail # liờn kết từ nỳt 2 đến nỳt 1 $ns simplex-link $n2 $n1 $rbw 100ms $rgw # liờn kết giữa nỳt 2 và nỳt 3 $ns duplex-link $n2 $n3 2.048Mb 20ms DropTail
# tạo kết nối TCP dạng Reno/Asym – Reno với bất đối xứng set tcp [createTcpSource "TCP/Reno/Asym" $maxburst $tcpTick]
set sink [createTcpSink "TCPSink/Asym" $sinktrace $ackSize $maxdelack]
# tạo một kết nối ftp trờn kết nối TCP set src $n3
set dst $n0
set ftp [createFtp $ns $src $tcp $dst $sink]
Hàm createTcpSource với cỏc tham số được mụ tả như sau:
proc createTcpSource { type { maxburst 0 } { tcpTick 0.1 } { window 100 } { slow_start_restart false } { fs_enable false } {ssthresh 0} {flr true} {frt true} } {
set tcp0 [new Agent/$type] ;# Kiểu kết nối TCP $tcp0 set class_ 1
$tcp0 set maxburst_ $maxburst # số gúi tin lớn nhất chuyển đi # một lần mà khụng cần chờ ACK
82
$tcp0 set maxcwnd_ $window # giỏ trị lớn nhất cửa sổ tắc nghẽn $tcp0 set ecn_ 1
$tcp0 set g_ 0.125 # tham số dựng để tớnh RTT $tcp0 set slow_start_restart_ $slow_start_restart if {$fs_enable} {
$tcp0 set fs_enable_ $fs_enable }
if {$ssthresh > 0} {
$tcp0 set ssthresh_ $ssthresh }
$tcp0 set fast_loss_recov_ $flr $tcp0 set fast_reset_timer_ $frt return $tcp0
}
Hàm createFtp với cỏc tham số được mụ tả như sau: proc createFtp { ns n0 tcp0 n1 sink0 } {
$ns attach-agent $n0 $tcp0 $ns attach-agent $n1 $sink0 $ns connect $tcp0 $sink0 set ftp0 [new Source/FTP] $ftp0 attach $tcp0
return $ftp0 }
Cỏc tham số mặt định được dựng trong cac kết nối TCP như sau: set maxdelack 25 set maxburst 3 set upwin 0 set tcpTick 0.1 set ackSize 40 set rbw 28.8Kb set rqsize 10 set qsize 10 set rgw "DropTail" set nonfifo 0 set acksfirst false set filteracks false set replace_head false set midtime 0
83
Sau khi chạy chương trỡnh mụ phỏng, chỳng ta cú thể sử dụng tệp vết mà nú sinh ra là out.tr để phõn tớch đỏnh giỏ hiệu suất mạng. Để xem mạng mụ phỏng bằng đồ họa ta sử dụng chương trỡnh luụn đi kốm với NS là NAM với tệp dữ liệu vào của nú là tệp out.nam. Để thực hiện được việc này ta dựng cỏc lệnh sau trong kịch bản.
set f [open out.tr w] $ns trace-all $f
set fnam [open out.nam w] $ns namtrace-all $fnam
Ngoài ra, để tiện cho việc thực hiện kịch bản cho nhiều phiờn bản giao thức TCP khỏc nhau, cũng như nhiều tham số khỏc nhau cho kết nối TCP đú. Chỳng tụi sử dụng thờm cỏc tham số dũng lệnh trong kịch bản mụ phỏng. Cỏc dũng lệnh sau sẽ thực hiện việc này:
# read user options and act accordingly set count 0
while {$count < $argc} {
set arg [lindex $argv $count] incr count 2
switch -exact '$arg' { '-graph' { set graph 1 incr count -1 continue } '-mda' {
set maxdelack [lindex $argv [expr $count-1]] continue
}
'-acksz' {
set ackSize [lindex $argv [expr $count-1]] continue
}
'-mb' {
set maxburst [lindex $argv [expr $count-1]] continue
84
continue }
'-tk' {
set tcpTick [lindex $argv [expr $count-1]] continue
}
'-rbw' {
set rbw [lindex $argv [expr $count-1]] continue
}
'-rq' {
set rqsize [lindex $argv [expr $count-1]] continue
} '-q' {
set qsize [lindex $argv [expr $count-1]] Queue set limit_ $qsize
continue }
'-stoptime' {
set stop_time [lindex $argv [expr $count-1]] continue } '-nonfifo' { set nonfifo 1 incr count -1 continue } '-noecn' {
Agent/TCP set disable_ecn_ 1 incr count -1 continue } '-red' { set rgw "RED" incr count -1 continue } '-acksfirst' {
set acksfirst true incr count -1 continue }
'-filteracks' {
set filteracks true incr count -1
continue }
'-replace_head' {
set replace_head true incr count -1
continue }
'-mid' {
set midtime [lindex $argv [expr $count-1]] continue
85
default {
incr count -2 }
}
switch -exact '$arg' { '-dn' {
set direction "down" }
'-up' {
set direction "up" }
default {
puts "arg $arg" printUsage exit
} }
incr count 1
set arg [lindex $argv $count] switch -exact '$arg' {
'-asym' {
set type "asym" }
'-asymsrc' {
set type "asymsrc" }
'-reno' {
set type "reno" }
'-newreno' {
set type "newreno"
}
'-sack1' {
set type "sack1"
}
default {
puts "arg $arg" printUsage exit
} }
incr count 1
set arg [lindex $argv $count] set startTime $arg
incr count 1
set connGraph 0
set arg [lindex $argv $count] if { $arg == "-graph" } {
set connGraph 1 incr count 1 }
86
set dst $n3
} elseif { $direction == "up" } { set src $n3
set dst $n0 } else {
}
if { $type == "asym" } {
set tcp [createTcpSource "TCP/Reno/Asym" $maxburst $tcpTick] set sink [createTcpSink "TCPSink/Asym" $sinktrace $ackSize $maxdelack]
} elseif { $type == "asymsrc" } {
set tcp [createTcpSource "TCP/Reno/Asym" $maxburst $tcpTick] set sink [createTcpSink "TCPSink" $sinktrace $ackSize]
} elseif { $type == "reno" } {
set tcp [createTcpSource "TCP/Reno" $tcpTick]
set sink [createTcpSink "TCPSink" $sinktrace $ackSize] } elseif { $type == "newreno" } {
set tcp [createTcpSource "TCP/Newreno" $tcpTick]
set sink [createTcpSink "TCPSink" $sinktrace $ackSize] } elseif { $type == "sack1" } {
set tcp [createTcpSource "TCP/Sack1" $tcpTick]
set sink [createTcpSink "TCPSink" $sinktrace $ackSize] }
if { $direction == "up" && $upwin != 0 } { $tcp set window_ $upwin
}
set ftp [createFtp $ns $src $tcp $dst $sink] setupTcpTracing $tcp $tcptrace
setupGraphing $tcp $connGraph connGraphFlag $ns at $startTime "$ftp start"
}
3.4 Cỏch tạo kịch bản mụ phỏng mạng hỗn hợp cú dõy và khụng dõy và đường truyền bất đối xứng
Dưới đõy chỳng tụi trỡnh bày sơ lược về cỏc thành phần cơ bản của một nỳt mạng khụng dõy, cỏch tạo ra một mạng hỗn hợp cú dõy và khụng dõy trong NS-2. Cỏc thành phần khỏc cú thể xem thờm trong NS-Manual [10].
Ngăn xếp mạng cho một nỳt khụng dõy bao gồm một tầng liờn kết (LL - Link Layer), một mụ-đun phõn giải địa chỉ ARP (Address Resolution Protocol) nối đến LL, một hàng đợi giao tiếp ưu tiờn (IFq - Interface Queue), một tầng mac (MAC -Medium Access Control), một giao tiếp mạng (netIF -
87
Network Interface), tất cả được nối đến kờnh truyền. Cỏc thành phần mạng được tạo và ghộp với nhau bằng cỏc cõu lệnh của ngụn ngữ OTcl. Vớ dụ, một phương thức của nỳt khụng dõy cú chức năng thờm giao tiếp tờn là add- interface() được cài đặt trong OTcl như sau:
#
# The following setups up link layer, mac layer, network interface # and physical layer structures for the mobile node.
#
Node/MobileNode instproc add-interface { channel pmodel lltype mactype qtype qlen iftype anttype } {
$self instvar arptable_ nifs_ $self instvar netif_ mac_ ifq_ ll_ global ns_ MacTrace opt
set t $nifs_ incr nifs_
set netif_($t) [new $iftype] ;# net-interface set mac_($t) [new $mactype] ;# mac layer set ifq_($t) [new $qtype] ;# interface queue set ll_($t) [new $lltype] ;# link layer set ant_($t) [new $anttype]
#
# Local Variables #
set nullAgent_ [$ns_ set nullAgent_] set netif $netif_($t)
set mac $mac_($t) set ifq $ifq_($t) set ll $ll_($t) #
# Initialize ARP table only once. #
if { $arptable_ == "" } {
set arptable_ [new ARPTable $self $mac] set drpT [cmu-trace Drop "IFQ" $self] $arptable_ drop-target $drpT } # # Link Layer # $ll arptable $arptable_ $ll mac $mac
$ll up-target [$self entry] $ll down-target $ifq
#
# Interface Queue #
$ifq target $mac $ifq set qlim_ $qlen
set drpT [cmu-trace Drop "IFQ" $self] $ifq drop-target $drpT
88
#
$mac netif $netif $mac up-target $ll $mac down-target $netif $mac nodes $opt(nn) #
# Network Interface #
$netif channel $channel $netif up-target $mac
$netif propagation $pmodel ;# Propagation Model $netif node $self ;# Bind node <---> interface $netif antenna $ant_($t) ;# attach antenna #
# Physical Channel #
$channel addif $netif ;# add to list of interfaces
# ============================================================ # Setting up trace objects
if { $MacTrace == "ON" } { #
# Trace RTS/CTS/ACK Packets #
set rcvT [cmu-trace Recv "MAC" $self] $mac log-target $rcvT
#
# Trace Sent Packets #
set sndT [cmu-trace Send "MAC" $self] $sndT target [$mac sendtarget]
$mac sendtarget $sndT #
# Trace Received Packets #
set rcvT [cmu-trace Recv "MAC" $self] $rcvT target [$mac recvtarget]
$mac recvtarget $rcvT #
# Trace Dropped Packets #
set drpT [cmu-trace Drop "MAC" $self] $mac drop-target $drpT
} else {
$mac log-target [$ns_ set nullAgent_] $mac drop-target [$ns_ set nullAgent_] }
# ============================================================ $self addif $netif
}
Để hiểu rừ hơn về cỏch viết một kịch bản cho mạng hỗn hợp cú dõy và khụng dõy. Chỳng tụi trỡnh bày một vớ dụ tạo một kịch bản cho mạng hỗn hợp bao gồm hai nỳt cú dõy, 2 và 3, nối với một nỳt khụng dõy 0 thụng qua một
89
nỳt cơ sở 1 (base-station node). Nỳt 1 giống như một cổng ra vào (gateways) giữa hai vựng cú dõy và khụng dõy. Nú cho phộp cỏc gúi số liệu cú thể trao đổi giữa cỏc nỳt cú dõy và khụng dõy. Hỡnh 3.2 biểu diễn cấu trỳc liờn kết mạng đó núi ở trờn.