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

Cơ sở truyền số liệu: Băng thông công bằng giữa các luồng

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 (324.71 KB, 31 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

VIỆN ĐIỆN TỬ - VIỄN THÔNG

BÀI TẬP LỚN MÔN CƠ SỞ
TRUYỀN SỐ LIỆU
Đề tài:
BĂNG THÔNG CÔNG BẰNG GIỮA CÁC LUỒNG
Giảng viên hướng dẫn:

PGS.TS Nguyễn Hữu Thanh

Sinh viên thực hiện:

Nguyễn Văn Trọng 20122606
Phùng Văn Thông 20122522

Hà Nội, 12/2015


Contents

LỜI MỞ ĐẦU
Mạng viễn thông với tài nguyên băng thông khan hiếm khi nhiều luồng dữ liệu cùng
truy cập sẽ dẫn đến tìn trạng tắc nghẽn nếu không có sự phân chia công bằng về mặt
băng thông cho nhiều người sử dụng cùng lúc
Vì vậy, nhóm em đã chọn đề tài: “Băng thông công bằng giữa các luồng trong hệ thống
mạng thông tin“ để thực hiện trong bài tập lớn này.

I.


Đề bài

Cho một mạng gồm 5 nút như hình vẽ. Nút 1, 2, 3, 4, 5 là các hàng đợi đơn hoạt động
theo nguyên tắc FIFO với độ lớn hàng đợi K = 10 gói. Có 3 luồng dữ liệu được gửi qua
mạng tương ứng là (S1, D1), (S2, D2) và (S3, D3). Trong đó Si là nguồn phát dữ liệu còn
Di là đích.
Đường nối L1 có dung lượng 1,5 Mb/s trễ lan truyền 150ms; L2 có dung lượng là 1Mb/s
trễ lan truyền 100ms; đường L3 có dung lượng 0,6 Mb/s, trễ lan truyền 50ms; và L4 có
dung lượng 0,5 Mb/s, trễ lan truyền 100ms. Các nguồn Si đều phát gói với độ dài cố định
là 125byte, khoảng thời gian giữa các gói tuân theo phân bố Poisson.


1. Giả thiết băng thông đối đa tổng cộng mà các luồng được chiếm trên một kênh truyền
vật lý là bằng 95% dung lượng kênh truyền. Tính tốc độ λS1, λS2, λS3 (kbit/s) để 3
luồng trên chia sẻ băng thông kênh truyền theo nguyên lý công bằng cực đại - cực
tiểu (max – min fairness).
2. Dựng kịch bản mô phỏng mạng trên với tốc độ các luồng λS1, λS2, λS3 đã được tính
toán trong câu 1. Chạy mô phỏng trong 100s.
3. Vẽ đồ thị băng thông ri(t) mà các luồng (S1, D1), (S2, D2) và (S3, D3) sử dụng. Vẽ
đồ thị tốc độ mất gói ei(t) (số gói mất/đơn vị thời gian) của 3 luồng (S1, D1), (S2, D2)
và (S3, D3) tại nút 3.
4. Thay các luồng theo phân bố Poisson như trên bằng các luồng TCP. Lặp lại câu 3. Có
nhận xét gì?

II.

Lập kế hoạch phân công công việc

2.1 Lập kế hoạch
Bài tập lớn được thực hiện trong vòng 8 tuần

• Tuần 1: Cài đặt hệ điều hành Linux(Ubuntu) và cài NS2 trên đó.
Hai thành viên trong nhóm cùng nhau tìm hiểu yêu cầu đề bài và
phân công việc cho mỗi người.
• Tuần 2: Tìm hiểu cách chạy mô phỏng trên NS2, quan tâm đến cú
pháp của một file tcl để thực hiện mô phỏng.
• Tuần 3: Tìm hiểu cách xây dựng một topo mạng và vẽ đồ thị xgraph
trên NS2
• Tuần 4: Tìm hiểu giao thức truyền thông mạng UDP, phát gói tin có
khoảng thời gian thep phân bố Poisson. Thực hiện mô phỏng một số
project mẫu đơn giản trên NS2.


• Tuần 5: Tìm hiểu giao thức truyền thông mạng TCP. Thực hiện mô
phỏng một số project mẫu đơn giản trên NS2.
• Tuần 6: Tìm hiểu thuật toán Max-Min Fairness để giải quyết yêu
cầu 1: Tính λS1, λS2, λS3
• Tuần 7: Kết nối các nguồn dữ liệu vào topo mạng qua giao thức
UDP và TCP. Xây dựng kịch bản mô phỏng và vẽ đồ thị.
• Tuần 8: Kiểm tra lại code lần cuối và viết báo cáo

2.2 Phân công công việc
STT
1

Họ và tên
Nguyễn Văn Trọng

2

Phùng Văn Thông


Công việc
Tìm hiểu giao thức UDP,
mô phỏng, xgraph, viết
báo cáo, thuật toán max
– min fairness
Tìm hiểu giao thức TCP,
mô phỏng, xgraph, thuật
toán max – min fairness

III. Quá trình thực hiện
3.1 Chuẩn bị kiến thức để thực hiện mô phỏng
3.1.1 Tìm hiểu về giao thức UDP
Giao thức UDP (User Datagram Protocol) hay còn gọi là giao thức gói
người dùng là một trong hai giao thức cốt lõi của giao thức TCP/IP, cho phép
người dùng có thể gửi những dữ liệu ngắn được gọi là datagram từ máy tính
này đến máy tính khác. UDP không đảm bảo sự tin cậy và thứ tự truyền nhận,
các gói dữ liệu có thể đến không đúng thứ tự hoặc bị mất mà không có thông
báo. Tuy nhiên, UDP nhanh và hiệu quả hơn đối với những mục tiêu như kích
thước nhỏ và yêu cầu khắt khe về thời gian, giao thức này hữu dụng đối với
việc trả lời các truy vấn với số lượng lớn người yêu cầu. Những ứng dụng phổ
biến sử dụ ng UDP như DNS (Domain Name System), ứng dụng streaming
media, Voice over IP, Trivial File Transfer Protocol (TFTP), và game trực
tuyến.
3.1.2 Tìm hiểu về giao thức TCP
Giao thức TCP (Transmission Control Ptotocol) là một trong các giao
thức cốt lõi của bộ giao thức TCP/IP, cho phép các ứng dụng trên các máy chủ
có thể trao đổi dữ liệu hoặc các gói tin. Giao thức này đảm bảo chuyển giao dữ
liệu tới nơi nhận một cách tin cậy và đúng thứ tự. TCP hỗ trợ nhiều ứng dụng
phổ biến trên Internet như WWW, Mail và Secure Shell.



3.1.3 Tracing
Trong NS, các sự kiện xảy ra được trace (lưu vết) trong các simplex
link. Nếu mô phỏng được trỏ đến các hoạt động trace (bằng lệnh $ns trace-all
file hay $ns namtrace-all file) thì các link sẽ có các đối tượng trace được chèn
thêm vào.
Khi từng đối tượng được chèn thêm đối tượng trace nhận được
package, nó sẽ ghi vào file trace xác định mà không mất thời gian mô phỏng.
Sau đó, package được truyền đến dối tượng kế tiếp.
Định dạng chuẩn của một file trace trong NS-2:













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: nốt nguồn
to node: nốt đí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

3.1.4 Xgraph
Xgraph là một công cụ vẽ đồ thị được cấp sẵn trong NS. Xgraph cho phép
chúng ta tạo ra các file ảnh và một số định dạng khác bằng cách ấn vào “Hdcpy”.
câu lệnh gọi Xgraph có thể được khai báo trong kịch bản TCL do đó có thể xuất ra
ngay đồ thị khi kết thúc mô phỏng .
Đầu vào của Xgraph là 1 hoặc nhiều file chứa mỗi cặp giá trị x-y trên 1
dòng (mỗi dòng sẽ chứa tọa độ của 1 điểm trên đồ thị ) . Ví dụ lệnh : Xgraph f1 f2
sẽ vẽ ra trên cùng 1 đồ thị của file f1,f2. Một số lựa chọn khi sử dụng Xgraph :






Tên đồ thị: -t “Title”
Kích thước: -geometry xsize x ysize
Tiêu đề cho các trục: -x “xtitle” –y “ytitle”
Màu của chữ và lưới: – v
Màu nền: – bg

3.1.5 Thuật toán Max-Min Fairness
B1. Khởi tạo tất cả các kết nối với tốc độ = 0
B2. Tăng tốc độ tất cả các kết nối một lượng



ε = min(

Cchannel _ i − CDataFlow _( S , D )

Li

n

)

n là số luồng đang xét đi qua liên kết
Tìm được ít nhất một kênh đạt giá trị băng thông cực đại. Khi đó:
+ Tất cả các luồng chia sẻ liên kết này đều sử dụng băng thông bằng nhau
+ Liên kết này gây tắc nghẽn với tất cả các kết nối sử dụng liên kết này
+ Ngưng việc tăng băng thông cho liên kết này vì nó đã đạt cân bằng cực
đại- cực tiểu
B3. Lặp lại B2 cho các kết nối khác chưa đạt đến trạng thái cân bằng cực
đại – cực tiểu
B4. n = 0, kết thúc

3.2 Tiến hành mô phỏng
1. Tính tốc độ phát gói
Theo đề bài, ta có các giả thiết:






Đường nối L1 có dung lượng là C1 = 1.5 Mbps, trễ lan truyền 150ms
Đường nối L2 có dung lượng là C2 = 1 Mbps, trễ lan truyền 100ms
Đường nối L3 có dung lượng là C3 = 0.6 Mbps, trễ lan truyền 50ms
Đường nối L4 có dung lượng là C4 = 0.5 Mbps, trễ lan truyền 100ms
Nút 1, 2, 3, 4, 5 là các hàng đợi đơn hoạt động theo nguyên tắc FIFO với
độ lớn hàng đợi K = 10 gói
Băng thông tối đa tổng cộng mà các luồng được chiếm trên một kênh
truyền vật lý bằng 95% dung lượng kênh truyền
Tính λS1, λS2, λS3
Bài giải:

• Các đường nối L1 = (1, 2), L2 = (2, 3), L3 = (3, 4), L4 = (4, 5)
• Các luồng (S1, D1), (S2, D2), (S3, D3)
Ta có bảng thực hiện các bước trong thuật toán Max – Min Fairness


Luồng

(S1,
D1)

(S2,
D2)

(S3,
D3)

Thực hiện

Bước

1

0

0

0

Khởi tạo

Bước
2

0.3

0.3

0.3

Bước
3

0.3

0.3

0.3

Bước
4


0.3

0.7

0.3

L2 đạt cực đại bằng C2 = 1 Mbps
(S2, D2) = 0.7 Mbps

Bước
5

0.3

0.7

0.3

Kết thúc

Loại bỏ

Bước

ε=

1.5 − 0 1 − 0 0.6 − 0 0.5 − 0
(
, ,

,
) = 0.3
L∈( L1, L 2, L 3, L 4)
2
2
2
1
min

L3 đạt cực đại bằng C3 = 0.6 Mbps
(S1, D1) = (S3, D3) = 0.3 Mbps

ε = min (
L∈( L1, L 2)

(S1, D1);
(S3, D3)
và L3, L4

1.5 − 0.3 1 − 0..6
,
) = 0.4
1
1

(S2, D2)
và L1, L2

Theo giả thiết băng thông tối đa tổng cộng mà các luồng được chiếm trên một kênh
truyền vật lý bằng 95% dung lượng kênh truyền nên tốc độ phát gói của các nguồn S1,

S2, S3 là:
S1

= 0.3*0.95 = 0.285 (Mbps) = 285 (kbps)

S2

= 0.7*0.95 = 0.665 (Mbps) = 665 (kbps)

S3

= 0.3*0.95 = 0.285 (Mbps) = 285 (kbps)

Mỗi gói có độ dài 125 byte = 1000 bit. Ta cũng có thể viết:
S1

= 285 (gói/s)

S2

= 665 (gói/s)

S3

= 285 (gói/s)
2. Dựng kịch bản mô phỏng với tốc độ các luồng S1, S2, S3

Mô phỏng với các tốc độ phát gói như bài 4.1. Dựng kịch bản mô phỏng như sau:



#Đặt tốc độ đến trung bình (gói/s)
set lambda1 285.0
set lambda2 665.0
set lambda3 285.0
#Độ dài mỗi gói: 125 byte/gói
set pksize 125.0

Các nút 0, 1, 2, 3, 4 (màu xanh) : lần lượt là các nút n1, n2, n3, n4, n5
Các nút 5, 6, 7 (màu đỏ) : lần lượt là các nguồn S1, S2, S3
Các nút 8, 9, 10 (màu đen) : là các nút đích D1, D2, D3
3. Vẽ đồ thị băng thông Ri(t) và tốc độ mất gói Ei(t) của các luồng


Đồ thị băng thông ri(t) của các luồng (S1, D1), (S2, D2), (S3, D3)

Đồ thị tốc độ mất gói của 3 luồng

4. Thay các luồng theo phân bố Poisson như trên bằng các luồng TCP
Đồ thị băng thông:


Tốc độ mất gói:

IV. Kết luận
• Sau 3 lần chạy mô phỏng ta thu được kết quả của 3 lần đều giống nhau
• Băng thông của 3 luồng khi mô phỏng hoàn toàn phù hợp với kết quả tính toán
trên lý thuyết. Cụ thể, băng thông của luồng (S1, D1) dao động trong khoảng từ
600kbps – 700 kbps; băng thông của 2 luồng (S2, D2) và (S3, D3) khá gần nhau,
dao động trong khoảng từ 250kbps – 300 kbps.



• Tốc độ mất gói trung bình của luồng (S3, D3) là thấp nhất và tốc độ mất gói của
luồng (S1, D1) là cao nhất
• Qua bài 4.4, ta thấy rằng giao thức TCP cho phép truyền dữ liệu một cách hiệu
quả hơn giao thức UDP, ít mất gói hơn UDP do cơ chế phát hiện và thông báo lỗi
khi truyền.

Tài liệu tham khảo







/> /> /> /> /> />• />
Phụ lục
Câu 4.2
#Create a simulator object
set ns [new Simulator]
#Define different colors for data flows
$ns color 1 Red
$ns color 2 Green
$ns color 3 Blue
#Set lambda value (packet/s)
set lambda1 285.0
set lambda2 665.0
set lambda3 285.0
#Set packet size
set pksize 125.0

#Time to send packet depend on Poisson distribution
set ArrivalTime1 [new RandomVariable/Exponential]
$ArrivalTime1 set avg_ [expr 1/$lambda1]
set ArrivalTime2 [new RandomVariable/Exponential]


$ArrivalTime2 set avg_ [expr 1/$lambda2]
set ArrivalTime3 [new RandomVariable/Exponential]
$ArrivalTime3 set avg_ [expr 1/$lambda3]
#Open the Trace file
set tf [open BTL4.2.tr w]
$ns trace-all $tf
#Open the nam trace file
set nf [open BTL4.2.nam w]
$ns namtrace-all $nf
#Define'finish' process
proc finish {} {
global ns tf nf
$ns flush-trace
#Close the output files
close $tf
close $nf
#Execute nam on the trace file
exec nam BTL4.2.nam &
exit 0
}
#Create 5 nodes: n1, n2, n3, n4, n5
set n1 [$ns node]
$n1 color Blue
set n2 [$ns node]

$n2 color Blue
set n3 [$ns node]
$n3 color Blue
set n4 [$ns node]
$n4 color Blue


set n5 [$ns node]
$n5 color Blue
#Create 3 soures: s1, s2, s3
set s1 [$ns node]
$s1 color Red
set s2 [$ns node]
$s2 color Red
set s3 [$ns node]
$s3 color Red
#Create 3 destinations: d1, d2, d3
set d1 [$ns node]
$d1 color Black
set d2 [$ns node]
$d2 color Black
set d3 [$ns node]
$d3 color Black
#Create links between the nodes, sources and destinations
$ns duplex-link $n1 $n2 1.5Mb 150ms DropTail
$ns duplex-link $n2 $n3 1Mb 100ms DropTail
$ns duplex-link $n3 $n4 0.6Mb 50ms DropTail
$ns duplex-link $n4 $n5 0.5Mb 100ms DropTail
$ns duplex-link $s2 $n1 1Mb 10ms DropTail
$ns duplex-link $s1 $n2 1Mb 10ms DropTail

$ns duplex-link $d2 $n3 1Mb 10ms DropTail
$ns duplex-link $s3 $n3 1Mb 10ms DropTail
$ns duplex-link $d1 $n4 1Mb 10ms DropTail
$ns duplex-link $d3 $n5 1Mb 10ms DropTail
#Set position of nodes
$ns duplex-link-op $s2 $n1 orient up


$ns duplex-link-op $n1 $n2 orient right-up
$ns duplex-link-op $s1 $n2 orient right
$ns duplex-link-op $n2 $n3 orient right
$ns duplex-link-op $s3 $n3 orient down
$ns duplex-link-op $d2 $n3 orient up
$ns duplex-link-op $n4 $n3 orient left
$ns duplex-link-op $d1 $n4 orient left
$ns duplex-link-op $n4 $n5 orient right-up
$ns duplex-link-op $d3 $n5 orient down
#Monitor the queue for the link
$ns duplex-link-op $n2 $n1 queuePos 1.5
$ns duplex-link-op $n3 $n2 queuePos 1.5
$ns duplex-link-op $n4 $n3 queuePos 1.5
$ns duplex-link-op $n5 $n4 queuePos 1.5
#Set queue size
$ns queue-limit $n1 $n2 10
$ns queue-limit $n2 $n3 10
$ns queue-limit $n3 $n4 10
$ns queue-limit $n4 $n5 10
#Create a UDP agent and attach it to node s1
set udp0 [new Agent/UDP]
$udp0 set class_ 1

$ns attach-agent $s1 $udp0
#Create a UDP agent and attach it to node s2
set udp1 [new Agent/UDP]
$udp1 set class_ 2
$ns attach-agent $s2 $udp1
#Create a UDP agent and attach it to node s3
set udp2 [new Agent/UDP]


$udp2 set class_ 3
$ns attach-agent $s3 $udp2
#Create a Sink agent (a traffic sink) and attach it to node d1, d2, d3
set sink0 [new Agent/LossMonitor]
$ns attach-agent $d1 $sink0
set sink1 [new Agent/LossMonitor]
$ns attach-agent $d2 $sink1
set sink2 [new Agent/LossMonitor]
$ns attach-agent $d3 $sink2
#Connect the traffic sources with the traffic sink
$ns connect $udp0 $sink0
$ns connect $udp1 $sink1
$ns connect $udp2 $sink2
#Send packet
proc sendpacket0 {} {
global ns udp0 ArrivalTime1 pksize
set time [$ns now]
$ns at [expr $time + [$ArrivalTime1 value]] "sendpacket0"
$udp0 send $pksize
}
proc sendpacket1 {} {

global ns udp1 ArrivalTime2 pksize
set time [$ns now]
$ns at [expr $time + [$ArrivalTime2 value]] "sendpacket1"
$udp1 send $pksize
}
proc sendpacket2 {} {
global ns udp2 ArrivalTime3 pksize
set time [$ns now]


$ns at [expr $time + [$ArrivalTime3 value]] "sendpacket2"
$udp2 send $pksize
}
#-------------------------------Finish-------------------------------puts "\nBAI TAP LON MON CO SO TRUYEN SO LIEU \n"
puts " De tai:BANG THONG CONG BANG GIUA CAC LUONG \n"
puts " Bai 4.2 \n"
puts " GVHD: PGS. TS Nguyen Huu Thanh\n"
puts " Sinh vien thuc hien: Nguyen Van Trong 20122606\n"
puts "\n

Phung Van Thong 20122522\n"

puts "...Please wait...\n"
#Schedule events for the CBR agents
$ns at 0.0 "$s1 label \"S1\""
$ns at 0.0 "$s2 label \"S2\""
$ns at 0.0 "$s3 label \"S3\""
$ns at 0.0 "$n1 label \"N1\""
$ns at 0.0 "$n2 label \"N2\""
$ns at 0.0 "$n3 label \"N3\""

$ns at 0.0 "$n4 label \"N4\""
$ns at 0.0 "$n5 label \"N5\""
$ns at 0.0 "$d1 label \"D1\""
$ns at 0.0 "$d2 label \"D2\""
$ns at 0.0 "$d3 label \"D3\""
$ns at 0.5 "sendpacket0"
$ns at 0.5 "sendpacket1"
$ns at 0.5 "sendpacket2"
#Call the finish procedure
$ns at 100 "finish"
#Run the simulation


$ns run
Câu 4.3
#Create a simulator object
set ns [new Simulator]
#Define different colors for data flows
$ns color 1 Red
$ns color 2 Green
$ns color 3 Blue
#Set lambda value (packet/s)
set lambda1 285.0
set lambda2 665.0
set lambda3 285.0
#Set packet size
set pksize 125.0
#Time to send packet
set ArrivalTime1 [new RandomVariable/Exponential]
$ArrivalTime1 set avg_ [expr 1/$lambda1]

set ArrivalTime2 [new RandomVariable/Exponential]
$ArrivalTime2 set avg_ [expr 1/$lambda2]
set ArrivalTime3 [new RandomVariable/Exponential]
$ArrivalTime3 set avg_ [expr 1/$lambda3]
#Open the Trace file
set f0 [open BandWidth(S1,D1).tr w]
set f1 [open BandWidth(S2,D2).tr w]
set f2 [open BandWidth(S3,D3).tr w]
set l0 [open Lost(S1,D1).tr w]
set l1 [open Lost(S2,D2).tr w]
set l2 [open Lost(S3,D3).tr w]
#Open the nam trace file


set nf [open BTL4.3.nam w]
$ns namtrace-all $nf
#Define 'finish' process
proc finish {} {
global ns f0 f1 f2 nf l0 l1 l2
$ns flush-trace
#Close the output files
close $f0
close $f1
close $f2
close $nf
close $l0
close $l1
close $l2
#Execute nam on the trace file
exec nam BTL4.3.nam &

#Call xgraph to display the results
exec xgraph BandWidth(S1,D1).tr BandWidth(S2,D2).tr BandWidth(S3,D3).tr
-geometry 800x400 -t "BandWidth Ri(t)" -x "s" -y "Mbit/s" &
exec xgraph Lost(S1,D1).tr Lost(S2,D2).tr Lost(S3,D3).tr -geometry 800x400 -t
"LostPacket Ei(t)" -x "s" -y "Packet" &
exit 0
}
#Create 5 nodes: n1, n2, n3, n4, n5
set n1 [$ns node]
$n1 color Blue
set n2 [$ns node]
$n2 color Blue
set n3 [$ns node]
$n3 color Blue


set n4 [$ns node]
$n4 color Blue
set n5 [$ns node]
$n5 color Blue
#Create 3 soures: s1, s2, s3
set s1 [$ns node]
$s1 color Red
set s2 [$ns node]
$s2 color Red
set s3 [$ns node]
$s3 color Red
#Create 3 destinations: d1, d2, d3
set d1 [$ns node]
$d1 color Black

set d2 [$ns node]
$d2 color Black
set d3 [$ns node]
$d3 color Black
#Create links between the nodes, sources and destinations
$ns duplex-link $n1 $n2 1.5Mb 150ms DropTail
$ns duplex-link $n2 $n3 1Mb 100ms DropTail
$ns duplex-link $n3 $n4 0.6Mb 50ms DropTail
$ns duplex-link $n4 $n5 0.5Mb 100ms DropTail
$ns duplex-link $s2 $n1 1Mb 10ms DropTail
$ns duplex-link $s1 $n2 1Mb 10ms DropTail
$ns duplex-link $d2 $n3 1Mb 10ms DropTail
$ns duplex-link $s3 $n3 1Mb 10ms DropTail
$ns duplex-link $d1 $n4 1Mb 10ms DropTail
$ns duplex-link $d3 $n5 1Mb 10ms DropTail


#Set position of nodes
$ns duplex-link-op $s2 $n1 orient up
$ns duplex-link-op $n1 $n2 orient right-up
$ns duplex-link-op $s1 $n2 orient right
$ns duplex-link-op $n2 $n3 orient right
$ns duplex-link-op $s3 $n3 orient down
$ns duplex-link-op $d2 $n3 orient up
$ns duplex-link-op $n4 $n3 orient left
$ns duplex-link-op $d1 $n4 orient left
$ns duplex-link-op $n4 $n5 orient right-up
$ns duplex-link-op $d3 $n5 orient down
#Set position of queues
$ns duplex-link-op $n2 $n1 queuePos 1.5

$ns duplex-link-op $n3 $n2 queuePos 1.5
$ns duplex-link-op $n4 $n3 queuePos 1.5
$ns duplex-link-op $n5 $n4 queuePos 1.5
#Set queue size
$ns queue-limit $n1 $n2 10
$ns queue-limit $n2 $n3 10
$ns queue-limit $n3 $n4 10
$ns queue-limit $n4 $n5 10
#Create a UDP agent and attach it to node s1
set udp0 [new Agent/UDP]
$udp0 set class_ 1
$ns attach-agent $s1 $udp0
#Create a UDP agent and attach it to node s2
set udp1 [new Agent/UDP]
$udp1 set class_ 2
$ns attach-agent $s2 $udp1


#Create a UDP agent and attach it to node s3
set udp2 [new Agent/UDP]
$udp2 set class_ 3
$ns attach-agent $s3 $udp2
#Create a Sink agent (a traffic sink) and attach it to node d1, d2, d3
set sink0 [new Agent/LossMonitor]
$ns attach-agent $d1 $sink0
set sink1 [new Agent/LossMonitor]
$ns attach-agent $d2 $sink1
set sink2 [new Agent/LossMonitor]
$ns attach-agent $d3 $sink2
#Connect the traffic sources with the traffic sink

$ns connect $udp0 $sink0
$ns connect $udp1 $sink1
$ns connect $udp2 $sink2
#Send packet
proc sendpacket0 {} {
global ns udp0 ArrivalTime1 pksize
set time [$ns now]
$ns at [expr $time + [$ArrivalTime1 value]] "sendpacket0"
$udp0 send $pksize
}
proc sendpacket1 {} {
global ns udp1 ArrivalTime2 pksize
set time [$ns now]
$ns at [expr $time + [$ArrivalTime2 value]] "sendpacket1"
$udp1 send $pksize
}
proc sendpacket2 {} {


global ns udp2 ArrivalTime3 pksize
set time [$ns now]
$ns at [expr $time + [$ArrivalTime3 value]] "sendpacket2"
$udp2 send $pksize
}
proc recordbw {} {
global sink0 sink1 sink2 f0 f1 f2
#Get an instance of the simulator
set ns [Simulator instance]
#Set the time after which the procedure should be called again
set time 0.5

#How many bytes have been received by the traffic sinks?
set bw0 [$sink0 set bytes_]
set bw1 [$sink1 set bytes_]
set bw2 [$sink2 set bytes_]
#Get the current time
set now [$ns now]
#Calculate the bandwidth (in MBit/s) and write it to the files
puts $f0 "$now [expr $bw0/$time*8/1000000]"
puts $f1 "$now [expr $bw1/$time*8/1000000]"
puts $f2 "$now [expr $bw2/$time*8/1000000]"
#Reset the bytes_ values on the traffic sinks
$sink0 set bytes_ 0
$sink1 set bytes_ 0
$sink2 set bytes_ 0
#Re-schedule the procedure
$ns at [expr $now+$time] "recordbw"
}
proc recordlost {} {


global sink0 sink1 sink2 l0 l1 l2
#Get an instance of the simulator
set ns [Simulator instance]
#Set the time after which the procedure should be called again
set time 0.5
#How many packet have been lost?
set lost0 [$sink0 set nlost_]
set lost1 [$sink1 set nlost_]
set lost2 [$sink2 set nlost_]
#Get the current time

set now [$ns now]
#Calculate number of packet lost
puts $l0 "$now [expr $lost0]"
puts $l1 "$now [expr $lost1]"
puts $l2 "$now [expr $lost2]"
#Reset the nlost_ values on the traffic sinks
$sink0 set nlost_ 0
$sink1 set nlost_ 0
$sink2 set nlost_ 0
#Re-schedule the procedure
$ns at [expr $now+$time] "recordlost"
}
#-------------------------------Finish-------------------------------puts "\nBAI TAP LON MON CO SO TRUYEN SO LIEU \n"
puts " De tai:BANG THONG CONG BANG GIUA CAC LUONG \n"
puts " Bai 4.3 \n"
puts " GVHD: PGS. TS Nguyen Huu Thanh\n"
puts " Sinh vien thuc hien: Nguyen Van Trong 20122606\n"
puts "\n

Phung Van Thong 20122522\n"


puts "...Please wait...\n"
#Schedule events for the CBR agents
$ns at 0.0 "$s1 label \"S1\""
$ns at 0.0 "$s2 label \"S2\""
$ns at 0.0 "$s3 label \"S3\""
$ns at 0.0 "$n1 label \"N1\""
$ns at 0.0 "$n2 label \"N2\""
$ns at 0.0 "$n3 label \"N3\""

$ns at 0.0 "$n4 label \"N4\""
$ns at 0.0 "$n5 label \"N5\""
$ns at 0.0 "$d1 label \"D1\""
$ns at 0.0 "$d2 label \"D2\""
$ns at 0.0 "$d3 label \"D3\""
$ns at 0.0 "recordbw"
$ns at 0.0 "recordlost"
$ns at 0.5 "sendpacket0"
$ns at 0.5 "sendpacket1"
$ns at 0.5 "sendpacket2"
#Call the finish procedure
$ns at 100 "finish"
#Run the simulation
$ns run
Câu 4.4
#Create a simulator object
set ns [new Simulator]
#Define different colors for data flows
$ns color 1 Red
$ns color 2 Green
$ns color 3 Blue


#Set lambda value (packet/s)
set lambda1 285.0
set lambda2 665.0
set lambda3 285.0
#Set packet size
set pksize 125.0
#Open the Trace file

set f0 [open BandWidth(S1,D1).tr w]
set f1 [open BandWidth(S2,D2).tr w]
set f2 [open BandWidth(S3,D3).tr w]
set l0 [open Lost(S1,D1).tr w]
set l1 [open Lost(S2,D2).tr w]
set l2 [open Lost(S3,D3).tr w]
#Open the nam trace file
set nf [open BTL4.4.nam w]
$ns namtrace-all $nf
#Dinh nghia 1 thu tuc 'finish'
proc finish {} {
global ns nf f0 f1 f2
$ns flush-trace
#Close the output files
close $f0
close $f1
close $f2
close $nf
#Execute nam on the trace file
exec nam BTL4.4.nam &
#Call xgraph to display the results


×