Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ММТССиПД_ns2_метода

.pdf
Скачиваний:
107
Добавлен:
15.03.2015
Размер:
1.02 Mб
Скачать

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

Рис. 4.1. Иллюстрация этапов моделирования

Первым шагом является написание программы имитационного моделирования. Написание скриптов на OTcl пользователь может производить в любом текстовом редакторе. Для пользователей Windows, у

которых ns2 инсталлирован в оболочке Cygwin, рекомендуется использовать текстовый редактор Microsoft® WordPad. Второй шаг – это работа интерпретатора OTcl, использующего библиотеку ns2, который обрабатывает написанную программу. Результатом его работы являются файлы трассировки. Далее необходимо обработать эти файлы для получения необходимых результатов моделирования Методы обработки трейс-файлов будут рассмотрены в главе 5.

4.2.Основы моделирования сетей на ns2

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

43

template.tcl (текст программы см. Приложение). Это файл включает в себя самые общие команды для любой моделируемой сети.

Сначала необходимо создать объект Simulator (модель). Это делается с помощью команды:

set ns [new Simulator]

Далее, если необходимо получить анимационный результат моделирования, пользователь может открыть файл для записи данных трассировки для визуализатора nam:

set nf [open out.nam w]

$ns namtrace-all $nf

В данном примере имя файла out.nam. Имя файла может быть произвольным, но расширение рекомендуется использовать стандартное

(nam). “w” означает, что файл открыт для записи (write). Команда namtrace-all

определяет тип файла трассировки (файл для визуализатора nam) и

содержимое (all – должны записываться все события, происходящие в моделируемой сети).

Также практически всегда пользователям необходимо открывать стандартный файл трассировки, так как именно он в дальнейшем используется для обработки и анализа результатов моделирования:

set f [open out.tr w]

$ns trace-all $f

Здесь для записи создается файл out.tr, в котором регистрируются все события. В качестве расширения для таких файлов рекомендовано “tr”.

Разница стандартных файлов трассировки и файлов для визуализатора nam

будет рассмотрена в разделе 5.2.

Следующий шаг – это описание процедуры “finish”, которая закрывает файлы трассировки и запускает визуализатор nam:

proc finish {} {

global ns f nf # описание глобальных переменных $ns flush-trace # прекращение трассировки

close $f # закрытие файлов трассировки close $nf # закрытие файлов трассировки

exec nam out.nam & # запуск nam в фоновом режиме

44

exit 0

}

Далее пользователю необходимо добавить at-событие для

планировщика событий, которое запускает процедуру “finish”:

$ns at 5.0 "finish"

Вданном случае процедура запускается через 5 секунд после начала моделирования.

Вконце скрипта прописывается строка, запускающая модель:

$ns run

Файл template.tcl ничего не выполняет, но является шаблоном практически для всех скриптов, которые предназначены для моделирования в ns2.

Создадим на базе этого шаблона два узла и одно звено (см. Прил. example1.tcl). Описание топологии необходимо вставлять перед строкой “$ns run” (а стилистически даже лучше перед описанием процедуры “finish”).

Создадим два новых узла:

set n0 [$ns node] set n1 [$ns node]

Далее необходимо соединить два узла одним звеном:

$ns duplex-link $n0 $n1 2Mb 10ms DropTail

Вэтой строке указано, что между узлом n0 и n1 создано дуплексное звено с полосой пропускания 2Мбит/с, задержкой 10мс и очередью с механизмом обслуживания DropTail.

Вns2 данные посылаются от одного агента к другому. Следующий шаг

создание агента, который посылает данные на узле n0 и другого агента,

который принимает данные на узле n1.

#Создание агента UDP и присоединение его к узлу n0 set udp0 [new Agent/UDP]

$ns attach-agent $n0 $udp0

# Создание источника трафика CBR (constant bit rate) и присоединение его к

агенту udp0

set cbr0 [new Application/Traffic/CBR] $cbr0 set packetSize_ 500

$cbr0 set interval_ 0.005 $cbr0 attach-agent $udp0

45

При помощи этих строк создается агент UDP и присоединяется к узлу n0. Но в ns2 агент сам не может генерировать трафик, он лишь реализует протоколы и алгоритмы транспортного уровня. Поэтому к агенту присоединяется приложение. В данном случае – это источник с постоянной скоростью (CBR – Constant Bit Rate), который каждые 5мс посылает пакет длиной 500 байт. Таким образом, скорость источника –

 

