72
1 Network Simulator (NS2) โดย นางสาวจิตติมา นิตยวรรณ Nectec/NTL นายโสฬส ชคัตตรยาพงษ มหาวิทยาลัยบูรพา นางสาวอุไรรัตน พึ่งสุนทรบัตร มหาวิทยาลัยธรรมศาสตร ปฏิบัติงาน ศูนยเทคโนโลยีอิเล็กทรอนิกสและคอมพิวเตอรแหงชาติ (National Electronics and Computer Technology Center : NECTEC) 112 อุทยานวิทยาศาสตรประเทศไทย ถนนพหลโยธิน ตําบลคลองหนึ่ง อําเภอคลองหลวง จังหวัดปทุมธานี

Ns2 Tutorial by NECTEC (Thai)

  • Upload
    code453

  • View
    5.938

  • Download
    1

Embed Size (px)

DESCRIPTION

Ns2 Tutorial by NECTEC (Thai)

Citation preview

Page 1: Ns2 Tutorial by NECTEC (Thai)

1

Network Simulator (NS2)

โดย นางสาวจิตติมา นิตยวรรณ Nectec/NTL

นายโสฬส ชคัตตรยาพงษ มหาวิทยาลัยบรูพา นางสาวอุไรรัตน พึ่งสนุทรบัตร มหาวิทยาลัยธรรมศาสตร

ปฏิบัติงาน ณ ศูนยเทคโนโลยีอิเล็กทรอนิกสและคอมพิวเตอรแหงชาติ

(National Electronics and Computer Technology Center : NECTEC)

112 อุทยานวิทยาศาสตรประเทศไทย ถนนพหลโยธิน ตําบลคลองหน่ึง อําเภอคลองหลวง จังหวัดปทุมธานี

Page 2: Ns2 Tutorial by NECTEC (Thai)

2

สารบัญ

สารบัญ 2 บทที่ 1 บทนํา 3 บทที่ 2 ทฤษฎีที่เก่ียวของ

2.1 Literature Reviews 6 2.2 การติดตั้งโปรแกรม NS2 7

บทที่ 3 หลักการทํางานของ NS2

3.1 การทํางานของ NS2 13 3.2 NS Script Structure 14 3.3 การจัดการไฟลขอมูลเก่ียวกับ Trace file 20 3.4 NS process 23

บทที่ 4 Visualization Tools

4.1 Nam (Network AniMator Version1) 32 4.2 Xgraph 34

บทที่ 5 ตวัอยางการใชงาน NS2 42 ภาคผนวก Tcl และ OTcl Programming 56 อธิบายตวัอยาง ns-simlple.tcl 68 บรรณานุกรม 72

Page 3: Ns2 Tutorial by NECTEC (Thai)

3

Chapter 1 Introduction

ต้ังแตอดีตจนถึงปจจุบันนี้ไดมีการพัฒนาระบบเครือขายมาตลอด ซ่ึงการพัฒนาระบบเครือนั้นจะตองมีการวางโครงสรางและระบบผานอุปกรณตางๆท่ีใชในการเช่ือมตอเครือขายมากมาย โดยการที่จะติดต้ังระบบเครือขายสําหรับการใชงานนั้นจะตองมีการทดสอบการทํางานของระบบเครือขายจึงเปนการยากท่ีจะทดสอบการทํางานของระบบเครือขายโดยการทดสอบผานอุปกรณตางๆ ท่ีไดทําการวางระบบไวแลวเนื่องจากการวางระบบเครือขายนั้นเปนส่ิงท่ีใชงบประมาณและเวลามากจึงไมคุมท่ีจะทดสอบการทํางานของระบบเครือขายโดยการทดสอบผานอุปกรณท่ีใชในความเปนจริง จึงเกิดความจําเปนท่ีจะตองมีการจําลองการทํางานของระบบเครือขายเพื่อท่ีจะไดทําการศึกษาการทํางานของระบบเครือขายในดานตางๆ ท้ังพฤติกรรมของการขนสง packet, การศึกษาการทํางานของ Traffic บนระบบเครือขาย, การศึกษาการทํางานของ Algorithm ท่ีใชในการสงผาน packet เปนตน ซ่ึงในปจจุบันไดมีโปรแกรมท่ีชวยในการจําลองการทํางานของระบบเครือขายมากมาย มีท้ังท่ีเปน Freeware และ commercial เชน NS2, OMNet++, OPNet, CSim, Swans, NCTUns เปนตน เม่ือมีโปรแกรมที่ชวยในการจําลองการทํางานของระบบเครือขายจึงเปนการดีตอการศึกษาและงานวิจัยทางดานระบบเครือขาย เนื่องจากการคนควาวิจัยในดานระบบเครือขายนั้นจะตองใชงบประมาณในการทดสอบการทํางานของระบบเครือขาย รวมท้ังโปรแกรมเหลานี้ยังเปนประโยชนตอการศึกษาคนควาเปนอยางยิ่งตอผูท่ีไมมีทุนทรัพยในการท่ีไดเห็นการทํางานจริงของระบบเครือขายผานการจําลองโดยใชโปรแกรม เม่ือไมตองคํานึงถึงคาใชจายท่ีจะตองเสียจากการทดสอบการทํางานของระบบเครือขาย จึงสามารถที่จะพัฒนาความรูในดานนี้ไดอยางรวดเร็ว

ในบทความนี้จะขอกลาวถึงโปรแกรมการจําลองการทํางานของระบบเครือขายท่ีมีช่ือวา NS2 (Network Simulator version2)เปน discrete event simulator NS2 ไดสนับสนุนการทําแบบจําลองการทํางานของTCP, routing, multicast protocols over wired และ wireless (local และ satellite) networks จากคุณสมบัติเหลานี้เราสามารถจําลองการทํางานของ network ได

Page 4: Ns2 Tutorial by NECTEC (Thai)

4

ภาพท่ี 1.1 แสดง Network Model

ภาพท่ี 1.2 แสดงการจําลอง Network

จากภาพท่ี 1.1 นั้นเปนการออกแบบ Network ปจจุบันซ่ึงเม่ือเรานํา Network ท่ีใชกันอยูในปจจุบันมาทําการจําลองเพ่ือท่ีจะใชในการตรวจสอบการทํางานทางดานตางๆ เราจึงตองใชโปรแกรม NS2 มาชวยในการออกแบบการจําลอง Network ดังนั้นภาพท่ี 1.2 จึงเปนการจําลอง Network ท่ีเทียบมาจากความเปนจริง

NS2 มีภาษาที่ใชอยู 2 ภาษาดังคือ ภาษา C++ และ OTcl (Appendix A) ในสวนของข้ันตอนในการลงโปรแกรม NS2 พรอมท้ังรายละเอียดของการใชงาน OTcl และรายละเอียดของโปรแกรมท่ีใชในการ

App1

Agent1

App2

Agent2

Node

App1

Agent1

App2

Agent2

Node

App1

Agent1

App2

Node

Agent

App1

Agent1

App2

Agent2

Node

Node Node

Link Link

Link Link

Page 5: Ns2 Tutorial by NECTEC (Thai)

5

จําลองการทํางานของ Network พรอมท้ังยังมีการอธิบายโครงสรางและการทํางานของ NS2 ท่ีจะกลาวไวในChapter 2 หลังจากนั้นจะกลาวถึงหลักการทํางานและโครงสรางสวนประกอบท้ังหมดของ NS2 ใน chapter 3 ซ่ึงใน NS2 ยังมี Visualization tool ซ่ึงเปน tool ท่ีใชในการแสดงผลการทํางานของ Otcl script ออกมาในรูปของกราฟฟกซ่ึงมีท้ังกราฟและการจําลองการทํางานของ Network ซ่ึงกราฟนั้นจะมี Xgraph ซ่ึงเปน Tool ท่ีมีอยูแลวใน NS2 เปนตัวแสดงผล สวนในเร่ืองของการจําลองการทํางานของ Network จะมี NAM (Network Animator) เปนตัวแสดงผลซ่ึงรายละเอียดจะมีการกลาวเพิ่มเติมใน Chapter 4 และใน Chapter 5 จะมีการแสดงตัวอยางการทํางาน

Page 6: Ns2 Tutorial by NECTEC (Thai)

6

Chapter 2 Literature Reviews

2.1 Literature Reviews โปรแกรมท่ีใชในการจําลองการทํางานของ Network มีมากมายหลายโปรแกรมมากในปจจุบัน ซ่ึงนอกจาก NS2 ท่ีไดแนะนําไปบางแลวก็ยังมีโปรแกรมอ่ืนๆอีกมากมาย ซ่ึงแตละโปรแกรมก็มีความสามารถในแตละดานท่ีเพิ่มข้ึนมาแตกตางกัน ซ่ึงการท่ีจะนําแตละโปรแกรมมาใชงานนั้นก็ข้ึนอยูกับความถนัดของผูใชและความเหมาะสมของงานซ่ึงในท่ีนี้จะขอแนะนําโปรแกรมท่ีใชในการจําลองงานทํางานของ Network ดังตอไปนี้

1. NS2 NS2 เปน open-source และสามารถที่จะ run ไดท้ังบน Linux , FreeBSD, SunOS, Solaris,

Window ถูกพัฒนาข้ึนโดย ISI (Information Sciences Institute) NS2 เปนโปรแกรมท่ีใชในการจําลองการทํางานของ network ในแบบที่เปน discrete event simulator ซ่ึงสนับสนุนการจําลองการเลือกเสนทางในการขนสง packet,จําลองการทํางานของ multicast protocol และ IP protocol เชน UDP, TCP, RTP, SRM ท่ีอยูบนเครือขายประเภทท่ีเปน wire และ wireless (local และ satellite) ซ่ึง NS2 เปน tool ท่ีมีประโยชนมากท้ังยังสนับสนุน multiple protocol และยังมีความสามารถในการแสดงรายละเอียดของ network traffic ออกมาในรูปแบบของกราฟฟก รวมท้ังยังสนับสนุน algorithm ในการ routing และ queuing เชน FIFO, round-robin เปนตน

2. OPNET OPNET เปนโปรแกรมท่ีเปนผลิตภัณฑทางพาณิชยซ่ึงไดรวบรวม Model ตางๆและครอบคลุมถึงเทคโนโลยีทางดาน Network เพื่อรองรับใหผูใชสามารถท่ีจะออกแบบ และจัดการกับระบบเครือขายข้ันพื้นฐานพรอมท้ังยังมีการจําลองอุปกรณทางดาน network และnetwork application เพื่อใหผูใชนั้นไดพัฒนาระบบเครือขายเสมือนกับสภาพแวดลอมในความเปนจริง

3. CSim

CSim เปน Simulation Environment ท่ีมีพื้นฐานมาจากภาษา C ใน CSim จะมีการทําโมเดลท่ีมีความเปนอิสระและมีความสัมพันธระหวาง entity มีลักษณะการเก็บขอมูลแบบเปนลําดับช้ันจึงเปนระบบท่ีชวยทําใหจัดเก็บแฟมขอมูลเปนกลุม สามารถเพ่ิมประสิทธิภาพในการทํางานในเวลาเดียวกันภายในระบบได พรอมทั้งยังสนับสนุนระบบการทํางานประเภท rates, data, bandwidth, latency, traffic เปนตน ใน CSim นั้นจะมีแบบจําลองของซอฟตแวรเปนเชิงกลศาสตร (concurrent process oriented) พรอมท้ังยังมี Methods ในการชวยพัฒนาการทํางานท้ังแบบท่ีเปน Graphical และ Textual ในเร่ืองของ Graph file นั้นจะมี Graph file เปน XML ascii-text เพื่อชวยเพิ่มความสะดวกในเร่ืองการทํางานขาม platform โปรแกรม CSim นั้นเปน commercial software

Page 7: Ns2 Tutorial by NECTEC (Thai)

7

4. SWANS (Scalable Wireless As hoc Network Simulator) SWANS เปน scalable wireless network simulator ซ่ึงสรางอยูบน JiST platform (Java in

Simulation Time) SWANS มีการจัดการระบบในรูปแบบของ independent software component ทําใหสามารถท่ีเปล่ียนรูปแบบเปน complete wireless network หรือ sensor network configurations ความสามารถของ SWANS นั้นเหมือนกับ NS2 และ GloMoSim แตกตางกันท่ี SWANS นั้นจะรองรับการจําลองNetwork ขนาดใหญๆไดซ่ึง SWANS ยังสามารถแสดงผลลัพธของการจําลองในระดับสูง พรอมท้ังยังชวยประหยัดหนวยความจําและ สามารถ run Standard Java network application ไดบน simulate network

5. OMNet++ OMNet++ เปน discrete event simulation environment ซ่ึง OMNet++ นั้นสามารถที่จะ

