مثالی از کار با شبیه ساز شبکه Ns2

در این مثال می خواهیم یک شبکه با 4 نود به نام های n1 ، n2 ، n3 و n4 پیاده سازی کنیم که لینک ارتباطی بین n0 و n2 و همچنین n1 و n2 از نوع duplex با پهنای باند 2 مگابیت در ثانیه و تاخیر 10 میلی ثانیه است و لینک duplex بین n2 و n3 دارای پهنای باند 1.7 مگابیت در ثانیه و تاخیر 20 میلی ثانیه است .

هر نود از یک صف از نوع DropTail با حداکثر اندازه 10 استفاده میکند.
n0 حاوی یک عامل tcp و n1 حاوی یک عامل tcp-sink است .
عامل هاي شبکه نشانگر نقاط انتهايي يک اتصال لايه شبکه اند که بسته هاي اين لايه توليد کرده و در طرف ديگر تحويل لايه متناظر مي دهند . بخشي از عامل توسط OTCL و بخشي از آن به زبان C++ طراحي شده است . عامل در پياده سازي پروتکل هاي لايه‌اي مختلف استفاده مي‌شود .
) به طور پیش فرض اندازه پکت هایی که یک عامل tcp میتواند تولید کند 1 کیلو بایت است .
یک عامل tcp sink پکت های Ack تولید و به فرستنده پیام ارسال میکند و پکت هاب دریافت شده را آزاد میکند . (
جزئیات بیشتر را در حین نوشتن اسکریپت ارائه خواهم داد .
خوب نوشتن اولین اسکریپت Tcl برای پیاده سازی توپولوژی شکل 1-1 را شروع میکنیم:
میتوانید اسکریپت هایی Tcl را در هر برنامه ویرایشگر متن بنویسید.

nano ns_example.tcl

کد:
#Create a simulator object
set ns [new Simulator]

#Define different colors for data flows (for NAM)
$ns color 1 Blue
$ns color 2 Red

#Open the NAM trace file
set nf [open out.nam w]
$ns namtrace-all $nf

#Define a 'finish' procedure
proc finish {} {
        global ns nf
        $ns flush-trace
        #Close the NAM trace file
        close $nf
        #Execute NAM on the trace file
        exec nam out.nam &
        exit 0
}

#Create four nodes
set n0 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
set n3 [$ns node]

#Create links between the nodes
$ns duplex-link $n0 $n2 2Mb 10ms DropTail
$ns duplex-link $n1 $n2 2Mb 10ms DropTail
$ns duplex-link $n2 $n3 1.7Mb 20ms DropTail

#Set Queue Size of link (n2-n3) to 10
$ns queue-limit $n2 $n3 10

#Give node position (for NAM)
$ns duplex-link-op $n0 $n2 orient right-down
$ns duplex-link-op $n1 $n2 orient right-up
$ns duplex-link-op $n2 $n3 orient right
	
#Monitor the queue for link (n2-n3). (for NAM)
$ns duplex-link-op $n2 $n3 queuePos 0.5


#Setup a TCP connection
set tcp [new Agent/TCP]
$tcp set class_ 2
$ns attach-agent $n0 $tcp
set sink [new Agent/TCPSink]
$ns attach-agent $n3 $sink
$ns connect $tcp $sink
$tcp set fid_ 1

#Setup a FTP over TCP connection
set ftp [new Application/FTP]
$ftp attach-agent $tcp
$ftp set type_ FTP


#Setup a UDP connection
set udp [new Agent/UDP]
$ns attach-agent $n1 $udp
set null [new Agent/Null]
$ns attach-agent $n3 $null
$ns connect $udp $null
$udp set fid_ 2

#Setup a CBR over UDP connection
set cbr [new Application/Traffic/CBR]
$cbr attach-agent $udp
$cbr set type_ CBR
$cbr set packet_size_ 1000
$cbr set rate_ 1mb
$cbr set random_ false


#Schedule events for the CBR and FTP agents
$ns at 0.1 "$cbr start"
$ns at 1.0 "$ftp start"
$ns at 4.0 "$ftp stop"
$ns at 4.5 "$cbr stop"

#Detach tcp and sink agents (not really necessary)
$ns at 4.5 "$ns detach-agent $n0 $tcp ; $ns detach-agent $n3 $sink"

#Call the finish procedure after 5 seconds of simulation time
$ns at 5.0 "finish"

#Print CBR packet size and interval
puts "CBR packet size = [$cbr set packet_size_]"
puts "CBR interval = [$cbr set interval_]"

#Run the simulation
$ns run


و برای اجرای آن دستور زیر را اجرا کنید :

ns ns_example.tcl


توضیحات ns_example.tcl :
قبل از هر کار در هر اسکریپت tcl برای NS2 باید یک شیئ شبیه ساز ایجاد کرد. این کار با دستور زیر انجام می شود :

کد:
set ns [new Simulator]

این دستور یک شیئ شبیه ساز NS را ایجاد می کند و آنرا به متغیر NS منصوب می کند .
با استفاده از روال ها و خصوصیات این شیئ می توان توپولوژی شبکه را پیاده سازی کرد.
به عنوان مثال شیئ شبیه ساز دارای متدهایی است که عملیات زیر را انجام می دهند :
• گره ها و خطوط ارتباطی بین آنها را ایجاد می کند .
• اشیا مربوط به عناصر شبکه ( با attache-agent ) را به یکدیگر متصل می کند .
• ارتباط بین منابع ترافیکی و دریافت کننده ها را برقرار می کند . 
• پارامتر های نمایش توسط نرم افزار NAM را مشخص می کند .
(NAM ابزاری برای نمایش گرافیکی شبیه ساز NS است و محیطی را در اختیار می گذارد که بتوان با استفاده از آن حرکت واقعی بسته های داده ای را مشاهده کرد. )

کد:
$ns color 1 Blue
$ns color 2 Red

این خطوط برای تعیین رنگ جریان پکت ها استفاده می شود. Syntax کلی آن به صورت زیر است :

کد:
$ns color fid color

در اینجا جریان پکت ها با fid شماره 1 با رنگ آبی و جریان پکت ها با fid شماره 2 با رنگ قرمز نمایش داده می شود.


این بخش برای تنظیم محیط گرافیکی نمایش شبیه ساز ( NAM ) است و تاثیری در شبیه سازی ندارد .
NAM برای داده های ترسیم نیاز به یک فایل باز دارد که در اولین خط کد این بخش فایل out.nam رابرای نوشتن باز کرده و نام nf را به آن می دهیم . در خط دوم مشخص میکنیم که شیئ شبیه ساز ، همه ی داده های شبیه سازی که به NAM مربوط می شود را در فایل out.nam بنویسد.

کد:
set nf [open out.nam w]
$ns namtrace-all $nf


تعریف روال پایان :

کد:
proc finish {} {
        global ns nf
        $ns flush-trace
        #Close the NAM trace file
        close $nf
        #Execute NAM on the trace file
        exec nam out.nam &
        exit 0
}

یک روال پایان تعریف کردیم تا در خاتمه کار با فراخوانی آن از شبیه ساز خارج شویم.

در این مرحله 4 نود شبکه ایجاد می کنیم . هر نود را با ایجاد یک شیئ جدید با دستور $node تولید کرده و آنرا با دستور set به متغیر های n0 تا n4 اختصاص می دهیم.

کد:
set n0 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
set n3 [$ns node]


اکنون نوبت به ایجاد لینک ارتباطی بین نود ها رسیده است :

کد:
$ns duplex-link $node1 $node2 Bandwidth Delay Queue-type

پس لینک های ارتباطی را با مشخصات داده شده ( پهنای باند – تاخیر – نوع صف ) تعریف می نماییم. 

کد:
$ns duplex-link $n0 $n2 2Mb 10ms DropTail
$ns duplex-link $n1 $n2 2Mb 10ms DropTail
$ns duplex-link $n2 $n3 1.7Mb 20ms DropTail

همچنین می توان اندازه اندازه صف هر لینک را محدود کرد :

کد:
$ns queue-limit $n2 $n3 10

اینجا اندازه لینک ارتباطی بین نود های n2 و n3 را 10 محدود کردیم .

برای بهبود شمای توپولوژی شبکه بهتر است مکان نودها را مشخص کرد .

کد:
$ns duplex-link-op $n0 $n2 orient right-down
$ns duplex-link-op $n1 $n2 orient right-up
$ns duplex-link-op $n2 $n3 orient right


برای مشاهده ی تاثیر این خطوط بر ظاهر شبیه ساز پیشنهاد میکنم اسکریپت را بدون این خطوط نیز اجرا کنید .
امکان مانیتور کردن پرقدرت در NS یکی از مزایای آن است . در NS میتوان صف هر لینک را نیز مانیتور کرد :

کد:
$ns duplex-link-op $n2 $n3 queuePos 0.5


حال می توانید بسته ها را در صف ببینید و مشاهده کنید کدام یک دور انداخته می شوند . در اینجا با صف از نوع Droptail فقط پکت های آبی دور ریخته میشود . برای مشاهده تاثیر نوع صف آنرا به SFQ تغییر دهید و دوباره آنرا اجرا کنید :

کد:
$ns duplex-link $n0 $n2 2Mb 10ms SFQ
$ns duplex-link $n1 $n2 2Mb 10ms SFQ
$ns duplex-link $n2 $n3 1.7Mb 20ms SFQ

تا این مرحله فقط سه نود و لینک ارتباطی بین آنها را ایجاد کرده و مکان آنها را در NAM مشخص کردیم ولی هنوز هیچ نوع داده ای برای تبادل بین نودها مشخص نشده است.
در NS همیشه داده از یک عامل ) agent ) به دیگری ارسال می شود . بنابراین گام بعدی ایجاد عامل های ارسال کننده ( منابع ترافیکی ) و دریافت کننده داده است.


