Tải bản đầy đủ (.docx) (35 trang)

mô phỏng mạng thông tin cho trước bằng phần mềm chuyên dùng ns-2

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (586.94 KB, 35 trang )

*******
Đề bài: Mô phỏng mạng thông tin cho trước bằng phần mềm
chuyên dùng NS-2
Giảng viên hướng dẫn: TS. Phạm Văn Tiến
Sinh viên thực hiện:
Cù Xuân Toản 20092786
Phạm Xuân Trung 20092890
Phạm Khánh Thiện 20092580
Đặng Văn Tình 20109582
Lê Đình Trung 20093812
Lê Văn Tuấn 20092981

1

Hà Nội – 11/2012
2
NỘI DUNG………………………………………………………………………… Trang
Đề bài…………………………………………………………………………… 3
Công cụ mô phỏng……………………………………………………………… 4
Phân chia công việc…………………………………………………………… 4
Bài giải…………………………………………………………………………….5
Câu 1. Xây dựng kịch bản mô phỏng trong thời gian không ngắn hơn 5’……….5
Câu 2. Thu thập số liệu và vẽ đồ thị trễ xếp hàng tại từng nút mạng…………….9
Câu 3. Thu thập, vẽ đồ thị khả thông mỗi luồng sau khi giả thiết cứ sau 30s băng
thông tất cả các liên kết giảm 25% 13
Câu 4. Thay đổi kích thước gói và làm lại ý 2. Nhận xét…………………… …15
Phụ lục 1. Đồ thị các kết quả…………………………………………………….16
Phụ lục 2. Codes toàn bài……………………………………………………… 24
3
Đề bài:
Bài tập 3:


Cho mạng thông tin có cấu hình như Hình 3. Nút s gắn với hai nguồn lưu lượng tcp
1
và tcp
2
gửi các gói đến nút d, dựa trên giao thức truyền TCP. Cả hai nguồn gửi ra
các gói có chiều dài cố định là 1300byte. Nguồn tcp
1
phát ra các gói đều đặn theo
thời gian với tốc độ 600 gói/s. Số lượng gói phát ra từ nguồn tcp
2
tuân theo phân bố
Poisson, tốc độ 200 gói/s.
Hình 3
1. Viết kịch bản và chạy mô phỏng hệ thống thông tin nói trên trong khoảng thời gian
không ngắn hơn 5 phút.
2. Thu thập và vẽ đồ thị các số liệu trễ xếp hàng của các gói tại các nút mạng.
3. Trong một phiên chạy mô phỏng, giả thiết cứ sau 30s, băng thông của mỗi liên
kết lại giảm đi 25%, hãy thu thập số liệu và vẽ đồ thị biểu diễn khả thông của mỗi
luồng trong mỗi khoảng thời gian đó.
4. Thay đổi kích thước gói rồi làm lại các thao tác trong mục 2. Nhận xét kết quả thu
được.
4
Công cụ mô phỏng:
Phần mềm NS-2 (network Simulator v2). Đây là phần mềm mã nguồn mở, mô
phỏng các sự kiện rời rạc nhằm mục đích nghiên cứu mạng, nó hỗ trợ các giao thức
mạng như: TCP, UDP,… hoạt động của những tài nguyên mạng như FTP, Telnet, Web,
CRB và VBR, các cơ chế quản lý hàng đợi router như Drop Tail, RED và CBQ các
thuật toán định tuyến… NS2 được viết trên ngôn ngữ C++ và Otcl.
Nhóm đã cài đặt NS2 bản 2.35 all-in-one trên hệ điều hành Ubuntu 12.04. Cách cài đặt
và download phần mềm có đầy đủ tại: />tid=28&pid=149#pid149