จําลองการส่ือสารของNetwork protocol,computer network,traffic modeling, multi-processor และ distributed system เปนตน OMNet++นั้นไมไดเปน Network simulator ซ่ึงตัว OMNet++ เปนแค network simulation platform ซ่ึง Modelsตางๆของ OMNet++ นั้นจะเปน Component architecture ซ่ึงคอมโพเนนทตางๆนั้นถูกพัฒนาดวยภาษา C++ ซ่ึงการสรางคอมโพเนนทขนาดใหญและโมเดลนั้นจะใชภาษาระดับสูง (high-level language) ในการเขียนซ่ึงภาษาระดับสูงท่ีใชคือ ภาษา NED (Network Description)

6. NCTUns3.0 NCTUns เปน open-source โปรแกรม NCTUns นั้นพัฒนาข้ึนมาเพื่อใชเปน network

simulation และ emulation สําหรับ wireless และ mobile network ซ่ึง NCTUns จะสรางการจําลองสําหรับ wireless ad hoc, sensor, inter-vehicle communication network, GPRS cellular network และ wireless mesh network ซ่ึงความสามารถอีกอยางของ NCTUns คือ สามารถที่จะแบงแยก network device และ network protocol ออกเปนหมวดหมูได

2.2 การติดตั้งโปรแกรม Network Simulator (NS) บน Linux Network Simulator คือ โปรแกรมท่ีชวยในการฝกการออกแบบและติดต้ังระบบเครือขาย

คอมพิวเตอร ซ่ึงโปรแกรมนี้สามารถใชงานไดท้ังบน Window และ Unix (FreeBSD, Linux, SunOS, Solaris) สําหรับการลงโปรแกรมน้ีมี 2 วิธีในการลงโปรแกรม คือ สามารถลงแบบท่ีละ Component หรือ ลงแบบ all at one ซ่ึงในท่ีนี้จะเลือกลงโปรแกรมแบบ all at once ซ่ึงคือ NS-allinone-2.31 เปนโปรแกรม NS allinone Version 2.31 ซ่ึงการท่ีจะลงโปรแกรมแบบ allinone นั้นตองใชเนื้อท่ีอยางนอย 320 MB

Page 8: Ns2 Tutorial by NECTEC (Thai)

8

1.วิธีการดาวนโหลด (Download) Network Simulator 1.1 ดาวนโหลด Network Simulator (NS-allinone Version 2.31)จาก

http://sourceforge.net/project/showfiles.php?group_id=149743&package_id=169689&release_id=492770

2.การเตรียมอุปกรณเบื้องตน 2.1 เคร่ืองคอมพิวเตอรท่ีมี รายละเอียดดงัตอไปนี ้ OS : Linux2.6.18.2-34-default i686 System : openSUSE10.2(i586) Download OpenSUSE : http://es.opensuse.org/Versi%C3%B3n_publicada 2.2 หนวยความจําขนาด 320 MB 3.การติดตั้ง (install) 3.1 นํา File ns-allinone-2.31.tar มาไวใน Directory homeและสราง Directory ท่ีตองการเพื่อวางns-

allinone- 2.31โดยในท่ีนี้จะไวท่ี /home/user/NS 3.2 ทําการแตก file ns-allinone-2.31.tar โดยใชคําส่ัง tar -xvzf ns-allinone- 2.31.tar.gz 3.3 เม่ือแตก file ns-allinone-2.31.tar เรียบรอย ใหไปยัง Directory ท่ีเก็บ file ns-allinone-2.31 ท่ีแตก

เรียบรอยพิมพ ./install ดังภาพท่ี 2.1

ภาพท่ี 2.1 แสดงคาํส่ังท่ีใชในการ install ns-allinone-2.31

Page 9: Ns2 Tutorial by NECTEC (Thai)

9

3.4 Set Environment variables ซ่ึง Environment variables ท่ีตอง set มีดังนี้ PATH, LD_LIBRARY_PATH, TCL_LIBRARY เพื่อท่ีจะได Run file(.tcl) ณ ตําแหนงตางๆ ท่ีมี file(.tcl)

3.4.1 set path โดยการเพ่ิมคําส่ังลงใน /etc/bash.bashrc โดย vi bash.bashrc ดังภาพท่ี 2.2 เพื่อท่ีจะพิมพคําส่ัง set path

ภาพท่ี 2.2 แสดงวิธีในการเขาถึง file bash.bashrc

3.4.2 เม่ีอเขามาใน bash.bashrc ใหพิมพคําส่ัง Set Path ดังภาพท่ี 2.3 PATH=$PATH:$HOME/bin PATH=$PATH:/home/user/NS/ns-allinone-2.31/bin PATH=$PATH:/home/user/NS/ns-allinone-2.31/tcl8.4.14/unix PATH=$PATH:/home/user/NS/ns-allinone-2.31/tk8.4.14/unix LD_LIBRARY_PATH=/home/user/NS/ns-allinone-2.31/otcl-1.13 LD_LIBRARY_PATH=$LD_LIBRARY:/home/user/NS/ns-allinone-2.31/lib, TCL_LIBRARY==/home/user/NS/ns-allinone-2.31/tcl8.4.14/library export PATH LD_LIBRARY_PATH TCL_LIBRARY หมายเหตุ /home/user/NS/ns-allinone-2.31 เปนpath ท่ีเก็บ ns-allinone-2.31

Page 10: Ns2 Tutorial by NECTEC (Thai)

10

ภาพท่ี 2.3 แสดงคาํส่ังท่ีใชในการ Set path

4. วิธีแกปญหา 4.1 เม่ือ install และ set Path แลวแตไมสามารถท่ีจะ run file (.tcl) ไดใหเขาไปยัง Directory ท่ีเก็บ Program

ns-allinone-2.31 แลวเขาไปยัง Directory bin แลวพิมพ cp * /usr/local/bin

5. การ run ns 5.1 เม่ือลงโปรแกรมเรียบรอยแลวเราจะทําการทดสอบการทํางานของโปรแกรมโดยจะนํา file (.tcl) มาทํา

การประมวลผลโดยผูใชจะตอง cd เขาไปยัง Directory ท่ีเก็บ file(.tcl) แลวพิมพคําส่ัง ns ตามดวยช่ือ file(.tcl) ท่ีตองการจะประมวลผล ดังภาพท่ี 2.4

ns ns_simple.tcl

Page 11: Ns2 Tutorial by NECTEC (Thai)

11

ภาพท่ี 2.4 แสดงการใชคําส่ัง ns เพื่อประมวลผล

5.2 กรณีท่ีคําส่ัง ns ประมวลผล file (.tcl) ไดถูกตองจะปรากฏผลลัพธท่ีไดจากการประมวลผลดังภาพท่ี 2.5 และถือวาการ install ns-allinone-2.31 ถูกตอง

ภาพท่ี 2.5 แสดงผลของการประมวลผล ns-simple.tcl

Page 12: Ns2 Tutorial by NECTEC (Thai)

12

6. NS Simulation Script เม่ือ run ตัวอยางนี้เรียบรอยแลวจะปรากฏผลลัพธดังภาพท่ี 2.6

ภาพท่ี 2.6 แสดงผลของการประมวลผล ns-simple.tcl

สามารถดูตัวอยาง Script ไดท่ี http://nile.wpi.edu/NS/simple_ns.html

Page 13: Ns2 Tutorial by NECTEC (Thai)

13

Chapter 3 หลักการทํางานของ NS2

3.1 การทํางานของ NS2

User จะสามารถสราง Otcl Script, C++ Network elements และ Perl Script เพื่อท่ีจะนํามาใชในการออกแบบเพื่อจําลองการทํางานของ Network ซ่ึง User สราง C++ network ข้ึนมาเพื่อใหเปน object ท่ีอยูใน library ท่ีสามารถจะเรียกใชไดโดยเรียกใชผาน Command ของ Otcl Script ซ่ึงจะมี Otcl linkage เปนตัวท่ีจะเรียก Object ใน library ข้ึนมาใชงาน เม่ือ Otcl script ถูกประมวลผล Otcl script จะสราง nam trace file และ ns trace file ซ่ึงตัว nam trace file ท่ีไดนั้นจะถูกเรียกใชโดย nam เพื่อท่ีจะนําไปประมวลผลแลวแสดงผลออกมาในรูปกราฟฟก ในสวนของ perl script นั้นจะเรียกใช ns trace file เพื่อนํา ns trace file มา filter ใหไดผลลัพธออกมาเปน Result ท่ีจะถูกเรียกใชโดย Visualization tool เชน Xgraph เพื่อท่ีจะนํามาใชสรางกราฟท่ีแสดงผลการทํางานของการจําลอง Network

ภาษาท่ีใชใน NS2 มีอยู 2 ภาษา เนื่องจาก Simulator มีลักษณะการทํางาน 2 อยางท่ีแตกตางกัน ซ่ึงงานสวนแรกจะเปนการจําลองรายละเอียดตางๆเกี่ยวกับ Protocol จึงจําเปนตองใช System programming language ซ่ึงมีประสิทธิภาพในการจัดการขอมูลท่ีมีหนวยของขนาดขอมูลเปน byte , packet header และสราง algorithm ท่ีสามารถประมวลผลขอมูลท่ีมีขนาดใหญได ซ่ึงงานในสวนนี้จะเนน และใหความสําคัญในเร่ืองของ run-time speed สวนในเร่ืองของ turn-around time (คนหา bug ,re-run, recompile) นั้น จะมีความสําคัญนอยกวา สวนงานในสวนท่ี 2 สวนใหญจะเปนเร่ืองของการทําวิจัยเกี่ยวกับ network ซ่ึงจะตอง

Generates Uses

diagram NS trace file

results

Visualization tool

Perl script

User

Otcl Script

C++ network elements

nam Nam trace file

Page 14: Ns2 Tutorial by NECTEC (Thai)

14

ยุงเกีย่วกับพวก Parameters หรือ การทํา Configuration ซ่ึง iteration time (change the model and re-run) นั้นเปนส่ิงสําคัญ เพราะฉะน้ันจึงจําเปนท่ี NS2 จะใช 2 ภาษา คือ

1. C++ - เอาไวใชในการสราง Protocol และ Application Agents - ใชกําหนดคุณสมบัติของกระบวนการทํางานของแตละ packet ตามท่ีผูใชตองการ - ใชเปล่ียนการทํางานของ object ใน C++ เพี่อเอาไวปรับใชกับ non-standard policies ขอดี - ประมวลผลเร็ว ขอเสีย – จะทํางานชาเม่ือมีการ run simulation, คนหา bug, fix bug, recompile, re-run

2. Otcl (Object Tool Command Language) - เอาไวใชในการเขียน Simulation script , Configuration และ setup - ทดสอบผลของ network parameter โดยทําการเปล่ียนแปลงคาใน object ของ C++ - วิเคราะหผลของการเปล่ียนแปลง parameter โดยใชการ trace และแสดงผลทางหนาจอ ขอดี – สามารถทํางานไดอยางรวดเร็วเม่ือมีการเปล่ียนแปลง ขอเสีย – ประมวลผลชา

NS Feature

- จําลองความแตกตางของ protocol (TCP/UDP) - Wired Routing protocols, Ad-Hoc Routing protocol - วิธีการที่ใชในการจัด packet เพื่อเรียงเขา Queue เชน Drop Tail, RED, WFQ, DRR, LQD เปนตน - คุณลักษณะของ Traffic มีดังนี้ Poisson, Exponential, Pareto เปนตน สําหรับ Traffic ของจุดเร่ิมตน คือ CBR หรือ VBR

- ปรับเปล่ียน NS2 เพื่อสราง protocol ใหม หรือพัฒนา protocol เดิมใหเปน Version ใหม - การวดัทางสถิติ เชน Throughput, Delat, Jitter, Queue Monitoring, Drops at Queues - Graphic visualization ใช NAM (Network Animator) ในการจําลอง visualize wired และใช Ad-

Hockey ในการจําลอง visualize wireless

3.2 NS Script Structure

1. Create Simulator Object set ns [new Simulator] #เปนการสราง Object ของ Simulator

2. Tracing

Page 15: Ns2 Tutorial by NECTEC (Thai)

15

การเปด nam trace file Nam trace file มีเอาไวสําหรับเก็บขอมูลท่ีจะนํามาใชในการประมวลผลของ NAM เพื่อท่ีจะแสดงผลการจําลอง Network ออกมาในรูปของกราฟฟก set <variable name> [open <ช่ือ file.nam> w] $ns namtrace-all file-descriptor : เปนการบอกให simulator บันทึก simulation trace ลงใน file-descriptor ตามรูปแบบของ NAM w คือ การบอกวาเปนการเขียนขอมูลลงใน file set nf [open out.nam w]

$ns namtrace-all $nf ซ่ึงผูใชสามารถท่ีจะ trace file ของ nam เฉพาะแตละชวงของ event ไดโดยใชคําส่ัง $ns namtrace-queue $<source_node> $<destination_node> $<fileName> การเปด trace file set <variable name>[open <ช่ือ file.tr> w] $ns trace-all $<variable name>