برقراری یک اتصال TCP :

کد:
set tcp [new Agent/TCP]
$tcp set class_ 2
$ns attach-agent $n0 $tcp
set sink [new Agent/TCPSink]
$ns attach-agent $n3 $sink
$ns connect $tcp $sink
$tcp set fid_ 1


در این خطوط یک عامل TCP ایجاد کردیم. کاربران NS2 می توانند هر نوع عامل یا منبع ترافیکی را ایجاد کنند . در واقع عامل ها و منابع ترافیکی شیئ های اصلی در NS هستند که عمدتا در C++ پیاده سازی شده و در OTCL لینک می شوند. برای ایجاد عامل ها و منابع ترافیکی ، کاربر باید نام کلاس های این اشیا را بداند ( Agent/TCP ، Agent/TCPSink ، Application/Ftp ). این اطلاعات در مستندات NS موجود است ولی یک راه میانبر برای آن فایل 

کد:
/ns-2/tcl/libs/ns-default.tcl


است. این فایل حاوی مقادیر پیش فرض پارامتر های قابل پیکربندی برای اشیا شبکه در NS است .بنابراین راهنمای خوبی برای مشخص کردن اینکه چه نوع شی های شبکه در NS قابل دسترس است و پارامتر های قابل تغییر در NS است .
می توانید پارامتر های مناسب برای هر نوع عامل را در صفحه راهنمای NS ببینید :