Phân chia công việc:
I. Cù Xuân Toản:
Xây dựng kịch bản mô phỏng (tạo nguồn, các node và đích), tìm hiểu về NS-2,
viết code cho kịch bản, chạy thử kịch bản.
II. Phạm Xuân Trung:
Tìm hiểu lí thuyết, viết thuật toán thu thập số liệu và vẽ đồ thị số liệu trễ tại từng
nút mạng. Tổng hợp codes của các thành viên, thu thập kết quả và viết báo cáo
chung.
III. Đặng Văn Tình, Lê Đình Trung:
Tìm hiểu lý thuyết, cách dùng NS-2, viết thuật toán xử lý sự kiện sau 30s băng
thông các liên kết giảm, viết thủ tục thu thập số liệu khả thông từng luồng.
IV. Phạm Khánh thiện, Lê Văn Tuấn:
Đọc lý thuyết, cách dùng NS-2, viết code, thuật toán thu thập số liệu trễ các node
mạng, thay đổi số liệu là số gói, đưa ra nhận xét.
5
Bài giải:
Câu 1:
Thực hiện câu 1 đơn giản là ta làm quen với NS-2 và công cụ NAM (Network Animator).
Đó là việc tạo các node mạng, nguồn theo giao thức TCP, tạo các liên kết, thiết lập các
băng thông, thời gian mô phỏng 5 phút.
Giả Thiết :
- Độ dài hàng đợi : K=50.
- Trễ lan truyền trên các liên kết là 10ns
- Chiều dài cố định của gói la 1300 bytes
- Tcp1 phát ra gói đều đặn tốc độ 600 gói/s
- Tcp2 tuân theo phân bố Poisson tốc độ 200 gói/s
Sau khi tạo các node chúng ta tạo liên kết giữa các node với nhau. Chúng ta có kết nối
giữa nguồn phát tin với các node gần nhất và giữa đích cuối và node đích d là kết nối
100Base-T Ethernet tức là 100Mbps , các liên kết nối các node còn lại có băng thông là

lần lượt là 20Kbps, 40Kbps, 2Mbps, 20Kbps, 15Kbps, 1Mbps, độ trễ truyền lan giữa hai
node là 10ns. Chúng ta có thể sử dụng các chế độ hàng đợi khác nhau:
+ Với hàng đợi DropTail là chế độ ngắt đuôi.Tức là khi hàng đợi đầy, các gói đến sau sẽ
bị Drop.
+ Hàng đợi SFQ(Stochastic Fair Queue).Hàng đợi này cũng thực hiện quá trình ngắt đuôi
như DropTail.Tuy nhiên nó cho phép ngắt bỏ công bằng tức số lượng các gói bị ngắt bỏ
thuộc mỗi luồng là giống nhau.
+ Hàng đợi RED( Random Early Discard) – Loại trừ ngẫu nhiên sớm.Tức gói nào đến
trước thì nó sẽ loại trừ.
+ Hàng đợi CBQ(Class Based Queue) – Hàng đợi theo lớp
Ở đây nhóm sử dụng hàng đợi DropTail.
Bộ giao thức TCP/IP (Internet Protocol Suite hoặc IP suite hoặc TCP/IP protocol suite
- Bộ giao thức liên mạng). Đó là 2 giao thức đầu tiên được định nghĩa. Đó là bộ các
giao thức truyền thông cài đặt chồng giao thức mà Internet và hầu hết các mạng máy
tính thương mại đang chạy trên đó. Bộ giao thức này được đặt tên theo hai giao thức
chính của nó là TCP (Giao thức Điều khiển Giao vận) và IP (Giao thức Liên mạng).
Như nhiều bộ giao thức khác, bộ giao thức TCP/IP có thể được coi là một tập hợp các
tầng, mỗi tầng giải quyết một tập các vấn đề có liên quan đến việc truyền dữ liệu, và
cung cấp cho các giao thức tầng cấp trên một dịch vụ được định nghĩa rõ ràng dựa trên
việc sử dụng các dịch vụ của các tầng thấp hơn. Về mặt lôgic, các tầng trên gần với
người dùng hơn và làm việc với dữ liệu trừu tượng hơn, chúng dựa vào các giao thức
tầng cấp dưới để biến đổi dữ liệu thành các dạng mà cuối cùng có thể được truyền đi
một cách vật lý.
Tổng quan giao thức TCP/IP @wikipedia.com
Nguồn:
6
Codes:
# Tạo đối tượng mô phỏng
set ns [new Simulator]
# Tạo màu cho luồng dữ liệu