500 8

R =

 

= 800000бит/ с .

0.005

 

 

 

Также необходимо создать агент-приемник и прикрепить его к узлу n1:

set null0 [new Agent/Null] $ns attach-agent $n1 $null0

В случае использования UDP агент приемник называется Null (пустой).

Известно, что функции транспортного агента UDP заключаются только в приеме информации. В случае моделирования TCP агент называется TCPSink (приемник TCP).

Рис. 4.2. Визуализатор nam при анимации результатов моделирования файла example1.tcl

Далее агенты соединяются друг с другом:

46

$ns connect $udp0 $null0

Теперь для запуска и остановки приложения CBR необходимо добавить at-события в планировщик событий.

$ns at 0.5 "$cbr0 start"

$ns at 4.5 "$cbr0 stop"

В данном примере запуск приложения происходит через 0,5 секунды модельного времени и останавливается на 4,5 секунде.

После запуска example1.tcl создадутся два трейс-файла: out.nam и out.tcl

и запустится визуализатор nam (рис. 4.2).

Следующий шаг – это создание топологии. Создадим файл example2.tcl (см Приложение, example2.tcl), в котором описана сеть с 4 узлами, один из которых является маршрутизатором (рис. 4.3). В качестве шаблона для этого файла служит файл template.tcl.

Рис. 4.3. Топология сети при анимации результатов моделирования файла example2.tcl

Создадим четыре узла:

set n0 [$ns node] set n1 [$ns node] set n2 [$ns node] set n3 [$ns node]

47

Эти строчки можно заменить циклом for:

for {set i 0} {$i < 4} {incr i} { set n($i) [$ns node]

}

Далее создаются три дуплексных звена

$ns duplex-link $n0 $n2 2Mb 10ms DropTail $ns duplex-link $n1 $n2 2Mb 10ms DropTail $ns duplex-link $n3 $n2 2Mb 10ms DropTail

Для того чтобы данная топология была наглядной при анимации в визуализаторе nam необходимо для каждого звена указать направление:

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

Создадим два агента – один агент UDP с прикрепленным к нему источником CBR, второй – агент TCP с прикрепленным к нему приложением

FTP.

#Создание агента UDP и присоединение его к узлу n0 set udp0 [new Agent/UDP]

$ns attach-agent $n0 $udp0

# Создание источника CBR-трафика и присоединение его к агенту udp0 set cbr0 [new Application/Traffic/CBR]

$cbr0 set packetSize_ 500 $cbr0 set interval_ 0.005 $cbr0 attach-agent $udp0

#Создание агента TCP и присоединение его к узлу n1 set tcp1 [new Agent/TCP]

$ns attach-agent $n1 $tcp1

# Создание приложения FTP и присоединение его к агенту tcp1 set ftp [new Application/FTP]

$ftp attach-agent $tcp1

#Создание агента-получателя для udp0 set null0 [new Agent/Null]

$ns attach-agent $n3 $null0

#Создание агента-получателя для tcp1 set sink1 [new Agent/TCPSink]

$ns attach-agent $n3 $sink1

Далее необходимо соединить агенты udp0 и tcp1 и их получатели:

$ns connect $udp0 $null0 $ns connect $tcp1 $sink1

Для того, чтобы программа начала работать необходимо добавить at-

события:

$ns at 0.5 "$cbr0 start" $ns at 1.0 "$ftp start" $ns at 4.0 "$ftp stop" $ns at 4.5 "$cbr0 stop"

48

Рис. 4.4. Мониторинг очереди в визуализаторе nam

Оба потока в визуализаторе nam изображены черным цветом, и

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

$udp0 set class_ 1 $tcp1 set class_ 2

Но перед этим необходимо описать цвет каждого класса:

$ns color 1 Blue $ns color 2 Red

Таким образом, цвет tcp-пакетов – красный, а цвет udp-пакетов – синий.

Для того, чтобы пользователь увидел, что происходит внутри очереди

(рис.4.4), необходимо добавить строку:

$ns duplex-link-op $n2 $n3 queuePos 0.5 ,

которая определяет место положения изображения очереди в зоне анимации визуализатора nam.

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

49

маршрутизаторе будут наблюдаться потери. В данном случае можно заметить, что теряются практически только «синие» пакеты. Для избежания этого пользователь может изменить механизм обслуживания очереди с