w คือ การบอกวาเปนการเขียนขอมูลลงใน file set tf [open out.tr w] $ns trace-all $tf $ns flush-trace : เปน member function ของ trace-all ซ่ึงเปนคําส่ังท่ีใชในการบันทึก simulation trace ไวในรูปแบบท่ีกําหนด

รายละเอียดของ Trace file

ภาพท่ี 2.7 แสดงรายละเอียดของ Trace file

Page 16: Ns2 Tutorial by NECTEC (Thai)

16

1. Event คือ Event type ซ่ึงมีสัญลักษณอยู 4 ชนิด คือ r, +, -, d r หมายถึง receive + หมายถึง enqueue - หมายถึง dequeue d หมายถึง Drop

2. Time คือ เวลาขณะท่ีเกิด event 3. From node คือ input node ของ link ท่ีเกิด event 4. To node คือ output node ของ link ท่ีเกิด event 5. Pkt type คือ Packet type หรือช่ือของตัวแปรท่ีถูกกําหนดคาใหเปน Application 6. Pkt size คือ Packet Size 7. Flags 8. Fid คือ Flow id (ตัวแปรท่ีเก็บคาสี) 9. Src addr คือ source address 10. Dst addr คือ destination address 11. Seq num คือ Sequence number ของ packet ใน Network Layer 12. Pkt id คือ unique id ของ packet

3. Create Nodes ( physical layer)

set <variable name> [$ns node] set n0 [$ns node] set n1 [$ns node]

4. Links and queuing ( Data-link layer ) $ns <link> node1 node2 <bandwidth> <delay> <queue_type> <queue_type>: DropTail, RED, CBQ, FQ, SFQ, DRR etc. <link> : Simplex-link คือ การเชื่อมตอแบบทางเดียว Duplex-link คือ การเชื่อมตอแบบ 2 ทาง $ns duplex-link $n0 $n1 1Mb 10ms RED $ns queue-limit node1 node2 number : เปนการกําหนดขนาดของ queue ท่ีเช่ือมระหวาง node1 และ node2 $ns duplex-link-op node1 node2… : เอาไวใชสําหรับการแสดงผลของ NAM

n0 n1 Node

Link

Page 17: Ns2 Tutorial by NECTEC (Thai)

17

5. Creating UDP connection ( transport layer) การสรางตัวแปรท่ีเปน Agent set udp [new Agent/UDP] set null [new Agent/NULL] การกําหนดให Agent อยูบน Node $ns attach-agent node agent : $ns attach-agent $n0 $udp $ns attach-agent $n1 $null การสรางการติดตอส่ือสารระหวาง agent $ns connect agent1 agent2 $ns connect $udp $null

6. Creating TCP connection ( transport layer ) การสรางตัวแปรท่ีเปน Agent set tcp [new Agent/TCP] set tcpsink [new Agent/TCPSink] การกําหนดให Agent อยูบน Node $ns attach-agent $n0 $tcp $ns attach-agent $n1 $tcpsink การสรางการตดิตอส่ือสารระหวาง Source และ destination $ns connect $tcp $tcpsink

n1

n0

udp

null

Create UDP

Create TCP

n1

n0

sink

tcp

การสราง Agent ขึ้นมา 2 ตัวโดยใหตัวหน่ึงมีคุณสมบัติของ UDP น่ันก็คือ udp และอีกตัวใหเปน null แลวกําหนดให Agent แตละตัวอยูบน node คนละตัวกันเมื่อกําหนดใหมีการติดตอสื่อสารกันจะมีตัวหน่ึงเปน source อีกตัวเปน destination

การสราง Agent ขึ้นมา 2 ตัวโดยใหตัวหน่ึงมีคุณสมบัติของ TCP น่ันก็คือ tcp และอีกตัวใหเปน tcpsink แลวกําหนดให Agent แตละตัวอยูบน node คนละตัวกันเมื่อใหมีการติดตอสื่อสารกันจะมีตัวหน่ึงเปน source อีกตัวเปน destination

Page 18: Ns2 Tutorial by NECTEC (Thai)

18

n1

n0

udp

cbr

null

7. Creating Traffic ( application layer) (On Top of UDP) เชน CBR set cbr [new Application/Traffic/CBR] $cbr set packetSize_ 500 $cbr set interval_ 0.005 $cbr attach-agent $udp

การสราง Application (On Top of TCP) เชน FTP, Telnet FTP

set ftp [new Application/FTP] $ftp attach-agent $tcp

Telnet set telnet [new Application/Telnet] $telnet attach-agent $tcp

8. การเขียน Procedure

proc ชื่อprocedure {} { body } proc finish {} {

global ns nf $ns flush-trace close $nf exec nam out.nam & exit 0 }

Create CBR

n1

n0

tcp

sink

ftp

Create FTP

สราง Traffic ที่ช่ือ cbr แลวกําหนดคุณสมบัติของ cbr ทั้งขนาดของ packet และชวงเวลาที่ packet ใช รวมทั้งกําหนดใหcbr อยูบน Agent UDP

สราง Application ที่ช่ือ ftp แลวกําหนดคุณสมบัติของ FTP รวมท้ังกําหนดให ftp อยูบน Agent tcp

Page 19: Ns2 Tutorial by NECTEC (Thai)

19

9. Call Procedure $ns at 5.0 "finish" 10. Schedule event

$ns at <time> <event> : เปนคําส่ังท่ีจะทําการประมวลผล event ตามเวลาท่ีกําหนด <event>: คําส่ังท่ีไดกําหนดไวใน ns/tcl

$ns at 1.0 “Start” 11. Start NS (เร่ิมการทํางานของ Script)

$ns run 12. Stop NS

Exit 0 การ Run NS Program การ Run แบบ interactive mode โดยการพิมพ ns แลวจึงพิมพ command ตางๆ ทีละบรรทัด

bash-shell$ ns % set ns [new Simulator] % $ns at 1 “puts \“Hello World!\”” % $ns at 1.5 “exit” % $ns run Output : Hello World!

การ Run แบบ Batch mode เปนการท่ี run จาก file ท่ีมีการกําหนด Script ไวเรียบรอยแลว - ใชคําส่ัง ns <Otcl script file>

กระบวนการของการประมวลผลของ NS - อาน tcl file - Run simulation program - สราง trace file - แสดงผลลัพธโดยใช NAM (network animator) - ผลทางสถิติ

Page 20: Ns2 Tutorial by NECTEC (Thai)

20

3.3 การจัดการขอมูลเก่ียวกับ Trace file ใน NS simulator นั้นสามารถจัดเตรียมรายละเอียดของขอมูลในแตละเหตุการณบน Network ได

ซ่ึงถาผูใชตองการท่ีจะวิเคราะหขอมูลตางๆ ผูใชจะตองทําการ trace ขอมูลตางมาไวใน file แลวทําการวิเคราะหจัดการขอมูลตางๆ เองซ่ึงอาจจะวิเคราะหขอมูลตางๆเหลานี้โดยการใชภาษาท่ีใชในการเขียนโปรแกรมตาง ๆ ในการจัดการกับไฟล ซ่ึงสวนใหญจะจัดการกับไฟลตางๆโดยใชภาษา script เนื่องจากภาษาเหลานี้จะทํางานโดยการแปลคําส่ังและประมวลผลไดโดยท่ีไมตองทําการคอมไพล การจัดการไฟลขอมูลดวย awk Awk เปนภาษาที่สามารถจะนํามาใชในการจัดการกับไฟลขอมูลไดดวยคําส่ังงายๆ ท่ีมีใน awk ซ่ึง Awk มีความสามารถดังตอไปนี้

- จัดการกับ database เล็กๆ - สราง report - ตรวจสอบความถูกตองของขอมูล - สราง index และแสดงเอกสารของงานตางๆ - ใชทดสอบ algolithm กอนท่ีจะมีการนําไปประยุกตใชดวยภาษาอ่ืนๆ

เชน การแสดงคาในแตละ column ในไฟล, การคํานวณหาผลรวม, การหาผลหาร เปนตน Example : ตัวอยาง awk script ท่ีคํานวณคาเฉล่ียในคอลัมนท่ี 4 จากไฟล BEGIN {FS = “\t”} {nl++} {s=s+$4} END {print “average:” s/n1} ตัวอยางขางตนมีช่ือไฟลวา Average.awk ซ่ึงถาตองการนํา code ดังกลาวไปใชงานกับ file ท่ีช่ือ out.ns ใหใชคําส่ังในการประมวลผล file ดังนี้ awk –f Average.awk out.ns ซ่ึงผลลัพธก็คือการหาคาเฉล่ียในคอลัมนท่ี 4 ของไฟล out.ns วิธีการประมวลผล awk กรณีท่ี awk อยูใน OTcl script exec awk $<function> <fileName> เชน exec awk $awkCode all.q กรณีท่ี awk อยูใน file awk –f <program> <input-file> เชน awk –f advice คําส่ัง –f มีเพื่อท่ีจะนําโปรแกรม awk มาจากไฟล source file

Page 21: Ns2 Tutorial by NECTEC (Thai)

21

การจัดการไฟลขอมูลดวย perl Perl ยอมาจาก Practical Extraction and Report Language ซ่ึง perl สามารถท่ีจะทําการประมวลผลไฟลขอมูลประเภท ASCII ใน unix ซ่ึงภาษานี้ถูกสรางมาเพ่ือชวยใหงานของผูดูแลระบบนั้นงายข้ึน ขอดีของการใช perl

- งายตอการเขียนโปรแกรมเล็กท่ีใชในการกรองขอมูลจากไฟลตางๆ - สามารถใชไดในหลายๆ OS โดยท่ีไมตองทําการเปล่ียนแปลง code - การดูแลและการตรวจสอบ Bug ใน perl script นั้นทําไดงาย - ภาษา perl เปนท่ีนิยมกันมาก

ซ่ึงใน NS simulator สามารถท่ีจะนําขอดีของ perl script มาชวยในการวิเคราะหขอมูลท่ีมีอยูใน trace file ตางๆ เพื่อท่ีจะไดนําผลที่ไดจากการวิเคราะหไปใชในการสรางกราฟ หรือไปใชในการตรวจสอบความถูกตองของขอมูลท่ีไดจากการทํางานของ ns simulator ดังตัวอยางตอไปนี้ท่ีจะแสดงการนํา perl script มาชวยในการจัดการประมวลผลขอมูลท่ีอยูใน trace file ซ่ึงตัวอยางนี้จะคํานวณคา throughput ของการติดตอกับ TCP ซ่ึงตัวโปรแกรมจะทําการหาคาเฉล่ียของ throughput ท่ีอยูในชวงตามคาท่ีไดรับจาก parameter ซ่ึงเรียกวา “granularity” ซ่ึง input ท่ีรับมานั้นมี 3 คา คือ ช่ือของ trace file (ในตัวอยางนี้คือ out.tr), nodeท่ีตองการตรวจสอบคา throughput, คาgranularity

Example : Perl script # type: perl throughput.pl <trace file> <required node> <granlarity> > file $infile=$ARGV[0]; $tonode=$ARGV[1]; $granularity=$ARGV[2]; #we compute how many bytes were transmitted during time interval specified #by granularity parameter in seconds $sum=0; $clock=0; open (DATA,"<$infile") #เปนคําส่ังเปด file out.tr แลวเอาคาใน file มาไวท่ี DATA || die "Can't open $infile $!"; while (<DATA>){ @x= split(' '); # นําคาท่ีอยูใน DATA มาไวใน array x #column 1 is time

รับคาจากพารามิเตอร 3 คาคือ ช่ือtrace file, nodeที่ตองการ, granularity แลวนํามาเก็บไวในตัวแปรตางๆ

Page 22: Ns2 Tutorial by NECTEC (Thai)

22

