В данном примере будет разобрано построение простого двухузлового беспроводного сценария. Подвижные узлы движутся по площади, площадь которой 500*500 м2. Узлы начинают свое движение с противоположных концов. Они движутся навстречу друг другу в первой половине симуляции и в противоположных направлениях во второй. Между ними при этом устанавливается TCP соединение. Пакеты пересылаются между узлами, когда они находятся в зоне радиопокрытия. Когда они расходятся на большое расстояние, пакеты начинают теряться.

Подвижный узел состоит из следующих компонентов: Канальный Уровень, Интерфейс Очереди, MAC уровень, беспроводной канал. Перед началом симуляции необходимо определить их параметры. Кроме того, необходимо задать и другие параметры, такие как тип антенны, модель радиораспространения, тип протокола маршрутизации ad-hoc, используемый подвижными узлами и т.д. Их краткое описание указано в комментариях:

# ======================================================================

# Define options

# ======================================================================

set val(chan)         Channel/WirelessChannel  ;# channel type

set val(prop)         Propagation/TwoRayGround ;# radio-propagation model

set val(ant)          Antenna/OmniAntenna      ;# Antenna type

set val(ll)           LL                       ;# Link layer type

set val(ifq)          Queue/DropTail/PriQueue  ;# Interface queue type

set val(ifqlen)       50                       ;# max packet in ifq

set val(netif)        Phy/WirelessPhy          ;# network interface type

set val(mac)          Mac/802_11               ;# MAC type

set val(rp)           DSDV                     ;# ad-hoc routing protocol

set val(nn)           2                        ;# number of mobilenodes

Теперь можно перейти к главной части программы:

set ns_    [new Simulator]

Затем создадим файл трассировки и используем для него функцию trace-all:

set tracefd     [open simple.tr w]

$ns_ trace-all $tracefd

Затем создадим объект топологии, который хранит пути передвижения подвижных узлов внутри заданной границы:

set topo           [new Topography]

Так как в данном примере подвижные узлы передвигаются внутри топологии 500 на 500 м, то зададим объекту координаты X и Y:

$topo load_flatgrid 500 500

Топография разбивается на сетки, и значения разрешения  сетки по умолчанию равно 1. Другое значение может быть задано третьим параметром предыдущей функции.

Далее создадим объект God:

create-god $val(nn)

God (General Operations Director) – это объект, который используется для хранения глобальной информации о состоянии среды, сети или узлов, которые хотелось бы иметь, но которые не должны быть известны любому участнику симуляции. Фактически, God хранит общее число подвижных узлов и таблицу с наименьшим числом скачков, требуемых для перехода от одного узла к другому.

Из-за простоты данного примера нам не нужна информация о скачках, однако поскольку  God объект объявлен внутри MAC объектов на подвижных узлах, мы должны создать God.

Далее необходимо создать подвижные узлы. Для начала, необходимо сконфигурировать узлы. Конфигурирование узлов API (Applications Programming Interface – интерфейс взаимодействия между транспортным агентом и приложением) состоит из определения типа адресации, типа протокола маршрутизации, канального уровня, MAC уровня. Например:

(parameter examples)

# $ns_ node-config -addressingType flat or hierarchical or expanded

#                  -adhocRouting   DSDV or DSR or TORA

#                  -llType       LL

#                  -macType              Mac/802_11

#                  -propType              "Propagation/TwoRayGround"

#                  -ifqType     "Queue/DropTail/PriQueue"

#                  -ifqLen       50

#                  -phyType    "Phy/WirelessPhy"

#                  -antType    "Antenna/OmniAntenna"

#                  -channelType    "Channel/WirelessChannel"

#                  -topoInstance   $topo

#                  -energyModel    "EnergyModel"

#                  -initialEnergy  (in Joules)

#                  -rxPower        (in W)

#                  -txPower        (in W)

#                  -agentTrace     ON or OFF

#                  -routerTrace    ON or OFF

#                  -macTrace       ON or OFF

#                  -movementTrace  ON or OFF

Все значения параметров по умолчанию нулевые, кроме: addressingType: flat.

Конфигурация API для создания подвижных узлов в данном случае выглядит следующим образом:

# Configure nodes

        $ns_ node-config -adhocRouting $val(rp) \

                         -llType $val(ll) \

                         -macType $val(mac) \

                         -ifqType $val(ifq) \

                         -ifqLen $val(ifqlen) \

                         -antType $val(ant) \

                         -propType $val(prop) \

                         -phyType $val(netif) \

                         -topoInstance $topo \

                         -channelType $val(chan) \

                         -agentTrace ON \

                         -routerTrace ON \

                         -macTrace OFF \

                         -movementTrace OFF

Далее создадим два подвижных узла:

for {set i 0} {$i < $val(nn) } {incr i} {

                set node_($i) [$ns_ node ]

                $node_($i) random-motion 0       ;# disable random motion

        }   

Рандомное передвижение отключено, так как ниже следует задать параметры передвижения (скорость и направление).

Зададим начальные координаты:

#

# Provide initial (X,Y, for now Z=0) co-ordinates for node_(0) and node_(1)

#

$node_(0) set X_ 5.0

$node_(0) set Y_ 2.0

$node_(0) set Z_ 0.0

 

$node_(1) set X_ 390.0

$node_(1) set Y_ 385.0

$node_(1) set Z_ 0.0

Узел 0 стартует из точки с координатами (5,2), а узел 1 – (390, 385).

Произведем некоторые передвижения узла:

#

# Node_(1) starts to move towards node_(0)

#

$ns_ at 50.0 "$node_(1) setdest 25.0 20.0 15.0"

$ns_ at 10.0 "$node_(0) setdest 20.0 18.0 1.0"

 

# Node_(1) then starts to move away from node_(0)

$ns_ at 100.0 "$node_(1) setdest 490.0 480.0 15.0"

Так $ns_ at 50.0 "$node_(1) setdest 25.0 20.0 15.0" означает, что при достижении времени симуляции 50 мс, узел 1 начнет двигаться в точку с координатами (25, 20) со скоростью 15 м/с.

Далее установим поток трафика между узлами:

# TCP connections between node_(0) and node_(1)

 

set tcp [new Agent/TCP]

$tcp set class_ 2

set sink [new Agent/TCPSink]

$ns_ attach-agent $node_(0) $tcp

$ns_ attach-agent $node_(1) $sink

$ns_ connect $tcp $sink

set ftp [new Application/FTP]

$ftp attach-agent $tcp

$ns_ at 10.0 "$ftp start"

Эти строки устанавливают TCP соединение между узлами с источником TCP трафика, находящимся в узле 0.

Затем необходимо определить время окончания симуляции и дать команду подвижным узлам перезагрузиться, которая перезагрузит их внутренние сетевые компоненты.

#

# Tell nodes when the simulation ends

#

for {set i 0} {$i < $val(nn) } {incr i} {

    $ns_ at 150.0 "$node_($i) reset";

}

$ns_ at 150.0001 "stop"

$ns_ at 150.0002 "puts \"NS EXITING...\" ; $ns_ halt"

proc stop {} {

    global ns_ tracefd

    close $tracefd

}

На 150-й секунде симуляция прекратится. Узлы перезагрузятся в это время и вызовется переменная $ns_ halt на 150.0002  секунде, немного позже перезагрузки узлов.

Остается только добавить команду начала симуляции:

puts "Starting Simulation..."

$ns_ run

 

         Результатом симуляции такой модели будет создание файла трассировки simple.tr. Если мы обратимся к графе AgentTrace/RouterTrace, мы увидим DSDV (DSDV - Destination Sequence Distance Vector – протокол маршрутизации, при котором узлы, находящиеся в пределах зоны радиопокрытия друг друга, обмениваются сообщениями маршрутизации) сообщения маршрутизации и TCP пакеты, принимаемые и отправляемые маршрутизатором и агентом в узле 0 и 1.

         s 0.029290548 _1_ RTR  --- 0 message 32 [0 0 0 0] ------- [1:255 -1:255 32 0]

s 1.119926192 _0_ RTR  --- 1 message 32 [0 0 0 0] ------- [0:255 -1:255 32 0]

Мы видим, что на 10 секунде поток TCP пакетов отправляется из узла 0. Первоначально оба узла слишком удалены друг от друга, и эти пакеты удаляются из узла 0, но не достигают узла 1. Примерно на 81-й секунде между узлами начинается обмен информацией    маршрутизации, и примерно на 100-й секунде можно увидеть первый пакет, принятый агентом узла 1, который отправляет подтверждение ACK обратно узлу 0 и таким образом, устанавливается TCP соединение.