DropTail, например, на SFQ (Stochastic Fair Queuing – Стохастическая справедливая очередь) или RED (Random Early Detection).

$ns duplex-link $n2 $n3 1Mb 10ms SFQ

Также можно задать размер очереди:

$ns queue-limit $n2 $n3 20

Если какие-либо параметры не заданы пользователем, то они остаются установленными по умолчанию. Значения переменных, установленные по умолчанию записаны в файле ns-default.tcl, который находится в каталоге ns- allinone-2.29/ns-2.29/tcl/lib. Например, размер очереди определяется в строке:

Queue set limit_ 50

Названия данных переменных находятся в соответствующих процедурах, описанных в файле ns-lib.tcl, который находится в той же папке.

Для размера очереди необходимо найти процедуру queue-limit:

Simulator instproc queue-limit { n1 n2 limit } { $self instvar link_

[$link_([$n1 id]:[$n2 id]) queue] set limit_ $limit

}

Из процедуры видно, что queue-limit – это метод объекта Simulator,

который использует три параметра – два узла, которые описывают звено и

размер очереди. Отсюда и видно, что величина размера очереди находится в

переменной limit_.

4.3.Модели трафика в ns2

Вкачестве приложений в ns2 можно использовать генераторы трафика

(Парето, экспоненциальный и др.) В этом случае каждый генератор трафика может моделировать агрегированный поток от большого количества источников. Тогда каждый такой генератор заменяет большое количество узлов. Таким образом, можно построить сеть с небольшим количеством узлов.

Каждый генератор трафика в ns2 моделирует трафик, имеющий две

50

величины, распределенные по определенному закону: интервал между пачками пакетов и длина пачки. Эти величины соответствуют двум первым буквам в классификации Кендалла, например P/P или M/M. В качестве примера подробно рассмотрим генератор Парето, реализованный в ns2.

4.3.1 ГЕНЕРАТОР ТРАФИКА ПАРЕТО

On/Off генератор трафика Парето – это генератор (приложение),

содержащийся в классе OTcl Application/Traffic/Pareto. Генератор Парето создает трафик согласно закону распределения Парето. В течение периода On

Пакеты посылаются с фиксированной скоростью, а в течение периода Off

пакеты не посылаются. При постоянном размере пакетов период On и период

Off распределены по закону Парето. Такой источник (генератор трафика Парето) может быть использован для моделирования агрегированного трафика, который обладает медленно-затухающим распределением (МЗР).

Ниже приведен пример создания нового генератора:

set p [new Application/Traffic/Pareto] $p set burst_time_ 500ms

$p set idle_time_ 500ms $p set rate_ 200k

$p set packetSize_ 210 $p set shape_ 1.5

burst_time – время периода On (пачки);

idle_time – время периода Off (ожидания);

rate_ – скорость потока в течение периода On;

packetSize_ – размер одного пакета в байтах;

shape_ – параметр формы (характеристический показатель распределения)

Используя исходные данные, генератор производит начальные

вычисления:

packetSize 8

interval =

rate _

burst _ time

burstlen =

interval

51

Величина interval показывает, какой промежуток времени занимает передача одного пакета (измеряется в секундах). Величина burstlen

показывает среднее количество пакетов в пачке.

В каждом цикле On/Off рассчитываются две независимые случайные величины:

next_burstlen – количество пакетов в пачке, которые должны передаться

в следующий период On;

next_idle_time – длина следующего периода Off в секундах.

Ниже приведен алгоритм работы Генератора трафика Парето:

1.Расчет величины next_burstlen по заданным значениям burstlen и

shape_.

2.Отправка всех next_burstlen пакетов (время передачи каждого пакета – interval секунд).

3.Расчет величины next_idle_time по заданным значениям idle_time_

иshape_.

4.Переход в режим ожидания на время next_idle_time и возврат на

шаг 1.

Обозначим плотность вероятности распределения Парето f(x), а

математическое ожидание E(x):

f (x) = α bα для x b xα +1

E( X ) = b α для a > 1

α−1

α– характеристический показатель распределения (shape parameter) ;

b – минимальное значение величины х (масштабный коэффициент).

Тогда,

burstlen = E( X ) = b1 α

α −1

idle_time_ = E(Y ) = b2 α

α −1

b1 =

burstlen (α −1)

α

b2 =

idle _ time _ (α −1)

 

+ interval

 

 

α

52