روال attach-agent یک عامل ایجاد شده را به یک نود پیوند می دهد .

کد:
$ns attach-agent node agent

به عنوان مثال :

کد:
$ns attach-agent $n0 $tcp

قدم بعدی ساختن یک اتصال شبکه منطقی بین اتصالات است. کد زیر یک ارتباط شبکه را با تنظیم آدرس مقصد و گروه آدرس پورت برای هر شبکه برقرار می کند .

کد:
$ns connect agent1 agent2

به عنوان مثال درکد زیر :

کد:
$ns connect $tcp $sink

ارتباط منطقی بین عامل های tcp و sink برقرار شده است .


در این مرحله منبع ترافیکی FTP را ایجاد میکنیم.

کد:
#Setup a FTP over TCP connection
set ftp [new Application/FTP]
$ftp attach-agent $tcp
$ftp set type_ FTP

ایجاد عامل udp و برقراری ارتباط از نوع udp بین n1 و n3

کد:
#Setup a UDP connection
set udp [new Agent/UDP]
$ns attach-agent $n1 $udp
set null [new Agent/Null]
$ns attach-agent $n3 $null
$ns connect $udp $null
$udp set fid_ 2

set cbr [new Application/Traffic/CBR]
$cbr attach-agent $udp
$cbr set type_ CBR
$cbr set packet_size_ 1000
$cbr set rate_ 1mb
$cbr set random_ false

این خطوط یک تولید کننده ترافیک CBR را به عامل UDP متصل میکند. ( CBR مخففی است برای Constant Bit Rate )
اندازه بسته روی 1000 بایت تنظیم شده است و سرعت تولید 1 مگابایت در ثانیه است.
خوب هم اکنون تنظیمات شبکه انجام شده است . قدم بعدی نوشتن یک سناریوی شبیه سازی است . 
شیئ شبیه ساز توابع برنامه ریزی مختلفی دارد که مهمترین آن تابع time است :

کد:
$ns at time  "String"

این شیئ برای زمانبندی شبیه ساز استفاده می شود .

کد:
$ns at 0.1 "$cbr start"
$ns at 1.0 "$ftp start"
$ns at 4.0 "$ftp stop"
$ns at 4.5 "$cbr stop"

CBR 
کار خود را در ثانیه 0.1 شروع می کند و در ثانیه 4.5 خاتمه می دهد و همچنین منبع ترافیکی ftp کار خود را در ثانیه 1.0 آغاز و در ثانیه 4.0 به اتمام می رسد .

در آخر کار عامل ها را از یکدیگر جدا می کنیم . اگر چه این کار لازم نیست .

کد:
$ns at 4.5 “$ns detach-agent $n0 $tcp ; $ns detach-agent $n3 $sink




خط آخر نیز برای اجرای ns است .