r 100.001596889 _1_ AGT  --- 3824 tcp 1060 [13a 1 0 800] ------- [0:0 1:0 32 1] [1908 0] 1 0

s 100.001596889 _1_ AGT  --- 3855 ack 40 [0 0 0 0] ------- [1:0 0:0 32 0] [1908 0] 0 0

r 100.001596889 _1_ RTR  --- 3855 ack 40 [0 0 0 0] ------- [1:0 0:0 32 0] [1908 0] 0 0

s 100.001596889 _1_ RTR  --- 3855 ack 60 [0 0 0 0] ------- [1:0 0:0 32 0] [1908 0] 0 0

r 100.003680943 _0_ AGT  --- 3851 ack 60 [13a 0 1 800] ------- [1:0 0:0 32 0] [1906 0] 1 0

s 100.003680943 _0_ AGT  --- 3856 tcp 1040 [0 0 0 0] ------- [0:0 1:0 32 0] [1926 0] 0 0

r 100.003680943 _0_ RTR  --- 3856 tcp 1040 [0 0 0 0] ------- [0:0 1:0 32 0] [1926 0] 0 0

s 100.003680943 _0_ RTR  --- 3856 tcp 1060 [0 0 0 0] ------- [0:0 1:0 32 1] [1926 0] 0 0

r 100.006105016 _0_ AGT  --- 3853 ack 60 [13a 0 1 800] ------- [1:0 0:0 32 0] [1907 0] 1 0

s 100.006105016 _0_ AGT  --- 3857 tcp 1040 [0 0 0 0] ------- [0:0 1:0 32 0] [1927 0] 0 0

r 100.006105016 _0_ RTR  --- 3857 tcp 1040 [0 0 0 0] ------- [0:0 1:0 32 0] [1927 0] 0 0

s 100.006105016 _0_ RTR  --- 3857 tcp 1060 [0 0 0 0] ------- [0:0 1:0 32 1] [1927 0] 0 0

r 100.016129071 _1_ AGT  --- 3825 tcp 1060 [13a 1 0 800] ------- [0:0 1:0 32 1] [1909 0] 1 0

s 100.016129071 _1_ AGT  --- 3858 ack 40 [0 0 0 0] ------- [1:0 0:0 32 0] [1909 0] 0 0

r 100.016129071 _1_ RTR  --- 3858 ack 40 [0 0 0 0] ------- [1:0 0:0 32 0] [1909 0] 0 0

s 100.016129071 _1_ RTR  --- 3858 ack 60 [0 0 0 0] ------- [1:0 0:0 32 0] [1909 0] 0 0

r 100.026133146 _1_ AGT  --- 3827 tcp 1060 [13a 1 0 800] ------- [0:0 1:0 32 1] [1910 0] 1 0

Однако как только узлы начинают удаляться друг от друга, соединение разрывается примерно на 116-й секунде, и пакеты начинают пропадать.

s 116.002082380 _1_ AGT  --- 6430 ack 40 [0 0 0 0] ------- [1:0 0:0 32 0] [3202 0] 0 0

r 116.002082380 _1_ RTR  --- 6430 ack 40 [0 0 0 0] ------- [1:0 0:0 32 0] [3202 0] 0 0

s 116.002082380 _1_ RTR  --- 6430 ack 60 [0 0 0 0] ------- [1:0 0:0 32 0] [3202 0] 0 0

r 116.005616463 _0_ AGT  --- 6396 ack 60 [13a 0 1 800] ------- [1:0 0:0 32 0] [3185 0] 1 0

s 116.005616463 _0_ AGT  --- 6431 tcp 1040 [0 0 0 0] ------- [0:0 1:0 32 0] [3205 0] 0 0

r 116.005616463 _0_ RTR  --- 6431 tcp 1040 [0 0 0 0] ------- [0:0 1:0 32 0] [3205 0] 0 0

s 116.005616463 _0_ RTR  --- 6431 tcp 1060 [0 0 0 0] ------- [0:0 1:0 32 1] [3205 0] 0 0

Подробное содержание файла трассировки было изложено в примере 1.

Список литературы:

1. http://www.isi.edu/nsnam/ns/tutorial/index.html

2. http://www.isi.edu/nsnam/ns/doc/ns_doc.pdf