3 nguồn 0, 1, 2 là 3 nguồn XCP lần lượt xuất phát từ 3 nút 0, 1, 2. Mô phỏng trực quan được thể hiện rõ trên cửa sổ NAM. Trong đó, cửa sổ monitors cho ta kích thước cửa sổ của các nguồn. Thời gian các luồng bắt đầu truyền được thể hiện trong cửa sổ dưới cùng.
Chương 4: Chương trình mô phỏng điều khiển tắc nghẽn dùng thuật toán tăng giảm
61
Hình 4.11 Mô phỏng 3 luồng XCP cùng chia sẻ đường truyền.
Chương 4: Chương trình mô phỏng điều khiển tắc nghẽn dùng thuật toán tăng giảm
62
Hình 4.12 cho ta thấy hiệu quả sử dụng đường truyền của các luồng XCP trong mô phỏng trên là rất cao. Khi có 1 đường truyền nhánh từ nút 0 đến router thắt cổ chai ngừng truyền thì hiệu quả vẫn được đảm bảo như trong hình 4.13
Hình 4.13 Hiệu quả vẫn bảo đảm khi 1 luồng ngừng truyền đột ngột.
Chương 4: Chương trình mô phỏng điều khiển tắc nghẽn dùng thuật toán tăng giảm
63
Hình 4.15 Số gói tại hàng đợi nhỏ.
4.3.2.2 Khi XCP và TCP cùng tồn tại
Trong trường hợp này, ta có 3 luồng XCP xuất phát từ 3 nguồn 0, 1, 2 (lần lượt ứng với các node 0, 1, 2 trong topo mạng hình 4.10) và luồng TCP xuất phát từ nút 0 Trong đó, thời gian các luồng bắt đầu truyền các đoạn dữ liệu được đưa ra trong cửa sổ dưới cùng trong NAM. Router có khả năng XCP sẽ phân biệt các luồng TCP và XCP và xếp hàng chúng 1 cách tách biệt nhau.
Chương 4: Chương trình mô phỏng điều khiển tắc nghẽn dùng thuật toán tăng giảm
64
Chương 4: Chương trình mô phỏng điều khiển tắc nghẽn dùng thuật toán tăng giảm
65
Hình 4.17 Biểu diễn cwnd của 2 loại lưu lượng TCP và XCP.
Chương 4: Chương trình mô phỏng điều khiển tắc nghẽn dùng thuật toán tăng giảm
66
Hình 4.19 Trạng thái hàng XCP.
Như vậy, qua các kết quả mô phỏng như trên ta thấy XCP cho ta hiệu quả sử dụng đường truyền cao trong khi đảm bảo số gói tại hàng đợi nhỏ. Ngoài ra nó còn đảm bảo các luồng hội tụ nhanh đến điểm tối ưu. Luồng XCP nhanh chiếm băng thông đường truyền nhanh hơn TCP.
4.4 Kết luận chương
Trong chương này, sinh viên mô phỏng thuật toán tăng giảm truyền thống để cho thấy thuật toán AIMD sử dụng trong các giao thức hiệu quả như thế nào. Từ đó sinh viên mô phỏng XCP với các ưu điểm về tính bình đẳng và hiệu quả trong khi sự mất gói là rất hiếm. Phần mô phỏng này được thực hiện với phần mềm nguồn mở ns2.
Các file OTcl Scripts thực hiện mô phỏng trình bày trong phần phụ lục của luận văn.
67
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN ĐỂ TÀI
Đề tài đã trình bày được những khái niệm cơ sở về mạng NGN, các đặc trưng cũng như cấu trúc mạng. Bài toán điều khiển tắc nghẽn sử dụng các giao thức, thuật toán để tối ưu hóa việc sử dụng tài nguyên, đạt được hiệu suất mạng thực sự. Đặc biệt, đề tài tập trung nhiều vào các khía cạnh như sau:
Các tiêu chí đánh giá phương pháp điều khiển tắc nghẽn.
Các phương pháp điều khiển tắc nghẽn truyền thống và mới.
Xây dựng các kịch bản mô phỏng từ phương pháp điều khiển tắc nghẽn sử dụng XCP để đánh giá hiệu quả khi sử dụng giao thức này. Đây thực sự là ứng cử viên cho mạng dựa trên cơ sở IP.
Tuy nhiên, điều khiển chống tắc nghẽn là 1 vấn đề phức tạp, nhất là khi mạng ngày càng phát triển rộng lớn, dịch vụ gia tăng nhanh, các dịch vụ mới ngày càng nhiều, số lượng người sử dụng tăng vọt và biến đổi động…Vì vậy đề tài khó tránh khỏi những thiếu sót, cụ thể là:
Một số khái niệm, thuật ngữ mới chưa được thống nhất khi dịch thuật.
Chưa đề cập đến thuật toán tăng giảm phi tuyến và các thuật toán cải thiện thuật toán tăng giảm tuyến tính, chẳng hạn như EIMD.
Trong khuôn khổ đề tài, chỉ nêu mô phỏng XCP mà chưa đi sâu vào mô phỏng tất cả các phương pháp điều khiển tắc nghẽn
Chưa đề cập nhiều vấn đề khi sử dụng XCP trong thực tế như bảo mật, triển khai, ...
Phần mềm mô phỏng mạng NS-2 rất khó can thiệp một cách đầy đủ mà thường chỉ kế thừa và sử dụng tập lệnh của nó cung cấp. Một số hàm, thủ tục trong thư viện do NS-2 hỗ trợ không ổn định và không mô phỏng đầy đủ các hoạt động của giao thức thật sự; do vậy, kết quả mô phỏng thu được chỉ đạt được độ tin cậy tương đối.
Qua đề tài này, sinh viên mong muốn nắm bắt được nền tảng kiến thức về mạng thế hệ sau, điều khiển tắc nghẽn và sử dụng các giao thức điều khiển tắc nghẽn. Hiện nay, giao thức được sử dụng rộng rãi là TCP. Tuy nhiên, nó còn phù
68
hợp khi tích hợp các dịch vụ vào một mạng thống nhất, yêu cầu của người dùng về chất lượng dịch vụ ngày càng cao. XCP là giao thức được cho là ứng cử viên sáng giá cho sự phát triển sau này, tuy nhiên còn có 2 câu hỏi lớn là:
Liệu XCP có đảm bảo hiệu quả cho tất cả các dịch vụ hay không?
Yêu cầu về router khi sử dụng XCP là rất cao, liệu chúng ta có nên triển khai XCP trong thực tế hay không?
Khái niệm FXCP được đưa ra với FXCP dùng bộ điều khiển mờ (fuzzy- based controller) liên quan đến bộ điều khiển dùng trong FEWA để thay thế cho bộ điều khiển hiệu quả trong router XCP. Liệu FXCP có tối ưu hơn XCP?
Ngoài ra nhất thiết phải nghiên cứu sâu hơn nữa về các phương pháp điều khiển tắc nghẽn khác để ngày càng nâng cao hơn nữa hiệu quả của việc điều khiển tắc nghẽn trong NGN. Đó cũng là những hướng phát triển mà đề tài này vươn tới.
Phụ lục
PHẦN PHỤ LỤC
Thuật toán tăng giảm
Tăng cộng giảm nhân AIMD
#define_param a range 0.1 to 1 default 0.1 #define_param b range 0.1 to 0.9 default 0.5 maxrate = 1.0; if(traffic > 1){ rate = rate * b; } else{ rate = rate + a;
rate = min(rate, maxrate); }
Tăng cộng giảm cộng AIAD
#define_param a range 0.1 to 0.9 default 0.2 #define_param b range 0.1 to 0.9 default 0.3 maxrate = 1.0;
minrate = 0.0; if(traffic > 1){
rate = rate - b;
rate = max(rate, minrate); }
else{
rate = rate + a;
rate = min(rate, maxrate); }
Tăng nhân giảm cộng MIAD #define_param a range 1 to 2 default 1.2 #define_param b range 0.1 to 0.9 default 0.5 maxrate = 1.0;
minrate = 0.0; if(traffic > 1){
rate = rate - b;
rate = max(rate, minrate); }
else{
rate = rate * a;
rate = min(rate, maxrate); }
Phụ lục
Tăng nhân giảm nhân MIMD #define_param a range 1 to 2.0 default 1.2 #define_param b range 0.1 to 0.9 default 0.5 maxrate = 1.0; if(traffic > 1){ rate = rate * b; } else{ rate = rate * a;
rate = min(rate, maxrate); }
Kịch bản xây dựng trong ns2
#--- So do ket noi mang ---# # n0 # \ Bottleneck Dich # n1--R0---R1 # / # n2 #
# Cac luong xcp va tcp dung chung router xcp Queue/XCP set tcp_xcp_on_ 1
Agent/TCP set minrto_ 1 # Tao doi tuong mo phong set ns [new Simulator] $ns use-scheduler Heap # Tao file trace
set f_all [open out.tr w] $ns trace-all $f_all
#--- # Dinh nghia cac ham su dung trong chuong trinh chinh #--- # Tao tham so cho hang RED
proc set-red-params { qsize } {
Queue/RED set thresh_ [expr 0.6 * $qsize] Queue/RED set maxthresh_ [expr 0.8 * $qsize]
Phụ lục
Queue/RED set q_weight_ 0.001 Queue/RED set linterm_ 10 Queue/RED set bytes_ false ;
Queue/RED set queue_in_bytes_ false ; Agent/TCP set old_ecn_ true
Queue/RED set setbit_ true }
#--- # Tao topo mang
proc create-topology2 { BW delay qtype qsize numSideLinks deltaDelay } { global ns
# Thiet lap kich co hang den kich co duong truyen # Gia su rang kich co goi la 1000Bytes
if { $qsize == 0 } { set qsize [expr round([expr ($BW / 8) * 2 * $delay])] }
#Khai bao 2 nut R0 R1 set i 0
while { $i < 2 } { global R$i
set R$i [$ns node] incr i
}
$R0 color red $R1 color blue
$R0 label "That co chai" $R1 label "Dich"
# Khai bao link: nodes bw delay queue $ns duplex-link $R0 $R1 [set BW]Mb [set delay]ms $qtype $ns queue-limit $R0 $R1 $qsize
$ns queue-limit $R1 $R0 $qsize
# Xu li hang bi that co chai, cho phep thiet lap cac tham so RED global Bottleneck rBottleneck
set Bottleneck [[$ns link $R0 $R1] queue] set rBottleneck [[$ns link $R1 $R0] queue] global l rl
set l [$ns link $R0 $R1] set rl [$ns link $R1 $R0] global all_links
Phụ lục
# Duong truyen nha'nh co cung bang thong nhu duong that co chai set i 0
while { $i < $numSideLinks } { global n$i q$i rq$i l$i rl$i set n$i [$ns node]
$ns duplex-link [set n$i] $R0 [set BW]Mb [expr $delay + $i* $deltaDelay]ms $qtype
$ns queue-limit [set n$i] $R0 $qsize $ns queue-limit $R0 [set n$i] $qsize set q$i [[$ns link [set n$i] $R0] queue] set rq$i [[$ns link $R0 [set n$i]] queue] set l$i [$ns link [set n$i] $R0]
set rl$i [$ns link $R0 [set n$i]]
set all_links "$all_links [set l$i] [set rl$i]" incr i
} }
#--- #---Lop GeneralSender: can thiet cho phia goi ftp--- Class GeneralSender -superclass Agent
GeneralSender instproc init { id node rcvrTCP otherparams } { global ns
$self next
$self instvar tcp_ id_ ftp_ node_ tcp_rcvr_ tcp_type_ set id_ $id
set node_ $node
if { [llength $otherparams] > 1 } { set TCP [lindex $otherparams 1] } else {
set TCP "TCP/Reno" }
set tcp_type_ $TCP
set tcp_ [new Agent/$TCP] $tcp_ set packetSize_ 1000 $tcp_ set class_ $id
set ftp_ [new Source/FTP] $ftp_ set agent_ $tcp_
$ns attach-agent $node $tcp_ $ns connect $tcp_ $rcvrTCP set tcp_rcvr_ $rcvrTCP
Phụ lục
set startTime [lindex $otherparams 0] $ns at $startTime "$ftp_ start"
puts " Khoi tao phia goi $id_ tai thoi gian t= $startTime s" }
GeneralSender instproc trace-xcp parameters { $self instvar tcp_ id_ tcpTrace_
global ftracetcp$id_ ns
set ftracetcp$id_ [open xcp$id_.tr w] set tcpTrace_ [set ftracetcp$id_] $tcp_ attach-trace [set ftracetcp$id_]
if { -1 < [lsearch $parameters cwnd] } { $tcp_ tracevar cwnd_ } }
#--- #---Thuc hien chuc nang ve do thi---# # do thi bien trace xcp
proc plot-xcp { TraceName nXCPs PlotTime what } {
exec rm -f xgraph_cwnd.tcp set f [open xgraph_cwnd.tcp w] set a cwnd
puts $f "TitleText: $TraceName" puts $f "Device: Postscript" foreach i $nXCPs {
# trace TCP duoc flushed khi cac nguon ngung exec rm -f temp.tcp
exec touch temp.tcp global ftracetcp$i
if [info exists ftracetcp$i] { flush [set ftracetcp$i] }
set result [exec awk -v PlotTime=$PlotTime -v what=$what { {
if (( $6 == what ) && ($1 > PlotTime)) { print $1, $7 >> "temp.tcp";
} } } xcp$i.tr]
puts $f \"$what$i exec cat temp.tcp >@ $f
Phụ lục
puts $f "\n" flush $f }
close $f
exec xgraph -P -bg white -fg black -zg black -x "Thoi gian (s)" -y "cwnd (KBytes)" xgraph_$a.tcp &
return }
#--- proc plot-xcp-queue { PlotTime traceFile } {
exec rm -f xcp_queue
exec rm -f temp.q temp.a temp.p temp.avg_enqueued temp.avg_dequeued temp.x temp.y
exec touch temp.q temp.a temp.p temp.avg_enqueued temp.avg_dequeued temp.x temp.y
exec awk -v PT=$PlotTime { {
if (($1 == "q" && NF>2) && ($2 > PT)) { print $2, $3 >> "temp.q"
}
else if (($1 == "a" && NF>2) && ($2 > PT)) { print $2, $3 >> "temp.a"
}
else if (($1 == "p" && NF>2) && ($2 > PT)) { print $2, $3 >> "temp.p"
} } } $traceFile
set ff [open xcp_queue w]
puts $ff "TitleText: Trang thai hang DROPTAIL XCP" puts $ff "Device: Postscript \n"
puts $ff \"queue
exec cat temp.q >@ $ff puts $ff \n\"ave_queue exec cat temp.a >@ $ff puts $ff \n\"prob_drop exec cat temp.p >@ $ff close $ff
exec xgraph -P -bg white -fg black -zg black -x "Thoi gian (s)" -y "Queue (goi)" xcp_queue &
Phụ lục
}
#--- proc plot-red-queue { PlotTime traceFile } {
exec rm -f red_queue
exec rm -f temp.q temp.a temp.p temp.avg_enqueued temp.avg_dequeued temp.x temp.y
exec touch temp.q temp.a temp.p temp.avg_enqueued temp.avg_dequeued temp.x temp.y
exec awk -v PT=$PlotTime { {
if (($1 == "Q" && NF>2) && ($2 > PT)) { print $2, $3 >> "temp.q"
}
else if (($1 == "a" && NF>2) && ($2 > PT)) { print $2, $3 >> "temp.a"
}
else if (($1 == "p" && NF>2) && ($2 > PT)) { print $2, $3 >> "temp.p"
} } } $traceFile
set ff [open red_queue w]
puts $ff "TitleText: Trang thai hang RED TCP" puts $ff "Device: Postscript \n"
puts $ff \"queue
exec cat temp.q >@ $ff puts $ff \n\"ave_queue exec cat temp.a >@ $ff puts $ff \n\"prob_drop exec cat temp.p >@ $ff close $ff
exec xgraph -P -bg white -fg black -zg black -x "Thoi gian (s)" -y "Queue (goi)" red_queue &
}
#---