$ns color 1 green
$ns color 2 red
# Open the nam trace file
set nf [open out.nam w]
$ns namtrace-all $nf
# Open the trace files
set tf [open out.tr w]
$ns trace-all $tf
# Build finish procedure-Xây dựng hàm (thủ tục) finish
proc finish {} {
global ns nf tf
$ns flush-trace
#Close the trace files
close $tf
close $nf
exit 0
}
# Kích thước hàng đợi
set qsize 50
# Kích thước gói
set pksize 1300
#set pksize 5000
# Tốc độ truyền của nguồn tcp1=600
set lambda1 600
# Tốc độ truyền của nguồn tcp2=200
set lambda2 200
# Tạo giá trị cho các băng thông liên kết
set band1 100
set band2 100
set band3 20

set band4 40
set band5 2
set band6 20
set band7 15
set band8 1
set band9 100
7
# Tạo các node mạng
set s1 [$ns node]
set s2 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
set n3 [$ns node]
set n4 [$ns node]
set d [$ns node]
# Thiết lập màu blue cho các nodes
$n1 color blue
$n2 color blue
$n3 color blue
$n4 color blue
# Set color for sources and destination
$s2 color red
$s2 shape box
$s1 color green
$s1 shape box
$d color black
$d shape box
# Tạo các liên kết giữa các nodes và với nguồn s1, s2
$ns duplex-link $s1 $n1 [expr $band1]Mb 10ns DropTail
$ns duplex-link $s2 $n1 [expr $band2]Mb 10ns DropTail

$ns duplex-link $n1 $n2 [expr $band3]Kb 10ns DropTail
$ns duplex-link $n1 $n3 [expr $band4]Kb 10ns DropTail
$ns duplex-link $n1 $n4 [expr $band5]Mb 10ns DropTail
$ns duplex-link $n2 $n4 [expr $band6]Kb 10ns DropTail
$ns duplex-link $n2 $n3 [expr $band7]Kb 10ns DropTail
$ns duplex-link $n4 $n3 [expr $band8]Mb 10ns DropTail
$ns duplex-link $n3 $d [expr $band9]Mb 10ns DropTail
# Quản lí hàng đợi
$ns duplex-link-op $n1 $n3 queuePos 0.5
$ns duplex-link-op $n2 $n3 queuePos 0.5
$ns duplex-link-op $n4 $n3 queuePos 0.5
$ns duplex-link-op $n1 $n2 queuePos 0.5
$ns duplex-link-op $n1 $n4 queuePos 0.5
$ns duplex-link-op $n2 $n4 queuePos 0.5
# Sắp sếp các nodes & nguồn
$ns duplex-link-op $s1 $n1 orient right
$ns duplex-link-op $s2 $n1 orient right
$ns duplex-link-op $n1 $n2 orient right-up
$ns duplex-link-op $n1 $n3 orient right
$ns duplex-link-op $n1 $n4 orient right-down
$ns duplex-link-op $n2 $n4 orient down
$ns duplex-link-op $n2 $n3 orient right-down
$ns duplex-link-op $n4 $n3 orient right-up
8
$ns duplex-link-op $n3 $d orient right
# Thiết lập kích thước hàng đợi bằng qsize = 50
$ns queue-limit $s1 $n1 [expr $qsize]
$ns queue-limit $s2 $n1 [expr $qsize]
$ns queue-limit $n1 $n2 [expr $qsize]
$ns queue-limit $n1 $n3 [expr $qsize]

$ns queue-limit $n1 $n4 [expr $qsize]
$ns queue-limit $n2 $n4 [expr $qsize]
$ns queue-limit $n2 $n3 [expr $qsize]
$ns queue-limit $n4 $n3 [expr $qsize]
$ns queue-limit $n3 $d [expr $qsize]
# Định giá (cost) cho các liên kết
$ns cost $n1 $n2 1
$ns cost $n2 $n3 5
$ns cost $n3 $n4 5
$ns cost $n2 $n4 1
$ns cost $n1 $n4 5
$ns cost $n1 $n3 12
# Tạo nguồn tcp1 và tcp2 nối với đích
set tcp1 [new Agent/TCP]
$ns attach-agent $s1 $tcp1
$tcp1 set class_ 1
set tcp2 [new Agent/TCP]
$ns attach-agent $s2 $tcp2
$tcp2 set class_ 2
# Set Sink agents
set sink1 [new Agent/TCPSink]
$ns attach-agent $d $sink1
set sink2 [new Agent/TCPSink]
$ns attach-agent $d $sink2
# Connect agents
$ns connect $tcp1 $sink1
$ns connect $tcp2 $sink2
# Tạo nguồn tcp1 là dạng CBR
set cbr [new Application/Traffic/CBR]
$cbr set type_ CBR

