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

Для комбинированного сценария мы собираемся создать 2 проводных узла W0 и W1, присоединенных к нашему беспроводному домену, состоящему из 3 беспроводных узлов (0, 1, 2) через базовую станцию, БС. Базовые станции напоминают шлюзы между проводными и беспроводными доменами и позволяют обмениваться пакетами между двумя типами узлов.

Начнем с проверки изменений, которые необходимо внести в список переменных из предыдущего примера. Протокол Adhoc маршрутизации изменяется на DSDV. Также установим CBR и TCP соединения между узлами непосредственно в скрипте. Также изменим время симуляции. Заметим, что будем использовать массив opt() вместо val() просто, чтобы показать, что это больше не глобальная переменная-массив, и сфера ее применения определяется только в тестовом скрипте.

set opt(adhocRouting)   DSDV

set opt(cp)       ""       ;# cp file not used

set opt(stop)   300      ;# time to stop simulation

Установим время начала для TCP потоков:

set opt(ftp1-start)      160.0

set opt(ftp2-start)      170.0

Также добавим следующие строки, чтобы установить число проводных узлов и базовых станций:

set num_wired_nodes      2

set num_bs_nodes         1

Теперь главная часть программа. Для комбинированных симуляций необходимо использовать иерархическую маршрутизацию, чтобы маршрутизировать пакеты между беспроводным и проводным доменами. Информация о маршрутизации для проводных узлов основана на связи топологии, т.е. в зависимости от того как узлы соединены каналом. Эта информация о связности используется для заполнения перенаправляющих таблиц на каждом проводном узле. Однако беспроводные узлы не имеют понятия о связи. В беспроводной топологии пакеты маршрутизируются, используя их протоколы adhoc маршрутизации, которые строят перенаправляющие таблицы путем обмена запросами маршрутизации между соседями. Так в порядке обмена пакетами между этими проводными и беспроводными узлами, мы используем базовые станции, которые действуют как шлюзы между двумя доменами. Мы разделим проводные и беспроводные узлы путем помещения их в разные домены. Домены или субдомены (или кластеры) определены посредством иерархической топологической структуры, как показано ниже. После строки "set ns [new Simulator]" добавим следующие строки:

$ns_ node-config -addressType hierarchical   

AddrParams set domain_num_ 2           ;# number of domains

lappend cluster_num 2 1                ;# number of clusters in each

                                       ;#domain

AddrParams set cluster_num_ $cluster_num

lappend eilastlevel 1 1 4              ;# number of nodes in each cluster

AddrParams set nodes_num_ $eilastlevel ;# for each domain

В этих строках мы сначала настраиваем объект-узел, чтобы иметь тип адреса иерархический. Затем устанавливается иерархическая топология. Число доменов в топологии – 2 (один для проводных узлов и один для беспроводных). Число кластеров в каждом из этих доменов обозначено как 2 1, что показывает, что в первом домене (проводном) 2 кластера, а во втором (беспроводном) 1. Следующая строка определяет число узлов в каждом кластере 1 1 4, т.е. один узел в каждом из 2 проводных кластеров и 4 узла в кластере беспроводного домена. Таким образом, топология определяется 3 уровнями.

Далее установим трассировку для симуляции. Заметим, что для проводного с беспроводным сценария, трассировка может быть сгенерирована для обоих доменов. Обе трассировки записываются в выходной файл, обозначенный как wireless2-out.tr. Для их различения все беспроводные трассировки начинаются с WL. Также установим трассировку nam.

set tracefd  [open wireless2-out.tr w]

set namtrace [open wireless2-out.nam w]

$ns_ trace-all $tracefd

$ns_ namtrace-all-wireless $namtrace $opt(x) $opt(y)

Затем необходимо создать проводные, беспроводные и базовый узлы. Заметим, что для созданий узлов вы должны пройти иерархические адреса узлов. После строки create-god $opt(nn), добавим следующее:

# create wired nodes

set temp {0.0.0 0.1.0}           ;# hierarchical addresses to be used

for {set i 0} {$i < $num_wired_nodes} {incr i} {

    set W($i) [$ns_ node [lindex $temp $i]]

}

