dây, không dây và trạm cơ sở trong script mô phỏng cho mạng hỗn hợp không dây và có dây. Để đánh địa chỉ các trạm có dây, ta sử dụng dải địa chỉ dạng x.x.x. Trong script mô phỏng, ta quy định những trạm có dây có dải địa chỉ là 0.0.x, và các trạm không dây bao gồm cả trạm cơ sở có dải địa chỉ 1.0.x [14, 15, 16].
IV.2.3.1 Cấu hình trạm có dây
Việc tạo một trạm có dây thường được tạo trước khi tạo trạm cơ sở và trạm không dây trong script mô phỏng mạng hỗn hợp không dây và có dây, vì trạm có dây thường sử dụng cấu hình mặc định của NS, khi thiết lập các trạm không dây và trạm cơ sở, ta
51
cần lựa chọn lại các tham số cho NS. Để tạo một trạm không dây, ta sử dụng một vòng lặp để tạo nhiều trạm theo lựa chọn opt(num_wired_nodes) ở trên.
for {set i 0} {$i < $opt(num_wired_nodes)} {incr i} { set W($i) [$ns node 0.0.$i]
}
IV.2.3.2 Cấu hình trạm cơ sở
Việc cấu hình trạm cơ sở phức tạp hơn nhiều so với một trạm không dây thông thường, ta phải thiết lập: giao thức định tuyến, kiểu liên kết dữ liệu, giao thức tầng MAC, kiểu hàng đợi, kích thước hàng đợi, kênh vật lý, loại ăng-ten... Những thuộc tính này được thiết lập trong bước lựa chọn tham số cho mô phỏng như giới thiệu ở trên. Sau đây là đoạn script thực hiện việc thiết lập này.
$ns node-config -adhocRouting $opt(adhocRouting) \ -llType $opt(ll) \ -macType $opt(mac) \ -ifqType $opt(ifq) \ -ifqLen $opt(ifqlen) \ -antType $opt(ant) \ -propType $opt(prop) \ -phyType $opt(netif) \ -channel $chan \ -topoInstance $topo \ -wiredRouting ON \ -agentTrace ON \ -routerTrace OFF \ -macTrace OFF \ -movementTrace OFF
Trong đoạn script trên, chúng ta có một số lựa chọn khác so với các nút mạng có dây thông thường, như:
52
wiredRouting: lựa chọn này áp dụng cho trạm cơ sở để có thể định tuyến
được đến các trạm có dây khác, do đó trong script trên, chúng ta đặt giá trị cho nó là ON.
Do mỗi dòng tệp vết ghi lại sự kiện cho trạm không dây thường có nhiều trường hơn và có kích thước lớn hơn nên khi mô phỏng mạng không dây, NS-2 thường tạo ra tệp vết có kích thước lớn hơn tệp vết khi mô phỏng mạng có dây, nhất là khi thời gian mô phỏng là dài. NS-2 cung cấp các lựa chọn về ghi vết khác như agentTrace (ghi vết sự kiện tầng ứng dụng), routerTrace (ghi vết sự kiện định tuyến), macTrace (ghi vết sự kiện tầng MAC), movementTrace (ghi vết sự di chuyển của trạm), có thể được người nghiên cứu sử dụng để lựa chọn chỉ ghi vết các sự kiện cần quan tâm.
Sau khi đã thiết lập các tuỳ chọn cho trạm cơ sở, ta sẽ tạo trạm cơ sở bằng script được mô tả sau đây:
Set BS(0) [$ns node 1.0.0] ;# Tạo một node cơ sở có địa chỉ là 1.0.0 $BS(0) random-motion 0 ;# Lựa chọn cho trạm này không di chuyển $BS(0) set X_ 1.0 ;# Thiết lập vị trí của trạm cơ sở bao gồm X,Y,Z $BS(0) set Y_ 2.0
$BS(0) set Z_ 0.0
IV.2.3.3 Cấu hình trạm không dây
Việc tạo một trạm không dây khi mô phỏng mạng hỗn hợp có dây và không dây phức tạp hơn đôi chút so với một trạm trong mô hình mô phỏng mạng có dây hoặc một trạm di động dạng ad-hoc thông thường. Chúng ta cần đánh địa chỉ và thiết lập trạm cơ sở cho trạm đó. Đoạn script sau mô tả cách thiết lập trạm không dây sử dụng một vòng for và tham số opt(num_mobile_nodes) như đã giới thiệu ở trên.
$ns node-config -wiredRouting OFF
for {set i 0} {$i < $num_mobile_nodes} {incr i} { set wl_node_($i) [$ns node 1.0.[expr $i + 1]] $wl_node_($i) random-motion 0
$wl_node_($i) base-station [AddrParams addr2id [$BS(0) node-addr]] $wl_node_($i) set X_ [expr $i * 10]
53
$wl_node_($i) set Y_ [expr $i * 10] $wl_node_($i) set Z_ 0.0
}
Như trong đoạn script, chúng ta chú ý là một trạm di động không có chức năng định tuyến với trạm có dây, nên ta cần thiết lập lựa chọn $ns node-config -
wiredRouting OFF trước khi tạo trạm di động trong mô hình mô phỏng. Để xác định
trạm cơ sở mà trạm di động đó liên kết đến, ta sử dụng dòng lệnh: $wl_node_($i) base-
station [AddrParams addr2id [$BS(0) node-addr]] với base-station là lệnh thiết lập
thông tin của trạm cơ sở gồm AddrParams là tham số về địa chỉ trạm cơ sở. Lệnh
addr2id giúp chúng ta đọc được id của trạm cơ sở từ địa chỉ của trạm cơ sở lấy ra bằng
dòng lệnh $BS(0) node-addr.
IV.2.3.4 Tạo kết nối giữa trạm cơ sở và trạm có dây
Đây là một phần quan trọng để liên kết miền có dây và không dây. Việc tạo kết nối này không khó, giống như cách thiết lập kết nối giữa các trạm có dây với nhau.
$ns duplex-link $W(0) $BS(0) 10Mb 2ms DropTail
Script trên mô tả cách thiết lập liên kết giữa trạm có dây và trạm cơ sở với dòng lệnh duplex-link, tham số đầu vào là trạm nguồn ($W(0)), trạm đích ($BS(0)), băng thông của kết nối (10Mb), độ trễ truyền giữa kết nối (2ms) và kiểu hàng đợi sử dụng trong liên kết (DropTail).
IV.2.4. Tạo các nguồn sinh lƣu lƣợng
Trong NS, dữ liệu chỉ được sinh ra từ ứng dụng sinh lưu lượng sử dụng các giao thức giao vận như TCP hay UDP. Với khuôn khổ của luận văn, tôi tìm hiểu cách tạo nguồn sinh lưu lượng FTP với giao thức giao vận là TCP và nguồn sinh lưu lượng CBR (Constant Bit Rate) sử dụng giao thức giao vận UDP. Để sinh nguồn lưu lượng FTP sử dụng TCP trong NS-2, đầu tiên phải thiết lập kết nối TCP giữa trạm gửi và trạm nhận thông qua thực thể gửi TCP và thực thể nhận TCPSink, sau đó gắn kết nối TCP với ứng dụng sinh lưu lượng FTP. Đoạn script sau mô tả cách tạo ra nguồn sinh lưu lượng FTP sử dụng giao thức giao vận TCP.
54
set tcp [new Agent/TCP] set sink [new Agent/TCPSink] $tcp set fid_ 1
set ftp [new Application/FTP]
$ns attach-agent $wl_node_(0) $tcp $ns attach-agent $W(0) $sink $ns connect $tcp $sink $ftp attach-agent $tcp $ns at 1.0 "$ftp start" $ns at 50.0 "$ftp stop"
Việc tạo ra thực thể gửi TCP và thực thể nhận TCPSink được mô tả như hai dòng đầu của đoạn script. Thực thể Agent/TCP và Agent/TCPSink là các đối tượng được viết và dịch sử dụng C++, sau đó được liên kết với OTcl. Khi đã tạo ra thực thể này, sau đó ta phải gắn chúng vào từng trạm sử dụng lệnh attach-agent của ns và thiết lập kết nối giữa hai thực thể sử dụng lệnh connect. Để tiện theo dõi luồng gói tin truyền giữa hai thực thể trong tệp vết, ta có thể gán fid_ (flow id) trực tiếp cho luồng gói tin qua thực thể gửi như $tcp set fid_ 1. Tiếp theo, ta cần sinh ra một nguồn sinh lưu lượng FTP, chúng ta sử dụng đối tượng Agent/FTP như được mô tả trong dòng thứ 3. Nguồn sinh lưu lượng này được gắn với thực thể gửi TCP sử dụng câu lệnh $ftp attach-agent
$tcp. Cuối cùng, ta cần lập lịch để nguồn sinh lưu lượng đó hoạt động. Để lập lịch sự
kiện bắt đầu gửi hay dừng gửi, ta sử dụng $ns at time “string” trong đó time là thời gian xảy ra sự kiện và string câu lệnh thực thi sự kiện như “$ftp start” – bắt đầu truyền hoặc “$ftp stop” - dừng truyền thông.
Cũng tương tự việc tạo ra nguồn sinh lưu lượng FTP sử dụng giao thức TCP, tạo ra một nguồn sinh lượng CBR sử dụng giao thức giao vận UDP cũng gồm có 3 bước là tạo kết nối sử dụng thực thể Agent/UDP và thực thể nhận Agent/Null, tạo nguồn sinh lưu lượng CBR và gắn vào thực thể gửi UDP, lập lịch để nguồn CBR sinh lưu lượng.
set upd [new Agent/UDP] $udp set fid_ 2
set null1 [new Agent/Null]
55
$ns attach-agent $W(0) $null1 $ns connect $udp $null
set cbr [new Application/Traffic/CBR] $cbr attach-agent $udp
$cbr set type_ CBR $cbr set packet_size_ 500 $cbr set rate_ 1mb
$cbr set random_ false $ns at 1.0 "$cbr start" $ns at 50.0 "$cbr stop"
IV.3. Thực hiện mô phỏng và phân tích kết quả