$cbr set PacketSize_ [expr $pksize]
$cbr set rate_ [expr $pksize * $lambda1] #0.78Mb/s
$cbr set fid_ 1
$cbr attach-agent $tcp1
# Tạo nguồn dạng poission và nối tới tcp2
set pois [new Application/Traffic/Exponential]
$pois attach-agent $tcp2
$pois set packetSize_ [expr $pksize]
9
$pois set burst_time_ 0
$pois set idle_time_ 500ms
$pois set rate_ [expr $pksize * $lambda2] #0.26Mb/s
$pois set fid_ 2
# Schedules - Các tiến trình
$ns at 0.0 "$s1 label \"s\""
$ns at 0.0 "$s2 label \"s\""
$ns at 0.0 "$n1 label \"node 1\""
$ns at 0.0 "$n2 label \"node 2\""
$ns at 0.0 "$n3 label \"node 3\""
$ns at 0.0 "$n4 label \"node 4\""
$ns at 0.0 "$d label \"d\""
$ns at 0.1 "$cbr start"
$ns at 0.1 "$pois start"
# Thời gian mô phỏng 300s ~ 5 phút
$ns at 300 "$cbr stop"
$ns at 300 "$pois stop"
# Kết thúc sau mô phỏng sau đó 1s
$ns at 301 "finish"
#Run the simulation
$ns run

code câu hỏi 1 hoàn thành
Chú ý: Ở đây tạo nguồn TCP
1
và TCP
2
theo giao thức TCP cùng các Agent tương ứng.
Tiến trình CBR (Constant Bit Rate - Tốc độ bit cố định) được tạo và gắn cho nguồn
TCP
1
.
Tiến trình POS (Poisson) được tạo và gắn cho nguồn TCP
2
.
Các kết nối giữa các nodes phải là liên kết 2 chiều do sử dụng giao thức TCP (Khác với
UDP sử dụng liên kết 1 chiều).
Câu 2:
Yêu cầu ở đây là thu thập số liệu và vẽ đồ thị thể hiện trễ xếp hàng tại các nút mạng. Để
thu thập được chính xác các thông số liên quan ta sẽ sử dụng dữ liệu của file trace được
xuất ra trong quá trình mô phỏng. Ở đây, chương trình sẽ được thiết lập kịch bản xuất ra
file trace có tên là out.tr. File sẽ được tạo ra sau lệnh:
set tf [open out.tr w]
$ns trace-all $tf
File out.tr được xuất ra sẽ có nội dung như sau:
Gồm tất cả 12 cột:
10
Trong đó:
• event: thao tác được thực hiện trong mô phỏng
• time: thời gian xuất hiện sự kiện
• from node: là node đầu vào gói tin
• to node: là node đích

• pkt type: loại packet
• pkt size: kích cỡ packet
• flags: cờ
• fid: mã luồng
• src addr: địa chỉ node nguồn
• dst addr: địa chỉ node đích
• seq num: số trình tự
• pkt id: mã packet duy nhất
Bảng sau cho ví dụ nội dung file:
1 2 3 4 5 6 7 8 9 10 11 12
r 0.172323 5 4 tcp 40 1 0.0 6.0 0 0
+ 0.172323 4 6 tcp 40 1 0.0 6.0 0 0
- 0.172323 4 6 tcp 40 1 0.0 6.0 0 0
r 0.182326 4 6 tcp 40 1 0.0 6.0 0 0
+ 0.182326 6 4 ack 40 1 6.0 0.0 0 1
- 0.182326 6 4 ack 40 1 6.0 0.0 0 1
r 0.19233 6 4 ack 40 1 6.0 0.0 0 1
+ 0.19233 4 2 ack 40 1 6.0 0.0 0 1
- 0.19233 4 2 ack 40 1 6.0 0.0 0 1
r 0.21033 4 2 ack 40 1 6.0 0.0 0 1
+ 0.21033 2 0 ack 40 1 6.0 0.0 0 1
- 0.21033 2 0 ack 40 1 6.0 0.0 0 1
r 0.220333 2 0 ack 40 1 6.0 0.0 0 1
+ 0.220333 0 2 tcp 1040 1 0.0 6.0 1 2
- 0.220333 0 2 tcp 1040 1 0.0 6.0 1 2
Các giá trị của cột event (cột $1). Thống kê cột đầu tiên (cột chỉ ra hoạt động của hàng
đợi) có: Thao tác thêm vào hàng đợi (‘+’), thao tác lấy ra khỏi hàng đợi (‘-’), sự kiện
nhận gói tin (‘r’) – tức là được phục vụ và sự kiện huỷ packet (‘d’).
11
Ta tạo ra các file .AWK dùng ngôn ngữ AWK để lấy dữ liệu từ file trace này lưu vào một