Чтобы создать узел базовой станции, необходимо настроить узловую структуру, как это показано ниже. Это часть нового узлового API (Application programming interface – прикладной программируемый интерфейс), который состоит из создания и настройки узлов. Сошлемся на узловой API из предыдущего примера:

                                   (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

    Поскольку базовая станция – шлюз между проводным и беспроводным доменами, им необходимо иметь включенным проводной механизм маршрутизации, что достигается установлением опции –wiredRouting в положение ON. После создания узла базовой станции, мы перенастраиваем для беспроводных узлов и устанавливаем OFF. Все остальные опции для базовой станции остаются такими же, как и для подвижных узлов. Только BS(0) присваивается как узел базовой станции для беспроводного домена, поэтому все пакеты, происходящие от подвижных узлов и предназначенные для узлов вне беспроводного домена, будут перенаправляться подвижными узлами к базовой станции, с которой они связаны.

        Отметим, что для узлов базовой станции важно быть в том же домене, что и беспроводные узлы. Это связано с тем, что все пакеты, происходящие от проводного домена и предназначенные для беспроводных узлов, будут достигать базовой станции, которая затем использует свой протокол adhoc маршрутизации, чтобы перенаправить пакеты их правильным адресатам. Таким образом, в комбинированной симуляции, включающей проводные и беспроводные узлы необходимо:

1)    Установить иерархическую маршрутизацию.

2)    Создать отдельные домены для проводных и беспроводных узлов. Здесь могут быть многочисленные беспроводные и проводные домены для симуляции различных сетей.

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

    Разберем для данного примера пошагово, как именно формируется иерархия. Здесь мы имеем два домена: домен 0 для проводных узлов и домен 1 для проводных. Два проводных узла располагаются в различных кластерах, 0 и 1, таким образом, их адреса выглядят как 0(домен 0).0(кластер 0).0(только один узел) и 0 (тот же домен 0).1(кластер1).0(снова только один узел). Так как для беспроводных узлов, все они в одном домене 1, мы установили один кластер 0, поэтому все узлы находятся в этом кластере. Следовательно их адреса:

БС: 1(второй домен,1).0(кластер 0).0(первый узел в кластере)

WL node#1 : 1.0.1(второй узел в кластере)

WL node#2 : 1.0.2(третий узел)

WL node#3 : 1.0.3(четвертый узел).

    Мы могли бы расположить проводные узлы в одном кластере в проводном домене 0. Также мы могли бы разместить другие беспроводные узлы в в других кластерах беспроводного домена 1. Также в зависимости от топологии мы могли бы избавиться от кластеров вообще, и просто иметь два уровня иерархии, домены и узлы.

# configure for base-station node

$ns_ node-config -adhocRouting $opt(adhocRouting) \

                 -llType $opt(ll) \

                 -macType $opt(mac) \

                 -ifqType $opt(ifq) \

                 -ifqLen $opt(ifqlen) \

                 -antType $opt(ant) \

                 -propType $opt(prop) \

                 -phyType $opt(netif) \

                 -channelType $opt(chan) \

                         -topoInstance $topo \

                 -wiredRouting ON \

                         -agentTrace ON \

                 -routerTrace OFF \

                 -macTrace OFF

 

#create base-station node

set temp {1.0.0 1.0.1 1.0.2 1.0.3}   ;# hier address to be used for

                                     ;# wireless domain

set BS(0) [ $ns_ node [lindex $temp 0]]

$BS(0) random-motion 0               ;# disable random motion

 

#provide some co-ordinates (fixed) to base station node

$BS(0) set X_ 1.0

$BS(0) set Y_ 2.0

$BS(0) set Z_ 0.0

 

# create mobilenodes in the same domain as BS(0)

# note the position and movement of mobilenodes is as defined

# in $opt(sc)

# Note there has been a change of the earlier AddrParams

# function 'set-hieraddr' to 'addr2id'.

 

#configure for mobilenodes

$ns_ node-config -wiredRouting OFF

 

# now create mobilenodes

for {set j 0} {$j < $opt(nn)} {incr j} {

    set node_($j) [ $ns_ node [lindex $temp \

            [expr $j+1]] ]

    $node_($j) base-station [AddrParams addr2id \

            [$BS(0) node-addr]]   ;# provide each mobilenode with

                                  ;# hier address of its base-station

}

Затем соединим проводные узлы и БС и установим TCP трафик между беспроводным узлом, node_(0) и проводным узлом, W(0), и между W(1) и  node_(2), как показано ниже:

#create links between wired and BS nodes     

$ns_ duplex-link $W(0) $W(1) 5Mb 2ms DropTail