if ($x[1]-$clock<=$granularity) { # ตรวจสอบวาคอลัมนท่ี 0 นั้นมีคาเทากับ reception หรือไม if ($x[0] eq 'r') { # ตรวจสอบวาคาในคอลัมนท่ี 3 นั้นมีคาเทากับ node ท่ีใสมาในพารามิเตอรหรือไม if ($x[3] eq $tonode) { # ตรวจสอบวา packet เปนประเภท TCP หรือไม if ($x[4] eq 'tcp') { $sum=$sum+$x[5]; } } } } else { $throughput=$sum/$granularity; print STDOUT "$x[1] $throughput\n"; $clock=$clock+$granularity; $sum=0; } } $throughput=$sum/$granularity; print STDOUT "$x[1] $throughput\n"; $clock=$clock+$granularity; $sum=0; close DATA; exit(0);

เปนการคํานวณหาคา throughput และทําการพิมพค าที่ ไดจากการคํานวณออกมา

Page 23: Ns2 Tutorial by NECTEC (Thai)

23

ตัวอยางขอมูลใน out.tr Trace file

ภาพท่ี 3.1 แสดงขอมูลใน file out.tr

วิธีการประมวลผล perl script perl <PerlFile> <trace file> เม่ือตองการทดสอบการทํางานของไฟลตัวอยางขางตนใหใชคําส่ัง perl throughput.pl <trace file> <required node> <granlarity> > Resultfile 3.4 NS Process

NS Architecture ในมุมมองของผูใชท่ัวไป

ภาพท่ี 3.2 Architecture View of NS

ภาพท่ี 2.9 นี้จะแสดงถึงสถาปตยกรรมท่ัวๆไปของ NS ซ่ึงเปนสถาปตยกรรมของผูใชท่ัวไปที่ไมใช NS developer โดยผูใชจะใชภาษา Otcl script ในการออกแบบและ คําส่ังในการประมวลผลรูปแบบของการ

You are here

Page 24: Ns2 Tutorial by NECTEC (Thai)

24

จําลองใน Tcl ซ่ึง Tcl จะมีการเรียกใช simulator object ใน Otcl library ในสวนของ event scheduleและ network component นั้นไดมีการพัฒนาไวเรียบรอยแลวซ่ึง Souce code ภายในนั้นถูกพัฒนาดวยภาษา C++ ดังนั้น Otcl สามารถท่ีจะเรียกใชไดตลอดการทํางาน ซ่ึงจะมี Otcl linkage เปนตัวเรียกใชงานโดยเรียกผาน tclcl ซ่ึงท้ังหมดจะเปนการทํางานของ NS (NS คือ OO extended Tcl interpreter รวมกับ network simulator library )

ภาพท่ี 3.3 แสดงกระบวนการประมวลผลของ NS2

จากภาพท่ี 2.10 จะเห็นวา Otcl script ท่ีเราจําลองข้ึนมานั้นจะแสดงผลออกมาในรูปแบบของภาพ

กราฟฟกโดย nam ซ่ึงการท่ีจะไดแบบจําลองท่ีแสดงผลตาม Script นั้นตัว NS2 จะตองประมวลผลจาก Script แลวเช่ือมโยงคําส่ังจาก Otcl linkage แลวเรียก Object ท่ีไดกําหนดไวแลวในภาษา C++ มาทําการประมวลผลและแสดงผลตามท่ีกําหนดไวใน Script

ผูใชท่ัวไป

ภาพท่ี 3.4 แสดงกระบวนการทํางานของ NS-2

Simulation-Otcl Script

NS-2

C++ Library

Otcl Interperter Simulation

Results

Analysis

NAM

Page 25: Ns2 Tutorial by NECTEC (Thai)

25

เม่ือผูใชตองการที่จะใช NS2 ผูใชจะกําหนด Otcl Script แลวทําการ run Script แลว NS2 จะสราง Output file ใหแลวจะทําใหไดผลลัพธท่ีแสดงผลการจําลองตาม Script ออกมาในรูปแบบของกราฟฟก (NAM)

NS2 Developer

1. พัฒนา NS โดยใชภาษา C++ สราง object ข้ึนมา 2. ทดสอบ object ท่ีพัฒนาข้ึนมาโดยใช Otcl script โดยจะออกแบบการจําลอง Network ข้ึนมาเพื่อ

ทดสอบการทํางานของ Object ท่ีสรางข้ึน 3. ทดสอบการทํางานโดยดูผลจากการ run script ผาน NAM และ XGraph

Extending NS2 มีอยู 2 แบบดังนี้คือ Extending NS in Otcl และ Extending NS in C++

ภาพท่ี 3.5 แผนภาพโครงสรางของ File ใน NS-allinone

1. Extending NS in Otcl การเพิ่ม file.tcl

1.1 นําไฟล (.tcl)ไปไวใน /ns2/tcl/lib 1.2 เขาไปใน Makefile ท่ีอยูใน /ns2 แลวเพิ่มช่ือของไฟล (.tcl) นั้นไวบริเวณ NS_TCL_LIB 1.3 เขาไปใน tcl/lib/ แลวเพิ่มช่ือไฟล (.tcl) เขาไป 1.4 Recompile

TK8.0 OTcl tclclTcl8.0 ns-2 nam-1

tcl

ex test lib

...

...

examples validation

C++ code

OTcl code

ns-allinone

mcas

Page 26: Ns2 Tutorial by NECTEC (Thai)

26

2. Extending NS in C++ การแกไข Code C++

2.1 ใชคําส่ัง “make clean” 2.2 ใชคําส่ัง “make” เพื่อท่ีจะทําการ compile .o ท้ังหมดอีกคร้ัง

การสราง Network Object ดวย C++ เขาไปใน NS การสราง network object ใหมโดยใชภาษา C++ นั้นจะตองมีการสรางการเช่ือมโยงระหวางตัวแปรใน Otcl และตัวแปรในภาษา C++ เพื่อท่ีเวลาใช Otcl script แลว NS2 จะสามารถท่ีจะคนหาตัวแปรแลว match กับคําส่ังท่ีมีแลวทําการแสดงผลได ซ่ึงจะตองนํา file ท่ีเปน code ภาษา C++ เขาไปไวในโปรแกรม NS2 ข้ันตอนของการสราง Network object มีดังนี้

1. Export C++ class to OTcl 2. Export C++ class variables to OTcl 3. Export C++ Object Control Commands to OTcl 4. Execute an OTcl command from C++ 5. Compile and Run

ตัวอยางของการสราง Network object (MyAgent) Step1. Export C++ class to OTcl

เราสราง network object class ช่ือวา MyAgent ซ่ึง derive มาจาก Class Agent ใน C++ โดย Class MyAgent นี้จะทําการสรางตัวแทนของ Object นี้ไวใน Otcl ซ่ึงการที่จะทําเชนนี้ไดจะตองนิยาม linkage object เปนตัวกลางในการเช่ือมตอ โดยสราง Class MyAgentClass ข้ึนมา ซ่ึง Class MyAgentClass นั้น derive มาจาก Class Tclclass ซ่ึง linkage object นี้จะทําการสราง OTcl object ท่ีมีช่ือวา“Agent/MyAgentOtcl” (ในตัวอยางนี้) และสราง Linkageระหวาง OTcl object และ C++ object ท่ีเปนตัวสราง object ซ่ึงในท่ีนี้ คือ MyAgent

Page 27: Ns2 Tutorial by NECTEC (Thai)

27

เม่ือ NS เร่ิมทํางานจะมีการเรียก constructor ของตัวแปร static ท่ีช่ือวา class_my_agent แลวจึงสรางตัวแทนของ “MyAgentClass” ข้ึน Class Agent/MyAgentOtcl และ method ตางๆจะถูกสรางไวใน OTcl space เม่ือใดท่ี User ใน Otcl พยายามท่ีจะการสรางตัวแทนของ Object จะทําไดโดยใชคําส่ัง “new Agent/MyAgentOtcl” ซ่ึงจะมีการเรียก Method “MyAgentClass::create” เพื่อสรางตัวแทนของ “MyAgent” และ สงคา address กลับไป ในการสราง Object ใน C++ จาก OTcl นั้นจะไมไดคุณสมบัติ function หรือ member variable ของ C++ จาก OTcl

Step 2. Export C++ class variables to OTcl สมมติวา C ++ Object “MyAgent” ท่ีเราสรางใหมข้ึนมา มี parameter 2 ตัว คือ “my_var1” และ “my_var2” ซ่ึงเราตองการที่จะ configure จาก OTcl โดยใช input simulation script เราจะใช binding function ทําการ binding แตละตัวแปรของ ClassในC++ ท่ีเราตองการที่จะสงคาออกไป ซ่ึง binding function นั้น จะทําการสรางตัวแปรข้ึนมา (ช่ือตาม my_var1) โดยจะนําไป match กับ OTcl object ของ class (“Agent/MyAgentOtcl”) และทําการ binding แบบ bi-directional ระหวางตัวแปรของ OTcl class กับตัวแปรของ C++ ท่ีมี address ตรงกับ my_var1 และ my_var2 ตามลําดับ

ภาพท่ี 3.6 แสดงการทํางานแบบ Bidirectional binding

Page 28: Ns2 Tutorial by NECTEC (Thai)

28

Binding function จะอยูใน constructor function เพื่อใชในการ binding ตอนท่ี instance ของ object นี้ถูกสรางข้ึน ซ่ึง N S สนับสนุนฟงกช่ัน B i n d i n g 4 แบบท่ีเหมาะสําหรับ D a t a t y p e 5 แบบดังนี้

- bind(): real or integer variables - bind_time(): time variable - bind_bw(): bandwidth variable - bind_bool(): boolean variable

ดังนั้น User designing และ running simulation ท่ีใช OTcl Script จะสามารถ configure parameter

ท่ีสรางใน C++ ได

Step 3. Export C++ Object Control Commands to OTcl การ export C++ object variable ท่ี User สรางนั้น เราจึงตองกําหนดให control ของ C++ Object ไป

อยูใน OTcl ซ่ึงจะทําได โดยใหเรา define “command” member function ของ C++ object (“MyAgent”) เพื่อท่ีจะทําหนาท่ีเปนตัว interpreter ของ OTcl ซ่ึง “command” member function จะทําการคนหา Member function ท่ี Match กับ OTcl object ใหกับ User

เม่ือ instance ของ the shadow OTcl นั้น ทําการ Match “MyAgent” object ท่ีถูกสรางใน Otcl space (set myagent [new Agent/MyAgentOtcl]) แลว และ User ทําการเรียก Member function ของ object ($myagent call-my-priv-func), OTcl จะคนหา Member function ท่ี User ตองการใน OTcl object ถาช่ือ Member function ท่ีใหมาหาไมเจอมันจะเรียก “MyAgent :: command” แลวสงคาช่ือของ OTcl member function ท่ีเรียก และ argument ไปในรูปแบบของ argc/argv แตถาหาเจอ และมี action มารองรับ มันจะทํา action และทําการ return ผลลัพธกลับไปและเรียก function ถาไมมี “command” function ของ object บรรพบุรุษมันจะทํา recursive หาจนกวาจะพบ แตถาหาช่ือนั้นไมพบในบรรพบุรุษไหนเลย ก็จะมี error message สงไปให OTcl object และ OTcl object จะแสดง error message ใหกับ User

Page 29: Ns2 Tutorial by NECTEC (Thai)

29

Step 4. Execute an OTcl command from C++ เม่ือเราตองการที่จะสราง network object ใหม เราจึงจําเปนท่ีจะตองมีการ Execute คําส่ังของ OTcl

จาก C++ object จากภาพดานลางเปนตัวอยางของการ implement “MyPrivFunc” ซ่ึงเปน member function ของ “MyAgent” ซ่ึงเปนการแสดงผลลัพธของคาของ my_var1 และ my_var2 ออกทางหนาจอ ซ่ึงการท่ีจะ Execute คําส่ังของ OTcl จาก C++ นั้นเราตองมีการอางถึง “Tcl::instance()” ซ่ึงถูกประกาศเปน static member variable ซ่ึงในตัวอยางนี้ไดแสดงการสงคําส่ัง OTcl ใหกับ interpreter ซ่ึงมี 2 ทาง คือ MyPrivFunc และ Tcl::instance()

Step 5. Compile and Run and Test “MyAgent” 1. บันทึก ช่ือfile.cc ท่ีตองการจะสราง Network Object เชน ex-linkage.cc แลวบันทึกไวใน NS-2

directory 2. เปด “Makefile” แลวทําการเพิ่ม ช่ือfile.o (เชน ex-linkage.o) ไวในบรรทัดสุดทายของObject file

list OBJ_CC = \ … ./ex-linkage.o $(OBJ_STL)

3. Re-compile NS โดยใชคําส่ัง “make” 4. สราง file.tcl ข้ึนมาเพื่อทดสอบการทํางานของ Network Object ท่ีสรางข้ึน 5. run Otcl script โดยใชคําส่ัง ns ช่ือfile.tcl

Download ex-linkage.cc : http://nile.wpi.edu/NS/Example/ex-linkage.cc Download ex-linkage.tcl : http://nile.wpi.edu/NS/linkage.html

Page 30: Ns2 Tutorial by NECTEC (Thai)

30

ภาพท่ี 3.7 แสดง Otcl script ท่ีจะใชทดสอบการทํางานของ Network Object

ภาพท่ี 3.8 แสดงผลลัพธของการทดสอบการทํางานของ Network Object

ภาพท่ี 3.9 แสดงการเชื่อมตอของ OTcl กับ C++

constructor

TclObject (C++)

constructor

parent

init

Agent/MyAgentOtcl

init

Agent

Create Otcl shadow object

TclObject Create C++

object

constructor

MyAgent

OTcl C++

Static class MyAgentClass:public TclClass{ Public: MyAgentClass (): TclClass (“Agent/MyAgentOtcl”){} TclObject* create(int,const char*const*) { Return(new MyAgent()); } } class my agent;

Page 31: Ns2 Tutorial by NECTEC (Thai)

31

เม่ือผูใชมีการเรียกใช network object ท่ีสรางข้ึนโดยใชคําส่ัง set myagent [new Agent/MyAgentOtcl] แลว TclObject จะมีการ create C++ object ท่ีช่ือ MyAgent แลวจะมีการเรียก constructor ของ parent และ TclObject ใน code C++ จะถูกประมวลผลการทํางาน แลวสงผลลัพธกลับไปโดยใน TclObject จะมีการสราง OTcl shadow object ข้ึนมาเพื่อท่ีจะมาทําการสงคาไปใหกับ Agent เพื่อเช่ือมตอและแสดงผลลัพธท่ีไดจากการทํางาน

Page 32: Ns2 Tutorial by NECTEC (Thai)

32

Chapter 4 Visualization Tools

4.1 nam-1 (Network AniMator Version 1) Nam เปน Animation tool ท่ีมีพื้นฐานมาจาก Tcl/TK มีไวสําหรับแสดงการจําลองการทํางาน ของ network และ packet ซ่ึงแสดงผลออกมาในรูปของภาพกราฟฟกโดยไปดึงขอมูลท่ีใชในการจําลอง Network จาก nam teace file ท่ีไดสรางไวจากใน Tcl Script ซ่ึง Nam ไดสนับสนุน topology latout, packet level animation และ เคร่ืองมือในการตรวจสอบขอมูล Run Nam nam <nam-file> nam out.nam Run Nam in Ns2 script exec nam <nam-file> exec nam out.nam Nam Interface

1. Color mapping $ns color fid <color> : เปนการกําหนดสีใหกับ packet ตามเสนทางการเดินทางโดยใช flow id (fid) เปนตัวบงบอก COLOR : red, blue เปนตน $ns color 40 red $ns color 41 blue

2. Color flow id association $<variable of agent> set fid_ <variable of color> $tcp0 set fid_ 40 # red packets แสดงวา 40 = สีแดง

3. Node Color เปนการกําหนดสีใหกับ node $<variable of node> color <COLOR> COLOR : red, blue เปนตน $node color red #nodeนี้จะมีสีเปนสีแดง

Page 33: Ns2 Tutorial by NECTEC (Thai)

33

4. Node Shape เปนการกําหนดรูปรางใหกับ node $<variable of node> shape <SHAPE> SHAPE : circle, box, hexagon เปนตน $node shape box

5. Node Marks เปนการเพิ่มและลบ node ท่ีมีการ mark ไวตามเวลาท่ีกําหนด $ns at 1.0 “$n0 add-mark m0 blue box” $ns at 2.0 “$n0 delete-mark m0” เม่ือกําหนดเชนนี้เวลาแสดงผลจะปรากฎ Mask ตามท่ีระบุภายในชวงเวลา 1-2 วินาที

6. Node Lable เปนการกําหนดขอความกํากับท่ี node เร่ิมตั้งแตชวงเวลาท่ีกําหนด $ns at 1.1 “$n0 label \”web cache 0\””

7. Link Color เปนการกําหนดสีของlink จาก Node หนึ่งไปยังอีก Node $ns duplex-link-op $n0 $n1 color "green"

8. Link Label เปนการกํากับขอความบน link ท่ีอยูระหวาง node 2 node ท่ีกําหนด $ns duplex-link-op $n0 $n1 label “backbone"

ภาพท่ี 4.1 แสดงหนาจอท่ีมีการเรียกใช Nam

Page 34: Ns2 Tutorial by NECTEC (Thai)

34

4.2 Xgraph Xgraph คือ Plotting Program ซ่ึง Plotting Program นี้มีความสามารถท่ีจะสรางการแสดงผลออกมา

ในรูปของภาพกราฟฟกจากการแสดงผลลัพธจาก ns ได และภายในหัวขอนี้จะแสดงวิธีการสราง output file จาก Tcl scripts ซ่ึงเปนตัวท่ีจะมากําหนดขอมูลสําคัญท่ีใชในการ plot graph และจะแสดงออกมาดวยโปรแกรม Xgraph

ช่ือกราฟ : -t “title” ขนาดของกราฟ : -geometry xsize * ysize ช่ือกํากับแตละแกน : -x “xtitle” (แกน x) และ –y “ytitle” (แกน y) สีของตัวอักษรและgrid : -v Run Xgraph xgraph <ชื่อ file> -geometry xsize*ysize –t “title” –x “xtitle” –y “ytitle”

Run Xgraph (in NS2 Script) Exec xgraph <ชื่อ file> -geometry xsize*ysize –t “title” –x “xtitle” –y “ytitle” Exec xgraph out.tr –geometry 800* 400

ภาพท่ี 4.2 แสดงหนาจอท่ีมีการเรียกใช Xgraph

Page 35: Ns2 Tutorial by NECTEC (Thai)

35

Creating Output Files for Xgraph

อีกสวนหนึ่งของโปรแกรมภายใน ns-allinone package คือ 'Xgraph' , Plotting Program นี้มีความสามารถท่ีจะสรางการแสดงผลออกมาในรูปของภาพกราฟฟกจากการแสดงผลลัพธจาก ns ได และภายในหัวขอนี้จะแสดงวิธีการสราง output file จาก Tcl scripts ซ่ึงเปนตัวท่ีจะมากําหนดขอมูลท่ีสําคัญในการ plot graph และจะแสดงออกมาดวยโปรแกรม Xgraph

1.Topology and Traffic Sources ในข้ันตอนแรกเราจะสราง Topology ข้ึนมาตามแบบในรูปตอไปนี ้

ในสวนของ code ขางตนนี้จะมีความคลายคลึงกับตัวอยางโปรแกรมในขางตน โดยความหมายจากสวนนี้คือการสราง node ใหมเปนจํานวน 5 node

set n0 [$ns node] set n1 [$ns node] set n2 [$ns node] set n3 [$ns node] set n4 [$ns node] $ns duplex-link $n0 $n3 1Mb 100ms DropTail $ns duplex-link $n1 $n3 1Mb 100ms DropTail $ns duplex-link $n2 $n3 1Mb 100ms DropTail $ns duplex-link $n3 $n4 1Mb 100ms DropTail

Page 36: Ns2 Tutorial by NECTEC (Thai)

36

จากนั้นทําการสราง traffic ข้ึนมาเพื่อเพิ่มเติมรายละเอียดใหกับ node ดังกลาว โดยในสวนนี้จะเขียนอยูในรูปของฟงกชันซ่ึงมีช่ือวา attach-expoo-traffic และมีการรับคาจาก parameter 6 คาซ่ึงคือ node,sink,size,burst,idle,rate เพื่อความสะดวกในการกําหนดรายละเอียดของ node นั้น ๆ

จากตัวอยางฟงกชันดังกลาวนี้ จะมีอยูท้ังหมด 6 arguments 1. node คือ node ท่ีมีการสรางไวขางตน 2. sink คือ ตัวแปรของ traffic sink ท่ีสรางข้ึน 3. size คือ ขนาดของ packet ของ traffic source 4. burst คือ burst time 5. idle คือ idle time 6. rate คือ burst peak rate

จากรายละเอียดของฟงกชันนี้จะสราง traffic ข้ึนมาและทําการ attaches เขาไปภายใน node และมีการสราง traffic object ซ่ึงจากการสราง Traffic/Expoo object จะสามารถระบุการตั้งคาตาง ๆ ใหกับ traffic object ไดโดยการรับคามาจาก parameters ซ่ึงคาท่ีจะสงมากับ parameter นั้นมาจากการสรางข้ึนมากับ traffic source และมีการ attach traffic เขาไปใน source รวมท้ังยังมีการ connect ระหวาง source และ sink ดวย สวนตอไปนี้คือการสราง traffic เพื่อสรางความแตกตางกันของคา peak rates ภายใน node n0 , n1 และ n2 และจากนั้นจะเช่ือมโยง 3 traffic sink ไปยัง node n4

proc attach-expoo-traffic { node sink size burst idle rate } { #Get an instance of the simulator set ns [Simulator instance] #Create a UDP agent and attach it to the node set source [new Agent/UDP] $ns attach-agent $node $source #Create an Expoo traffic agent and set its configuration parameters set traffic [new Application/Traffic/Exponential] $traffic set packetSize_ $size $traffic set burst_time_ $burst $traffic set idle_time_ $idle $traffic set rate_ $rate # Attach traffic source to the traffic generator $traffic attach-agent $source #Connect the source and the sink $ns connect $source $sink return $traffic }

Page 37: Ns2 Tutorial by NECTEC (Thai)

37

2. Recording Data in Output Files ในสวนแรกน้ีจะทําการเปด output files ข้ึนมา 3 files จาก Tcl script ตามตัวอยางตอไปนี ้ สรางฟงกชันเพื่อจบการทํางานของโปรแกรมดังนี ้

set sink0 [new Agent/LossMonitor] set sink1 [new Agent/LossMonitor] set sink2 [new Agent/LossMonitor] $ns attach-agent $n4 $sink0 $ns attach-agent $n4 $sink1 $ns attach-agent $n4 $sink2 set source0 [attach-expoo-traffic $n0 $sink0 200 2s 1s 100k] set source1 [attach-expoo-traffic $n1 $sink1 200 2s 1s 200k] set source2 [attach-expoo-traffic $n2 $sink2 200 2s 1s 300k]

* ในสวนนี้ใช Agent/LossMonitor objects ในการสราง traffic sinks เพื่อนํามาชวยในการเก็บจํานวน bytes ท่ีไดมีการรับเขามา ซ่ึงจะมีสวนชวยในการคํานวณหา bandwidth

set f0 [open out0.tr w] set f1 [open out1.tr w] set f2 [open out2.tr w]

proc finish {} { global f0 f1 f2 #Close the output files close $f0 close $f1 close $f2 #Call xgraph to display the results exec xgraph out0.tr out1.tr out2.tr -geometry 800x400 & exit 0 }

Page 38: Ns2 Tutorial by NECTEC (Thai)

38

จากฟงกชันนี้ไมเพียงแตปดการทํางานของ output files แตจะเปนการเรียกการทํางานของ Xgraph ข้ึนมาเพื่อแสดงผลลัพธดวยตามขนาดของ size window ท่ี 800*400 ท่ีหนาจอ screen จากฟงกชันกอนหนานี้จะทําการอานจํานวนของ Bytes จากสาม traffic sinks ท่ีถูกเก็บไวจาก object ของ Agent/LossMonitor และจากนั้นจะทําการคํานวณ Bandwidth ในหนวยของ MBits/sec และจะเขียนขอมูลท่ีเปนเวลาปจจุบันและคา Bandwidth ท่ีคํานวณไดลงในแตละ output files ไปดวยกันกอนท่ีจะทําการ reset คาของ bytes_value ท่ี traffic sinks

3. Running the Simulation มาถึงในสวนนี้ จะได schedule ข้ึนมาจากกลุมคําส่ังตอไปนี้ และทําการรันโปรแกรมข้ึนมาตามตารางเวลาดังกลาวนี้ Result

proc record {} { 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] "record" }

$ns at 0.0 "record" $ns at 10.0 "$source0 start" $ns at 10.0 "$source1 start" $ns at 10.0 "$source2 start" $ns at 50.0 "$source0 stop" $ns at 50.0 "$source1 stop" $ns at 50.0 "$source2 stop" $ns at 60.0 "finish" $ns run

Page 39: Ns2 Tutorial by NECTEC (Thai)

39

ภาพท่ี 4.3 แสดงผลการทํางานของ Xgraph

Source Code #Create a simulator object set ns [new Simulator] #Open the output files set f0 [open out0.tr w] set f1 [open out1.tr w] set f2 [open out2.tr w] #Create 5 nodes set n0 [$ns node] set n1 [$ns node] set n2 [$ns node] set n3 [$ns node] set n4 [$ns node] #Connect the nodes $ns duplex-link $n0 $n3 1Mb 100ms DropTail $ns duplex-link $n1 $n3 1Mb 100ms DropTail $ns duplex-link $n2 $n3 1Mb 100ms DropTail $ns duplex-link $n3 $n4 1Mb 100ms DropTail #Define a 'finish' procedure proc finish {} { global f0 f1 f2 #Close the output files close $f0 close $f1 close $f2 #Call xgraph to display the results exec xgraph out0.tr out1.tr out2.tr -geometry 800x400 & exit 0 }

Page 40: Ns2 Tutorial by NECTEC (Thai)

40

#Define a procedure that attaches a UDP agent to a previously created node #'node' and attaches an Expoo traffic generator to the agent with the #characteristic values 'size' for packet size 'burst' for burst time, #'idle' for idle time and 'rate' for burst peak rate. The procedure connects #the source with the previously defined traffic sink 'sink' and returns the #source object. proc attach-expoo-traffic { node sink size burst idle rate } { #Get an instance of the simulator set ns [Simulator instance] #Create a UDP agent and attach it to the node set source [new Agent/UDP] $ns attach-agent $node $source #Create an Expoo traffic agent and set its configuration parameters set traffic [new Application/Traffic/Exponential] $traffic set packetSize_ $size $traffic set burst_time_ $burst $traffic set idle_time_ $idle $traffic set rate_ $rate # Attach traffic source to the traffic generator $traffic attach-agent $source #Connect the source and the sink $ns connect $source $sink return $traffic } #Define a procedure which periodically records the bandwidth received by the #three traffic sinks sink0/1/2 and writes it to the three files f0/1/2. proc record {} { 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] "record" } #Create three traffic sinks and attach them to the node n4 set sink0 [new Agent/LossMonitor] set sink1 [new Agent/LossMonitor] set sink2 [new Agent/LossMonitor] $ns attach-agent $n4 $sink0 $ns attach-agent $n4 $sink1

Page 41: Ns2 Tutorial by NECTEC (Thai)

41

$ns attach-agent $n4 $sink2 #Create three traffic sources set source0 [attach-expoo-traffic $n0 $sink0 200 2s 1s 100k] set source1 [attach-expoo-traffic $n1 $sink1 200 2s 1s 200k] set source2 [attach-expoo-traffic $n2 $sink2 200 2s 1s 300k] #Start logging the received bandwidth $ns at 0.0 "record" #Start the traffic sources $ns at 10.0 "$source0 start" $ns at 10.0 "$source1 start" $ns at 10.0 "$source2 start" #Stop the traffic sources $ns at 50.0 "$source0 stop" $ns at 50.0 "$source1 stop" $ns at 50.0 "$source2 stop" #Call the finish procedure after 60 seconds simulation time $ns at 60.0 "finish" #Run the simulation $ns run

Page 42: Ns2 Tutorial by NECTEC (Thai)

42

Chapter 5 ตัวอยางการใชงาน NS2

NS Script ตัวอยางนี้เปนการจําลองการทํางานของระบบเครือขายท่ีมี Node ภายในเครือขาย 5 node ซ่ึงมี source อยู 2 node คือ n0, n1 และ destination อยู 2 node คือ n3, n4 ซ่ึง node n0 มีการสรางการเช่ือมตอโดยใช TCP พรอมท้ังกําหนดใหใช Application เปน FTP โดยกําหนดให node n3 เปน destination ของการเช่ือมตอ สวน node n1 มีการสรางการเช่ือมตอโดยใช UDP พรอมท้ังกําหนดใหใช Application เปน CBR โดยกําหนดให node n4 เปน destination ของการเช่ือมตอ พรอมท้ังยังเก็บ tracefile ไวในไฟลช่ือ traceout.tr เพื่อท่ีจะไฟลดงักลาวมาใชในการสรางกราฟเพื่อวิเคราะหการทํางานของ TCP และ UDP set ns [new Simulator] set tf [open traceout.tr w] $ns trace-all $tf set nf [open out2.nam w] $ns namtrace-all $nf $ns color 1 RED $ns color 2 BLUE set n0 [$ns node] set n1 [$ns node] set r1 [$ns node] set r2 [$ns node] set n3 [$ns node] set n4 [$ns node] $ns duplex-link $n0 $r1 2Mb 2ms DropTail $ns duplex-link $n1 $r1 2Mb 2ms DropTail $ns duplex-link $r1 $r2 1Mb 2ms RED $ns duplex-link $n3 $r2 2Mb 2ms DropTail $ns duplex-link $n4 $r2 2Mb 2ms DropTail

Page 43: Ns2 Tutorial by NECTEC (Thai)

43

$ns duplex-link-op $n0 $r1 orient right-down $ns duplex-link-op $n1 $r1 orient right-up $ns duplex-link-op $r1 $r2 orient right $ns duplex-link-op $r2 $n3 orient right-up $ns duplex-link-op $r2 $n4 orient right-down $ns queue-limit $r1 $r2 10 $ns queue-limit $r2 $r1 10 set tcp_src [new Agent/TCP] $ns attach-agent $n0 $tcp_src set tcp_des [new Agent/TCPSink] $ns attach-agent $n3 $tcp_des $ns connect $tcp_src $tcp_des $tcp_src set fid_ 1 $tcp_src set packetSize_ 552 set ftp [new Application/FTP] $ftp attach-agent $tcp_src $ftp set type_ FTP #Setup a UDP connection set udp_src [new Agent/UDP] $ns attach-agent $n1 $udp_src set udp_des [new Agent/Null] $ns attach-agent $n4 $udp_des $ns connect $udp_src $udp_des $udp_src set fid_ 2 #Setup CBR set cbr [new Application/Traffic/CBR] $cbr attach-agent $udp_src

Page 44: Ns2 Tutorial by NECTEC (Thai)

44

$cbr set packetSize_ 1000 #$cbr set rate_ 0.01Mb $cbr set random_ false $ns at 0.1 "$ftp start" $ns at 1.0 "$cbr start" $ns at 120.0 "$ftp stop" $ns at 120.5 "$cbr stop" $ns at 121.0 "finish" #Tracing a queue set redq [[$ns link $r1 $r2] queue] set tchan_ [open all.q w] $redq trace curq_ $redq trace ave_ $redq attach $tchan_ proc finish {} { global ns nf tchan_ tf set awkCode { { if($1 =="Q" && NF>2) { print $2, $3 >> "temp.q"; set end $2 } else if($1 =="a" && NF>2) print $2, $3 >> "temp.a"; } } set f [open temp.queue w] if { [info exists tchan_] } {

Page 45: Ns2 Tutorial by NECTEC (Thai)

45

close $tchan_ } exec rm -f temp.q temp.a exec touch temp.q temp.a exec awk $awkCode all.q puts $f \"queue exec cat temp.q >@ $f puts $f \n\"avg_queue exec cat temp.a >@ $f close $f $ns flush-trace close $tf close $nf exec xgraph -x time -y queue temp.queue & exec nam out2.nam & exit 0 } $ns run

Page 46: Ns2 Tutorial by NECTEC (Thai)

46

ภาพท่ี 5.1 แสดง Topology ท่ีจําลองการทํางานของระบบเครือขาย

Xgraph ท่ีไดเปนกราฟท่ีแสดงความสัมพนัธระหวางเวลาและqueue length ซ่ึงจากกราฟจะแสดงเสนกราฟท่ีเปรียบเทียบระหวาง Current queue length และ Average queue length

เม่ือตองการที่จะสรางกราฟที่แสดงความสัมพันธระหวาง throughput และ เวลาจะตองมีการคํานวณคา Average Throughput ซ่ึงคาดังกลาวไดมาจากการคํานวณ packet size โดยคาของ packet size ถูกนํามาจาก tracefile ซ่ึงจากการทดลองดังกลาวใช tracefile ท่ีมีช่ือวา traceout.tr ซ่ึงการท่ีจะนําคา packet size ใน tracefile มาคํานวณในท่ีนี้ใชการเขียน script เพื่อท่ีจะดึงคาใน tracefile มาคํานวณซ่ึงภาษาท่ีใชเขียน script คือภาษา perl ในท่ีนี้จะวิเคราะหการทํางานของ throughput ซ่ึงจะวิเคราะหท้ัง Average throughput ของท้ัง Received และ Dropped โดยมองท้ังรูปแบบการทํางานของ TCP และ UDP ซ่ึงการวิเคราะหท่ีไดแบงออกเปน 4 รูปแบบดังนี ้

1. Averaged Received Throughput of TCP 2. Averaged Received Throughput of CBR 3. Averaged Dropped Throughput of TCP 4. Averaged Dropped Throughput of CBR

Page 47: Ns2 Tutorial by NECTEC (Thai)

47

ซ่ึงเม่ือมีการกาํหนดเง่ือนไขท่ีใชใน perl script ตรงตามท่ีตองการแลวก็ทําการสราง output file ท่ีไดจาก perl script นี้เพื่อท่ีจะนํา output file ท่ีไดมาแสดงเปนกราฟโดยใช gnuplot ซ่ึงรูปแบบคําส่ังท่ีใชรัน perl script มีดังนี ้perl <perl script> <trace file> <required node> <granularity> > Output file เม่ือตองการที่จะรัน perl script โดยตองการใหโหนดท่ี 2 เปน required node และมี perl script ช่ือ throughput.pl พรอมท้ังมี tracefile ช่ือ traceout.tr และไดกําหนดให granularity มีคาเปน 1 รวมท้ังต้ังช่ือ output file วา TCP จะตองใชรูปแบบคําส่ังดงันี ้perl throughput.pl traceout.tr 2 1 > TCP เม่ือได output file ท่ีช่ือวา TCP ใหนํา output file ดังกลาวมาเขียนกราฟโดยใช gnuplot เชน gnuplot set size 1,1 set key 60,15000 plot ‘TCP’ w lines 1 1. Averaged Received Throughput of TCP คําส่ังรัน perl script ท่ีวิเคราะห Averaged Received Throughput ของ TCP โดยพิจารณา throughput ท่ีออกจากโหนดท่ี 4 perl throughput.pl traceout.tr 4 1 > TCP Perl Script : throughput.pl $infile=$ARGV[0]; #Argument0 $tonode=$ARGV[1]; #Argument1 $granularity=$ARGV[2]; #Argument2 #we compute how many bytes were transmitted during time interval specified #by granularity parameter in seconds $sum =0; $clock=0; open (DATA,"<$infile")||die "Can't open $infile $!"; while (<DATA>){ @x=split(' '); #column1 is time

Page 48: Ns2 Tutorial by NECTEC (Thai)

48

if ($x[1]-$clock<=$granularity) { #checking if the event corresponds to a reception if($x[0] eq 'r') { #checking if the destination corresponds to 1st argument if($x[3] eq $tonode) { #checking if the packet type is TCP if($x[4] eq 'tcp') { $sum=$sum+$x[5]; } } } } else { $throughput=$sum/$granularity; print STDOUT "$x[1] $throughput\n"; $clock=$clock+$granularity; $sum=0; } } $throughput=$sum/$granularity; print STDOUT "$x[1] $throughput\n"; $clock=$clock+$granularity; $sum=0; close DATA; exit(0);

Page 49: Ns2 Tutorial by NECTEC (Thai)

49

ภาพท่ี 5.2 กราฟท่ีแสดง Averaged Received Throughput of TCP 2. Averaged Received Throughput of CBR คําส่ังรัน perl script ท่ีวิเคราะห Averaged Received Throughput ของ CBR โดยพิจารณา throughput ท่ีออกจากโหนดท่ี 5 perl throughputCBR.pl traceout.tr 5 1 > CBR Perl Script : throughputCBR.pl $infile=$ARGV[0]; #Argument0 $tonode=$ARGV[1]; #Argument1 $granularity=$ARGV[2]; #Argument2 #we compute how many bytes were transmitted during time interval specified #by granularity parameter in seconds $sum =0; $clock=0; open (DATA,"<$infile") ||die "Can't open $infile $!"; while (<DATA>){

Page 50: Ns2 Tutorial by NECTEC (Thai)

50

@x=split(' '); #column1 is time if ($x[1]-$clock<=$granularity) { #checking if the event corresponds to a reception if($x[0] eq 'r') { #checking if the destination corresponds to 1st argument if($x[3] eq $tonode) { #checking if the packet type is CBR if($x[4] eq 'cbr') { $sum=$sum+$x[5]; } } } } else { $throughput=$sum/$granularity; print STDOUT "$x[1] $throughput\n"; $clock=$clock+$granularity; $sum=0; } } $throughput=$sum/$granularity; print STDOUT "$x[1] $throughput\n"; $clock=$clock+$granularity; $sum=0; close DATA; exit(0);

Page 51: Ns2 Tutorial by NECTEC (Thai)

51

ภาพท่ี 5.3 กราฟท่ีแสดง Averaged Received Throughput of CBR

3. Averaged Dropped Throughput of TCP คําส่ังรัน perl script ท่ีวิเคราะห Averaged Dropped Throughput ของ TCP โดยพิจารณา throughput ท่ีออกจากโหนดท่ี 3 perl throughputDTCP.pl traceout.tr 3 1 > DTCP Perl Script : throughputCBR.pl $infile=$ARGV[0]; #Argument0 $tonode=$ARGV[1]; #Argument1 $granularity=$ARGV[2]; #Argument2 #we compute how many bytes were transmitted during time interval specified #by granularity parameter in seconds $sum =0; $clock=0; open (DATA,"<$infile")||die "Can't open $infile $!"; while (<DATA>){

Page 52: Ns2 Tutorial by NECTEC (Thai)

52

@x=split(' '); #column1 is time if ($x[1]-$clock<=$granularity) { #checking if the event corresponds to a dropped if($x[0] eq 'd') { #checking if the destination corresponds to 1st argument if($x[3] eq $tonode) { #checking if the packet type is TCP if($x[4] eq 'tcp') { $sum=$sum+$x[5]; } } } } else { $throughput=$sum/$granularity; print STDOUT "$x[1] $throughput\n"; $clock=$clock+$granularity; $sum=0; } } $throughput=$sum/$granularity; print STDOUT "$x[1] $throughput\n"; $clock=$clock+$granularity; $sum=0; close DATA; exit(0);

Page 53: Ns2 Tutorial by NECTEC (Thai)

53

ภาพท่ี 5.4 กราฟท่ีแสดง Averaged Dropped Throughput of TCP 4. Averaged Dropped Throughput of CBR คําส่ังรัน perl script ท่ีวิเคราะห Averaged Dropped Throughput ของ CBR โดยพิจารณา throughput ท่ีออกจากโหนดท่ี 3 perl throughputDCBR.pl traceout.tr 3 1 > DCBR Perl Script : throughputDCBR.pl $infile=$ARGV[0]; #Argument0 $tonode=$ARGV[1]; #Argument1 $granularity=$ARGV[2]; #Argument2 #we compute how many bytes were transmitted during time interval specified #by granularity parameter in seconds $sum =0; $clock=0; open (DATA,"<$infile")||die "Can't open $infile $!"; while (<DATA>){ @x=split(' ');

Page 54: Ns2 Tutorial by NECTEC (Thai)

54

#column1 is time if ($x[1]-$clock<=$granularity) { #checking if the event corresponds to a dropped if($x[0] eq 'd') { #checking if the destination corresponds to 1st argument if($x[3] eq $tonode) { #checking if the packet type is CBR if($x[4] eq 'cbr') { $sum=$sum+$x[5]; } } } } else { $throughput=$sum/$granularity; print STDOUT "$x[1] $throughput\n"; $clock=$clock+$granularity; $sum=0; } } $throughput=$sum/$granularity; print STDOUT "$x[1] $throughput\n"; $clock=$clock+$granularity; $sum=0; close DATA; exit(0);

Page 55: Ns2 Tutorial by NECTEC (Thai)

55

ภาพท่ี 5.5 กราฟท่ีแสดง Averaged Dropped Throughput of CBR

Page 56: Ns2 Tutorial by NECTEC (Thai)

56

Appendix A: Tcl และ OTcl Programming

Tcl (Tool Common Language) เปนภาษาท่ีมี Syntax ท่ีงาย และสามารถท่ีจะรวมเขากับภาษาอ่ืนไดอยางงายดาย คุณสมบัติของภาษานี้มีดังนี ้

- พัฒนาไดงาย - มีการใชกราฟฟคในการแสดงผล - สามารถใชงานไดกับหลาย ๆ Platforms - มีความยืดหยุนในการรวมกบัภาษาอ่ืน - ใชงาย - เปน Freeware

Basic OTcl Programming

1. การกําหนดคาใหกับตัวแปร ใชคําส่ัง set <ช่ือตัวแปร> <คาท่ีกําหนด> set b 5 (มีความหมายวา b=5)

2. การกําหนดคาจากตัวแปรหนึ่งไปยังอีกตัวแปรหนึ่ง set x $a (หมายถึงให x มีคาเทากับคาในตัวแปร a)

3. การคํานวณทางคณิตศาสตร ใหใชคําส่ัง expression Set x [expr $a+$b] (หมายถึง ให x มีคาเทากับผลรวมของ a และ b)

4. เคร่ืองหมาย # หมายถึงการ comment ถามีเคร่ืองหมายนีอ้ยูหนาบรรทัดใดบรรทดันัน้จะไมถูกนํามาประมวลผล

5. การสราง file set file1 [open <filename> w] กําหนดให file1 เปรียบเสมือน pointer ท่ีช้ีไปยัง file ท่ีสรางข้ึน ซ่ึง w หมายถึงการเขียน file set file1 [open output w]

6. การแสดงผลออกทางหนาจอ คําส่ัง put หมายถึงการแสดงผลออกทางหนาจอ เชน put “Hello world” หมายถึงการแสดงคําวา Hello world ออกทางหนาจอ

7. การ Execute คําส่ังของ Unix

Page 57: Ns2 Tutorial by NECTEC (Thai)

57

ใหพิมพคําวา exec แลวตามดวยคําส่ัง เชน exec xgraph data & 8. โครงสรางของคําส่ัง if

If {เง่ือนไข} { <คําส่ังท่ีตองการประมวลผล> }else{ <คําส่ังท่ีตองการประมวลผล> }

9. โครงสรางของคําส่ัง For Loop for {กําหนดคาเร่ิมตน} {เง่ือนไข} {ปรับปรุงคานิพจน} { <คําส่ังท่ีตองการประมวลผล>

} for {set i 0} {$i <5}{incr i}{ puts “$i” }

จากตัวอยางขางตน set i 0 คือการกําหนดคาเร่ิมตนให i = 0 วงเล็บท่ี 2 คือการกําหนดเง่ือนไขโดยให i < 5 วงเล็บท่ี 3 คือการเพ่ิมคาให i ท่ีละ 1

10. การสราง procedure Proc <procedure name> { parameter} { <command> return $something }

11. การสราง Class - จะใชคําเฉพาะ(Reserved word) คือคําวา Class <class name> - เม่ือตองการสราง method ของ class ใหใชคําวา instproc นําหนาช่ือ method - เม่ือตองการสราง constructor ใหใชคําวา init - เม่ือตองการสราง pointer ท่ีช้ีตัวมันเองใหใชคําวา self - ถาตองการประกาศตัวแปรท่ีเปน instance ของ OTcl ใหใชคําวา instvar - เม่ือตองการที่จะทําการ inherit class ใหใชคําวา superclass เพื่อบอกวา class ท่ีมีคํา วา superclass นําหนานั้นเปน class ของบรรพบุรุษ

Page 58: Ns2 Tutorial by NECTEC (Thai)

58

Commands evaluation

รูปแบบประโยคของคําส่ังใน TCL Script : command arg1 arg2 arg3 …. ตัวประมวลคําส่ังภายใน TCL Script จะพิจารณาคําแตละคําภายในรูปแบบของประโยคคําส่ัง และ

หลังจากการประมวลผลคําดวย Interpreter แลว คําแรกของประโยค [command] จะถูกพิจารณาถึง function ท่ีไดถูกเรียกมาใชเพื่อการ execute โดยจะมี arguments ท่ีถูกนํามาประมวลผลคือคําท่ีตามมาหลังจาก argument แรกของประโยคคําส่ัง ในการประมวลผลแถบคําส่ังจะมีการแทนท่ีคําดวยหลักการดังตอไปนี้

- หากคํานั้นถูกลอมรอบดวย “ ” คํา ๆ นั้นจะถูกแทรกดวย spaces และ carriage return - หากคํานั้นถูกลอมรอบดวย { } คํา ๆ นั้นจะไมมีผลตอการแสดงของโปรแกรม โดย

ภายใต { } จะเปรียบเสมือนกับท่ีอยูหรือท่ีรวมคําส่ังของ TCL Script - ถาสวนหนึ่งของคํา ๆ นั้นถูกลอมรอบดวย [ ] ในสวนนั้นจะถูกพิจารณาเปนประโยคคําส่ัง

ซ่ึงขอความท่ีอยูในวงเล็บนั้นจะเปนพวก Tcl command - ในทุก ๆ String จะถูกเร่ิมตนดวย $ ซ่ึงเปนตัวชวยบอกใหรูถึงการแสดงออกถึงความเปน String

ของตัวแปรนั้น ๆ

Examples : - set a “World!”

ในการประมวลผลแถบคําส่ังนี้แบงออกเปน 3 arguments โดยคําท่ีถูกลอมรอบดวย “ ” จะถูกตัดออกจากการพิจารณา และตัวแรกของประโยคคือ command ท่ีทําการ execute ดวย arguments ตอมานั้นคือ a และ “World!” และความหมายจากประโยคนี้คือการกําหนดตัวแปร a ใหมีคาคือ ‘World!’

- set b “Hello $a” จะทําการ set คาตัวแปร b ใหมีคา “Hello World” โดยการแทนท่ี $a ดวยคา ‘World!’

- set c [string range $b 0 3] ในสวนของ [ ] จะถูกทําการประมวลผลโดยในสวนนี้เปนสวนท่ีแทนคาของตัวแปร b ต้ังแตตําแหนง 0 ถึง 3 นั่นคือคา “Hell”

Strings and Lists

TCL Script เม่ือมีการจัดเก็บคาขอมูลในตัวแปรคาท่ีไดจะเปน String และถาตองการเก็บตัวเลขในตัวแปร คาตัวเลขท่ีไดนั้นจะถูกแปลงเปน string List เปน type พิเศษของ String โดยมีหลักการทํางานคือจะแบงขอมูลคํานั้นออกเปนสวน ๆ โดยการเช็คดวย space

Page 59: Ns2 Tutorial by NECTEC (Thai)

59

Example : set simple_list "John Joe Mary Susan" puts [lindex $simple_list 0] puts [lindex $simple_list 2] Output: John Mary

Mathematics expression

เนื่องจากวาการเก็บคาภายในตัวแปรนั้นจะเปน String ท้ังหมด แตวาในการคํานวณทาง Mathematics นั้นตองใช float หรือ integer เพราะฉะนั้นเราจึงตองมี command สําหรับการคํานวณทาง Mathematics นั่นคือคําส่ังของการ expression นั่นคือ ‘expr’

Example :

% set result [expr (4+6)/4] 2 % set result [expr (4.0+6)/4] 2.5 How to display something ?

ในการแสดง String จําเปนตองใชคําส่ัง puts

Example :

% set variable 255 % puts "The number $variable" Output : The number 255 % puts [format "The number %d is equal to 0x%02X" \ $variable $variable] Output : The number 255 is equal to 0xFF

Page 60: Ns2 Tutorial by NECTEC (Thai)

60

Control flow ในทุก ๆ สวนของ command เหลานี้นั้นเหมือนกับในภาษา C หากมีท่ีแตกตางเพียงตัวเดียว นั่นคือ foreach

• if {...condition...} {...body...} • while {...condition...} {body} • for {... init ...} {...condition...} {...increment...} {...body...} • foreach varnames {...list...} {...body...}

ภายในสวนของ Condition มีการถูกแทนท่ีดวย expr ท้ังนี้เพื่อใชในการเปรียบเทียบขอมูลซ่ึงมีลักษณะเปนคาตัวเลข

Examples While Loop :

% while {$i<4} { > puts "$i*$i is [expr $i*$i]" > incr i > } Output : 0*0 is 0 1*1 is 1 2*2 is 4 3*3 is 9

Example For Loop :

% for {set i 0} {$i<4} {incr i} { > puts "$i*$i is [expr $i*$i]" > } Output : 0*0 is 0 1*1 is 1 2*2 is 4 3*3 is 9

Page 61: Ns2 Tutorial by NECTEC (Thai)

61

Example Foreach :

% set observations \ {Bruxelles 15 22 London 12 19 Paris 18 27} Bruxelles 15 22 London 12 19 Paris 18 27 % foreach {town Tmin Tmax} $observations { > set Tavg [expr ($Tmin+$Tmax)/2.0] > puts "$town $Tavg" > } Output : Bruxelles 18.5 London 15.5 Paris 22.5 Array เปนอีกทางหน่ึงท่ีใชในการจัดกลุมของขอมูลใน TCL Script โดยเราสามารถสรางใหมีลักษณะคลายกับภาษา C ก็ได แตหากสามารถใช associative arrays ไดดวย ดังตัวอยาง

Example :

set myarray(0) "Zero" set myarray(1) "One" set myarray(2) "Two" for {set i 0} {$i < 3} {incr i 1} { puts $myarray($i) }

Output:

Zero

One

Two

Page 62: Ns2 Tutorial by NECTEC (Thai)

62

Example :

set person_info(name) "Fred Smith" set person_info(age) "25" set person_info(occupation) "Plumber" foreach thing {name age occupation} { puts "$thing == $person_info($thing)" }

Output:

name = Fred Smith

age = 25

occupation = Plumber

Procedures

มีการแทนท่ีฟงกชันยอยซ่ึงลักษณะคลายกับภาษา C

Example :

% proc sum2 {a b} { > return [expr $a+$b] > }

และในการเรียกใชฟงกชัน sum2 สามารถทําการเรียกไดโดย

% sum2 12 5 Output : 17

ใน argument พิเศษท่ีมีช่ือวา args นั้นจะบรรจุลิสตซ่ึงเปนท่ีพักของ arguments ตาง ๆ อาจเห็นไดดังตัวอยางนี้

Example :

Page 63: Ns2 Tutorial by NECTEC (Thai)

63

% proc sum {args} { > set result 0 > foreach n $args { > set result [expr $result+$n] > } > return $result > } % sum 12 9 6 4 Output : 31 หากไมมีการใสคาของ argument จะมีการใสคา default ลงไปให

Example :

% proc count {start end {step 1}} { > for {set i $start} {$i<=$end} {incr i $step} { > puts $i > } > } % count 1 3 Output : 1 2 3 นอกจากน้ันเราสามารถประกาศตัวแปร global ภายใน TCL Script ไดดังตัวอยาง ดังตอไปน้ี

Example :

% set global_counter 3 % proc incr_counter {} { > global global_counter > incr global_counter

Page 64: Ns2 Tutorial by NECTEC (Thai)

64

> } % incr_counter Output : 4 % set global_counter Output : 4 Eval

คําสั่ง eval - ทําการรวม arguments ทั้งหมดเขาไปในหน่ึง String - ทําการแบง String น้ัน ๆ ออกเปน arguments ยอย ๆ ดวยการหาที่วางระหวาง space เปนตัวแบงแยก - ทําการประเมินผล substring ยอย ๆ เหลาน้ันใหเปน command

Example :

set foo "set a 22" eval $foo puts $a

Output : 22

Input/Output

Input และ output operation ภายใน TCL นั้นมีสวนประกอบหลักดวยคําส่ัง puts และ gets โดยคําส่ัง puts คือการแสดงผลออกมา และคําส่ัง gets คือการรอรับการ input จาก user

Example :

puts -nonewline "Enter your name: " set bytesread [gets stdin name] puts "Your name is $name, and it is $bytesread bytes long"

Page 65: Ns2 Tutorial by NECTEC (Thai)

65

Output :

Enter your name: Shyam

Your name is Shyam, and it is 5 bytes long

และสามารถติดตอกับไฟลไดโดยศึกษากับตัวอยางดังตอไปนี้

Example :

set f [open "/tmp/myfile" "w"] puts $f "We live in Texas. It's already 110 degrees out here." puts $f "456" close $f

Output: (none)

Example :

set f [open "/tmp/myfile" "r"] set line1 [gets $f] set len_line2 [gets $f line2] close $f puts "line 1: $line1" puts "line 2: $line2" puts "Length of line 2: $len_line2"

Output:

line 1: We live in Texas. It's already 110 degrees out here.

line 2: 456

Length of line 2: 3

Page 66: Ns2 Tutorial by NECTEC (Thai)

66

Example code Basic Tcl

Basic OTcl

จาก code ขางตนมีการเรียกฟงกช่ัน greet ของ mom กอนจึงแสดงผลการทํางานท่ีไดจากฟงกช่ัน greet ของ mom ออกมากอนและตอมาไดมีการเรียกฟงกช่ัน greet ของ kid เพราะฉะนั้น

Class Mom Mom instproc greet {} { $self instvar age_ puts “$age_ years old mom:

How are you doing?” } Class Kid -superclass Mom Kid instproc greet {} { $self instvar age_ puts “$age_ years old kid:

What’s up, dude?” }

สราง Procedure ที่ช่ือวา test แลวมีการ set คาให a = 43, b = 27, c = a+b , d = (a-b)*c แลวมีการใช Loop for วน 10 รอบ ซึ่งใน loop for มีคําสั่ง if ซึ่งมีอยู 2 กรณีคือถา คา k < 5 จะทําการกําหนดคาของ d ยกกําลัง k ใหกับตัวแปร pow อีกกรณีคือถา k>=5 จะกําหนดคาของ d mod k ใหกับตัวแปร mod

set mom [new Mom] $mom set age_ 45 set kid [new Kid] $kid set age_ 15 $mom greet $kid greet

จาก Code ขางตนเปนการสราง class 2 class ซึ่ง class แรกมีช่ือวา Mom และมีฟงกช่ันช่ือ greet ซึ่งในฟงกช่ันมีการรับคาจากตัวแปร age_ แลวมีการใชคําสั่ง put เพ่ือที่จะแสดงผลออกทางหนาจอ อีก class มีช่ือวา Kid ซึ่งมี class Momเปน ancestor

Set mom [new Mom] เปนการสรางตัวแทนของ class Mom แลว set ใหตัวแปร age_ = 45 Set kid [new Kid ] เปนการสรางตัวแทนของ class Kid แลว set ใหตัวแปร age_ = 15 แลวทําการเรียกฟงกช่ัน greet ของ mom และ kid

Page 67: Ns2 Tutorial by NECTEC (Thai)

67

ผลลัพธท่ีไดจากการทํางานของ kid นั้นจึงอยูหลังจากผลลัพธของการทํางานของ mom ซ่ึงผลลัพธท่ีไดเปนดังตอไปนี้

Output : 45 years old mom: How are you doing? 15 years old kid: What’s up,dude?

Page 68: Ns2 Tutorial by NECTEC (Thai)

68

Appendix B: อธิบายตัวอยาง ns-simple.tcl #Create a simulator object #เปนการสราง object ของ NS simulator และใหคากับตัวแปร ns set ns [new Simulator]

#Define different colors for data flows (for NAM) #เปนการกําหนดสีของตัวขอมูลในท่ีนี้ใหfid 1 = สีฟาและfid 2 = สีแดง $ns color 1 Blue $ns color 2 Red

#Open the NAM trace file #เปนการเปด file ท่ีช่ือ out.nam เพื่อทําการ trace ขอมูลลงใน out.nam set nf [open out.nam w] $ns namtrace-all $nf

#Define a 'finish' procedure #เปนการสราง Procedure finish เพื่อท่ีจะใสคําส่ังท่ีปดการทํางานของ NAM รวมท้ัง execute nam เพื่อท่ีจะไดสามารถแสดงผลของการจําลองการทํางานของ Network ออกมาในรูปแบบของ Graphic

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 & เปนคําส่ังท่ีใชในการ execute nam exit 0 }

#Create four nodes

Page 69: Ns2 Tutorial by NECTEC (Thai)

69

#เปนคําส่ังท่ีใชในการสราง node ซ่ึงในตัวอยางนี้มีการสราง node ท้ังหมด 4 node set n0 [$ns node] สราง node ท่ีช่ือ n0 set n1 [$ns node] สราง node ท่ีช่ือ n1 set n2 [$ns node] สราง node ท่ีช่ือ n2 set n3 [$ns node] สราง node ท่ีช่ือ n3

#Create links between the nodes #เปนการสราง link ระหวาง node รูปแบบของคําส่ัง คือ $ns duplex-link $n0 $n2 <bandwidth> <delay> <queue_type> <queue_type> : DropTail, RED, etc. $ns duplex-link $n0 $n2 2Mb 10ms DropTail เปนการสราง link ระหวาง n0 และ n2 ซ่ึงมีการใช banwidth = 2 Mb delay time = 10 ms และมี queue_type เปนแบบ 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 #เปนการกําหนดขนาดของ queue ท่ีเก็บ packet ระหวาง node n2 และ n3 $ns queue-limit $n2 $n3 10

#Give node position (for NAM) #เปนการกําหนดตําแหนงของ node วา node ตัวไหนอยู ณ ตําแหนงใดของ node ตัวไหน และบอกวาระหวางแตละ node มีการสงขอมูลแบบท้ังไปและกลับ (duplex-link) $ns duplex-link-op $n0 $n2 orient right-down แสดงวา n2 อยูทางดานขวาลางของ n0 $ns duplex-link-op $n1 $n2 orient right-up แสดงวา n2 อยูทางดานขวาบนของ n1 $ns duplex-link-op $n2 $n3 orient right แสดงวา n3 อยูทางดานขวาของ n2

#Monitor the queue for link (n2-n3). (for NAM) # เปนการกําหนดวาใหแสดง queue ท่ีเก็บ packet ท่ีอยูระหวาง n2 และ n3 แสดงออกทางหนาจอในชวงเวลาท่ี 0.5 $ns duplex-link-op $n2 $n3 queuePos 0.5 #Setup a TCP connection set tcp [new Agent/TCP] เปนการสราง TCP connection โดยกําหนดคาใหตัวแปรช่ือ tcp

Page 70: Ns2 Tutorial by NECTEC (Thai)

70

$tcp set class_ 2 $ns attach-agent $n0 $tcp เปนการกําหนดให tcp ทํางานอยูบน node n0 set sink [new Agent/TCPSink] เปนการสราง TCPSink โดยกําหนดคาใหตัวแปรช่ือ sink เพื่อท่ีจะเปนปลายทาง $ns attach-agent $n3 $sink เปนการกําหนดให sink ทํางานอยูบน node n3 $ns connect $tcp $sink เปนการสราง connection ระหวาง tcp และ sink $tcp set fid_ 1 เปนการบอกวาเสนทางการเดินทางของ tcp ตามท่ีไดกําหนดไวนั้นใหแสดงโดยใชสีน้ําเงิน (1 = สีน้ําเงิน)

#Setup a FTP over TCP connection set ftp [new Application/FTP] เปนการสราง FTP Applicationโดยกําหนดคาใหกับตัวแปรช่ือ ftp $ftp attach-agent $tcp เปนการกําหนดให ftp ทํางานอยูบน TCP connection ท่ีกําหนดคาใหกับตัวแปร tcp $ftp set type_ FTP

#Setup a UDP connection set udp [new Agent/UDP] เปนการสราง UDP Agent โดยกําหนดคาใหกับตัวแปรช่ือ udp $ns attach-agent $n1 $udp เปนการกําหนดให udp ทํางานอยูบน node n1 set null [new Agent/Null] เปนการสราง Null Agent โดยกําหนดคาใหกับตัวแปรช่ือ null $ns attach-agent $n3 $null เปนการกําหนดให null ทํางานอยูบน node n3 $ns connect $udp $null เปนการสราง connection ระหวาง udp ท่ีอยูบน n1 กับ null ท่ีอยูบน n3 $udp set fid_ 2 เปนการบอกวาเสนทางการเดินทางของ udp ตามท่ีไดกําหนดไวนั้นใหแสดงโดยใชสีแดง (2 = สีแดง)

#Setup a CBR over UDP connection #การสราง CBR Traffic โดยกําหนดคาใหกับตัวแปรช่ือ cbr โดยมีขนาด Packet Size = 1000 และมีอัตราการสง packet = 1 mb set cbr [new Application/Traffic/CBR] $cbr attach-agent $udp เปนการกําหนดให cbr อยูบน udp $cbr set type_ CBR $cbr set packet_size_ 1000 เปนการกําหนดขนาดของ packet ใหมีขนาด 1000 $cbr set rate_ 1mb $cbr set random_ false #Schedule events for the CBR and FTP agents

Page 71: Ns2 Tutorial by NECTEC (Thai)

71

$ns at 0.1 "$cbr start" กําหนดให cbr เร่ิมทํางาน ณ เวลา 0.1 $ns at 1.0 "$ftp start" กําหนดให ftp เร่ิมทํางาน ณ เวลา 1.0 $ns at 4.0 "$ftp stop" กําหนดให ftp หยุดทํางาน ณ เวลา 4.0 $ns at 4.5 "$cbr stop" กําหนดให cbr หยุดทํางาน ณ เวลา 4.5

#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" เปนการเรียก Procedure finish ณ เวลา 5.0

#Print CBR packet size and interval puts "CBR packet size = [$cbr set packet_size_]" เปนการแสดงขอความออกบนหนาจอโดยใชคําส่ัง puts puts "CBR interval = [$cbr set interval_]"

#Run the simulation $ns run เปนการส่ัง run simulation

ซ่ึงเม่ือโปรแกรม NS-2 ทํางานตามตัวอยางขางตนจะปรากฎ Network topology ดังตอไปนี้

ภาพท่ี 2.18 แสดง Network topology ท่ีไดจากการเขียน Otcl Script

ตัวอยาง Script ns-simple.tcl [1] Download ไดท่ี http://nile.wpi.edu/NS/simple_ns.html

Page 72: Ns2 Tutorial by NECTEC (Thai)

72

บรรณานุกรม 1. Tcl Tutorial : http://users.belgacom.net/bruno.champagne/tcl.html 2. Introduction to Tcl : http://hegel.ittc.ku.edu/topics/tcltk/tutorial-noplugin.html 3. http://www.welzl.at/research/tools/ns/welzl-ns-tutorial-6.pdf 4. NS Tutorial : http://www-sop.inria.fr/maestro/personnel/Eitan.Altman/COURS-NS/n3.pdf 5. Network Simulator : http://www.isi.edu/nsnam/ns/ 6. NS Example : http://nile.wpi.edu/NS/ 7. NS Source : http://www.isi.edu/nsnam/ns/ns-build.html 8. http://www.cs.ucsd.edu/classes/wi01/cse222/projects/mid-tutorial.html 9. NS XGraph : http://www.isi.edu/nsnam/ns/tutorial/index.html 10. ตัวอยาง code http://nile.wpi.edu/NS/simple_ns.html