file khác dạng file.tr Kiến thức về ngôn ngữ này được tham khảo trên wikipedia, link
tham khảo phần cuối code bên dưới. Các file .awk đặt cùng thư mục với file chính .tcl
Ở đây xét trễ tại node 1 ta tạo file delay_N1.awk để xuất các thông tin cần thiết từ cột $1
và cột $4 của file trace out.tr Thuật toán như sau:
Thời gian trễ tại từng node là T
delay
= T
received
- T
send .
Sau đó các số liệu sẽ được lưu vào một
mảng
Nhiệm vụ của file delay_N1.awk là sẽ lọc các thời gian ứng với các sự kiện nhận gói và
gửi gói đi. Nội dung như sau:
Delay_N1.awk  thu thập số liệu trễ node 1
BEGIN {tggui[5000];tgnhan[5000];tgtruyen[5000]}
{
if (($1 == "+") && ($4== "2"))
{
tggui[$12] = $2;
}
if (($1 == "r") && ($4 == "2"))
{
tgnhan[$12] = $2;
tgtruyen[$12] = tgnhan[$12]-tggui[$12];
printf $2 " "tgtruyen[$12] "\n";
}
}
END {}
Ở đây dùng 3 mảng ghi giá trị thời gian là tggui[5000], tgnhan[5000], tgtruyen[5000].

Thuật toán ở đây của ta khai báo 3 mảng tggui[], tgnhan[] và tgtruyen[] với stt trong
mảng sẽ là packet id($12). Khi gói tin được gửi đi và nhận đều được ghi trong file trace
của ta là out.tr Khi gói tin được gửi đi ($1 == “+”) và điểm gửi đi là nút 1 ($4 == “2”) ta
sẽ lưu thời điểm gửi($2) vào mảng tggui. Khi gói tin đến đích ($1 == “r”) và điểm đến là
nút 1 ($4 == “1”) ta sẽ lưu thời điểm nhận ($2) vào mảng tgnhan. Thời gian truyền của
chúng ta tại node 1 (chính là trễ truyền lan) chính bằng thời điểm nhận tin trừ đi thời
điểm gửi tin.
Tương tự ta có các file thu thập số liệu cho các trễ node 2, 3, 4
Delay_N2.awk  thu thập số liệu trễ node 2
BEGIN {tggui[5000];tgnhan[5000];tgtruyen[5000]}
{
if (($1 == "+") && ($4== "3"))
{
tggui[$12] = $2;
12
}
if (($1 == "r") && ($4 == "3"))
{
tgnhan[$12] = $2;
tgtruyen[$12] = tgnhan[$12]-tggui[$12];
printf $2 " "tgtruyen[$12] "\n";
}
}
END {}
Ta viết tương tự cho node 3 và node 4 (Ở đây em chỉ đưa ra tiêu biểu cho node 1 và 2)
Delay_N3.awk  thu thập số liệu trễ node 3
Delay_N4.awk  thu thập số liệu trễ node 4
Sau khi thực hiện viết code các file.awk ta sẽ dùng câu lệnh sau trong thủ tục finish{} của
hàm chính:
exec awk -f delay_N1.awk out.tr > delayn1.tr