$ns_ duplex-link $W(1) $BS(0) 5Mb 2ms DropTail

 

$ns_ duplex-link-op $W(0) $W(1) orient down

$ns_ duplex-link-op $W(1) $BS(0) orient left-down

 

# setup TCP connections

set tcp1 [new Agent/TCP]

$tcp1 set class_ 2

set sink1 [new Agent/TCPSink]

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

$ns_ attach-agent $W(0) $sink1

$ns_ connect $tcp1 $sink1

set ftp1 [new Application/FTP]

$ftp1 attach-agent $tcp1

$ns_ at $opt(ftp1-start) "$ftp1 start"

 

set tcp2 [new Agent/TCP]

$tcp2 set class_ 2

set sink2 [new Agent/TCPSink]

$ns_ attach-agent $W(1) $tcp2       

$ns_ attach-agent $node_(2) $sink2

$ns_ connect $tcp2 $sink2

set ftp2 [new Application/FTP]

$ftp2 attach-agent $tcp2

$ns_ at $opt(ftp2-start) "$ftp2 start"

    Запустим скрипт. Файлы трассировки ns и nam сгенерируются в конце симуляции. 


Рис.1. Процесс передачи трафика .

    Запуск wireless2-out.nam покажет передвижение подвижных узлов и трафик в проводном домене. В файле трассировки wireless2-out.tr мы видим данные для обоих доменов (для беспроводного они начинаются с WL). На 160-й секунде устанавливается TCP соединение _3_, (которым является узел 1) и 0 (которым является W(0)). Заметим, что номера узлов создаются внутри симулятором и назначаются в соответствии с их созданием. На 170-й секунде устанавливается другое TCP соединение в обратном направлении, от проводного к беспроводному домену. 

        Фрагмент файла трассировки:

M 0.0 nn 3 x 670 y 670 rp  DSDV

M 0.0 sc /home/radist/Documents/ns-allinone-2.35/ns-2.35/tcl/mobility/scene/scen-3-test cp none seed 0.0

M 0.0 prop Propagation/TwoRayGround ant Antenna/OmniAntenna

M 33.00000 4194305 (83.36, 239.44, 0.00), (89.66, 283.49), 19.15

M 50.00000 4194307 (591.26, 199.37, 0.00), (369.46, 170.52), 3.37

M 51.00000 4194306 (257.05, 345.36, 0.00), (221.83, 80.86), 14.91

s 160.000000000 _3_ AGT  --- 64 tcp 40 [0 0 0 0] ------- [4194305:0 0:0 32 0] [0 0] 0 0

+ 160.010837 2 1 tcp 60 ------- 2 1.0.1.0 0.0.0.0 0 64

- 160.010837 2 1 tcp 60 ------- 2 1.0.1.0 0.0.0.0 0 64

r 160.012933 2 1 tcp 60 ------- 2 1.0.1.0 0.0.0.0 0 64

+ 160.012933 1 0 tcp 60 ------- 2 1.0.1.0 0.0.0.0 0 64

- 160.012933 1 0 tcp 60 ------- 2 1.0.1.0 0.0.0.0 0 64

r 160.015029 1 0 tcp 60 ------- 2 1.0.1.0 0.0.0.0 0 64

+ 160.015029 0 1 ack 40 ------- 2 0.0.0.0 1.0.1.0 0 65

- 160.015029 0 1 ack 40 ------- 2 0.0.0.0 1.0.1.0 0 65

r 160.017093 0 1 ack 40 ------- 2 0.0.0.0 1.0.1.0 0 65

+ 160.017093 1 2 ack 40 ------- 2 0.0.0.0 1.0.1.0 0 65

- 160.017093 1 2 ack 40 ------- 2 0.0.0.0 1.0.1.0 0 65

r 160.019157 1 2 ack 40 ------- 2 0.0.0.0 1.0.1.0 0 65

r 160.023545880 _3_ AGT  --- 65 ack 40 [13a 1 2 800] ------- [0:0 4194305:0 28 4194305] [0 0] 2 0

s 160.023545880 _3_ AGT  --- 66 tcp 1040 [0 0 0 0] ------- [4194305:0 0:0 32 0] [1 0] 0 0

s 160.023545880 _3_ AGT  --- 67 tcp 1040 [0 0 0 0] ------- [4194305:0 0:0 32 0] [2 0] 0 0