exec awk -f delay_N2.awk out.tr > delayn2.tr
exec awk -f delay_N3.awk out.tr > delayn3.tr
exec awk -f delay_N4.awk out.tr > delayn4.tr
Các câu lệnh này sẽ thực thi xuất dữ liệu từ file trace out.tr ra 2 cột là thời gian mô phỏng
và độ trễ tại từng thời điểm. Các giá trị này được lưu tương ứng vào các file
delayn1.tr, delayn2.tr, delayn3.tr, delayn4.tr. Trước thủ tục finish{}
đó ta dùng các câu lệnh sau để open lấy dữ liệu vẽ đồ thị:
set delayn1 [open delayn1.tr w]
set delayn2 [open delayn2.tr w]
set delayn3 [open delayn3.tr w]
set delayn4 [open delayn4.tr w]
Và để vẽ được đồ thị ta dùng chức năng Xgraph của NS2.
exec xgraph delayn1.tr -geometry 800x400 -t "Tre tai node 1"\
-x "s" -y "Delay" &
exec xgraph delayn2.tr -geometry 800x400 -t "Tre tai node 2"\
-x "s" -y "Delay" &
exec xgraph delayn3.tr -geometry 800x400 -t "Tre tai node 3"\
-x "s" -y "Delay" &
exec xgraph delayn4.tr -geometry 800x400 -t "Tre tai node 4"\
-x "s" -y "Delay" &
Câu 3:
13
Khả thông = Tổng số bytes chứa trong các gói mà vừa rời khỏi hàng đợi của lần cập nhật
chu kỳ sau trừ đi tổng số bytes chứa trong các gói mà vừa rời khỏi hàng đợi của lần cập
nhật chu kỳ trước chia cho thời gian lấy mẫu.
Trước hết là ta viết thủ tục xử lý giả thiết: “Sau 30s thì băng thông tất cả các liên kết giảm
đi 25%”. Tức là lúc này băng thông chỉ còn lại 75% so với trước đó.
Thủ tục này như sau:
# Thủ tục bw_reduce xử lý sau 30s băng thông tất cả lien kết
giảm 25%

proc bw_reduce {} {
global ns s1 s2 n1 n2 n3 n4 d bw band1 band2 band3 band4
band5 band6 band7 band8 band9 dem
set time 30
set dem [expr $dem+1]
set now [$ns now]
$ns rtmodel-at [expr $time+$now] down $s1 $n1
$ns rtmodel-at [expr $time+$now] down $s2 $n1
$ns rtmodel-at [expr $time+$now] down $n1 $n2
$ns rtmodel-at [expr $time+$now] down $n1 $n3
$ns rtmodel-at [expr $time+$now] down $n1 $n4
$ns rtmodel-at [expr $time+$now] down $n2 $n4
$ns rtmodel-at [expr $time+$now] down $n2 $n3
$ns rtmodel-at [expr $time+$now] down $n4 $n3
$ns rtmodel-at [expr $time+$now] down $n3 $d
$ns duplex-link $s1 $n1 [expr $band1]Mb 10ns DropTail
$ns duplex-link $s2 $n1 [expr $band2]Mb 10ns DropTail
$ns duplex-link $n1 $n2 [expr $band3]Kb 10ns DropTail
$ns duplex-link $n1 $n3 [expr $band4]Kb 10ns DropTail
$ns duplex-link $n1 $n4 [expr $band5]Mb 10ns DropTail
$ns duplex-link $n2 $n4 [expr $band6]Kb 10ns DropTail
$ns duplex-link $n2 $n3 [expr $band7]Kb 10ns DropTail
$ns duplex-link $n4 $n3 [expr $band8]Mb 10ns DropTail
$ns duplex-link $n3 $d [expr $band9]Mb 10ns DropTail
set band1 [expr $band1*0.75]
set band2 [expr $band2*0.75]
set band3 [expr $band3*0.75]
set band4 [expr $band4*0.75]
set band5 [expr $band5*0.75]
set band6 [expr $band6*0.75]

set band7 [expr $band7*0.75]
set band8 [expr $band8*0.75]
set band9 [expr $band9*0.75]
puts "Bang thong sau khi giam lan thu $dem:"
puts " band1 = $band1"
14
puts " band2 = $band2"
puts " band3 = $band3"
puts " band4 = $band4"
puts " band5 = $band5"
puts " band6 = $band6"
puts " band7 = $band7"
puts " band8 = $band8"
puts " band9 = $band9"
puts "\n"
# Sau 30s băng thông mọi liên kết giảm 25%
$ns at [expr $time+$now] "bw_reduce"
}
Sau khi xử lý xong phần giả thiết đó ta xây dựng thủ tục thu thập và vẽ số liệu khả thông
từng luồng:
# Thủ tục ghi lại các giá trị về số liệu khả thông từng
luồng
proc recordbw {} {
global tcp1 tcp2 Tcp1 Tcp2
# Get an instance simulator
set ns [Simulator instance ]
# Set the time after which the pro can be called again
- Chu kì record
set time 0.2
# Count how many bytes which S1 and S2 have received

and retransmited
set b_tcp1_sent [$tcp1 set ndatabytes_ ]
set b_tcp2_sent [$tcp2 set ndatabytes_ ]
set b_tcp1_retrans [$tcp1 set nrexmitbytes_]
set b_tcp2_retrans [$tcp2 set nrexmitbytes_]
set bw1 [expr $b_tcp1_sent - $b_tcp1_retrans]
set bw2 [expr $b_tcp2_sent - $b_tcp2_retrans]
set now [$ns now]
# Calculate bandwith of tcp1-d flow and tcp2-d flow
(Mbit/s) after that write to tcp1 ,tcp2
puts $Tcp1 "$now [expr $bw1/$time*8/1000000] "
puts $Tcp2 "$now [expr $bw2/$time*8/1000000] "
# After calculate , need reset the parameter byte_ to
zero
$tcp1 set ndatabytes_ 0
$tcp1 set nrexmitbytes_ 0
$tcp2 set ndatabytes_ 0
$tcp2 set nrexmitbytes_ 0
15
# Call the pro again after now + time
# Sẽ cập nhật số liệu sau 0.2s
$ns at [expr $now+$time] "recordbw"
}
Trước thủ tục finish{} ta cần tạo file trace để lấy dữ liệu vẽ đồ thị:
set Tcp1 [open Tcp1.tr w]
set Tcp2 [open Tcp2.tr w]
Tiếp theo là lệnh thực hiện vẽ đồ thị khả thông:
exec xgraph Tcp1.tr -geometry 800x400 -t "Kha thong
luong Tcp1"\
-x "s" -y "Mbit/s" &

exec xgraph Tcp2.tr -geometry 800x400 -t "Kha thong
luong Tcp2"\
-x "s" -y "Mbit/s" &
exec xgraph Tcp1.tr Tcp2.tr -geometry 800x400 -t "Kha
thong tung luong Tcp1 va Tcp2 tren cung mot do thi"\
-x "s" -y "Mbit/s" &
Cuối cùng là lệnh để bắt đầu 2 thủ tục bw_reduce{} và recordbw{}:
$ns at 30.0 "bw_reduce"
$ns at 0.0 "recordbw"
Câu 4:
Thay đổi kích thước gói, làm lại các thao tác câu 2 và đưa ra nhận xét.
Khi tăng kích thước gói lên ta nhận thấy sự thay đổi diễn ra trên các đồ thị đã thu thập
được nhưng vì dung lượng phát ra của các nguồn khá lớn để xảy ra hiện tượng thiếu
nguyên nên nhóm em đã lựa chọn cách giảm số package của hàng đợi để xảy ra hiện
tượng thiếu nguyên, lúc này đồ thị trễ tại 1 số node ko còn ổn định.
Và ở đây nhóm em chọn giảm số package đi 5 lần, tức là từ 50 về 10 và tăng kích thước
gói lên 100 lần từ 1300 lên 130000. Nhận xét chi tiết có sau phân hình ảnh các đồ thị.
16
Phụ lục 1. Đồ thị các kết quả
1. Kịch bản mô phỏng
2. Trễ tại node 1
2.1 Trễ node 1 sau 300s (5 phút)
17
2.2 Trễ node 1 sau 300s đã được zoom
18
3. Trễ tại node 2
4. Trễ tại node 3
4.1 Trễ node 3 sau 300s
19
4.2 Trễ node 3 sau 300s đã được zoom

5. Trễ tại node 4
20
6. Khả thông luồng Tcp
1
6.1 Tcp
1
sau 300s
21
6.2 Tcp
2
sau 300s đã zoom
7. Khả thông Tcp
2
7.1 Tcp
2
sau 300s
22
7.2 Tcp
2
sau 300s đã zoom
8. Khả thông Tcp1 và Tcp2 vẽ trên cùng đồ thị để so sánh
23
24
Sau khi đã thay package = 130000 và kích thước hàng đợi giảm xuống
còn 10 ta có đồ thị trễ các node như sau:
A/ Trễ tại node 1
B/ Trễ tại node 2
C/ Trễ tại node 3
25

×