Мультисервисные сети2
.pdf
16.1. Основные сведения об NS2 |
|
421 |
|||
|
|
|
|
|
|
|
|
Объекты |
Объекты |
|
|
|
Tclкрипт-c: |
симуляции |
симуляции |
Traceфайл:- |
|
|
программная |
|
|
результат |
|
|
модель |
|
|
симуляции |
|
NS2командная оболочка
Рис. 16.1. Архитектура NS2
Для обработки результатов могут использоваться входящие в состав симулятора пакеты: NAM (Network AniMator – сетевой аниматор), который служит для визуализации динамики сети, и Xgraph – приложение для графической интерпретации результатов моделирования.
Полная версия NS2 кроме ядра, оболочки и средств обработки результатов содержит несколько полезных утилит, таких как, например, отладчик, генератор сценариев, генератор топологий и т.п. Структура каталогов, содержащих полную версию симулятора, приведена на рис. 16.2.
|
|
simulator |
|
|
|
tcl |
tk |
otcl |
tclcl |
ns-2 |
nam-1 |
|
|
tcl code |
tcl |
... C++ code |
|
|
example |
ex |
test |
lib |
... |
|
|
||||
|
|
validation test |
tcl code core |
||
|
Рис. 16.2. Общая структура каталогов NS2 |
|
|||
Кроме всего прочего, симулятор содержит библиотеку графических примитивов Tk (ToolKit – инструментарий), компоненты которой служат в основном для разработки графических интерфейсов и могут
422 |
Глава 16. Моделирование мультисервисных сетей в NS2 |
|
|
использоваться не только Tcl, но и другими языками (Perl, Python, Ruby), которым Tcl служит мостом для Tk.
16.1.2. Языки программирования, используемые в NS2
Почему два языка? Языки NS2 (C++ и Tcl/Tk) предназначены для решения двух разных задач.
C++ и Tcl. С одной стороны, для детального моделирования протоколов требуется низкоуровневый язык системного программирования, способный манипулировать байтами, заголовками пакетов и реализовывать алгоритмы обработки больших массивов данных. Для таких задач важна скорость выполнения, но менее важна быстрота внесения изменений и исправлений в программный код и его компиляции. С другой стороны, большинство исследований включают в себя незначительно изменяющиеся параметры и конфигурации и большое количество различных сценариев моделирования. В этом случае важную роль играет время, затрачиваемое на изменение программного кода и перезапуск модели, но не скорость выполнения программы.
C++ предназначен для обеспечения скорости выполнения, но не обеспечивает удобство редактирования, поиска и устранения багов и компиляции программы, поэтому используется для разработки детализированных протоколов. OTcl-скрипт выполняется намного медленнее, но позволяет разработчику быстро и интерактивно вносить изменения, поэтому OTcl идеален для конфигурирования модели. NS2 через интерфейс TclCl обеспечивает «склеивание» классов, делая объекты и переменные доступными обоим языковым доменам [2, 3].
Существуют два типа классов в каждом домене (рис. 16.3):
общие для C++ и OTcl доменов, которые в литературе носят названия иерархия компиляции и иерархия интерпретации соответственно. Существует однозначное соответствие между классом одной иерархии и таким же классом другой;
не являющиеся общими для разных языковых доменов и не являющиеся частью их иерархии.
Вдокументации разработчиков NS2 [3] приводятся рекомендации по использованию объектов OTcl в следующих случаях:
для конфигурирования, настройки модели и реализации одноразовых алгоритмов моделирования;
для манипуляций со встроенными C++ объектами.
Там же приведены советы по применению C++:
для моделирования детального поведения каждого пакета информационного потока;
16.1. Основные сведения об NS2 |
423 |
|
|
для внесения изменений в существующие C++ классы, придания им дополнительных функций;
для создания новых C++ классов, реализующих новые протоколы, форматы, сетевые топологии и пр.
Иерархия |
Иерархия |
компиляции |
интерпретации |
Однозначное соответствие
Рис. 16.3. Языковая структура NS2
Использование Tcl. Tcl (название произносится как «тикль») является интерпретируемым языком программирования скриптов («тиклетов»), по своим характеристикам близким к Perl. Это простой язык обработки текстовой информации, предназначенный для создания команд интерактивных программ типа текстовых редакторов, отладчиков и оболочек на основе библиотеки Tk. В восьмой версии Tcl/Tk интерпретация заменена компиляцией в байт-код «на лету» (по аналогии с Java) [4].
В состав языка входят библиотека и командный интерпретатор.
Библиотека Tcl содержит синтаксический анализатор, подпрограммы, реализующие встроенные команды Tcl, и процедуры, которые доступны приложениям и расширяют язык при помощи дополнительных команд, специфичных для каждого приложения. Прикладная программа генерирует команды Tcl и передает их синтаксическому анализатору для последующего выполнения.
Интерпретатор Tcl состоит из набора команд и переменных. Tcl поддерживает только один тип данных: строки. Все команды, параметры, передаваемые командам, и переменные являются строками. В тех случаях, когда командам требуются числовые аргументы или они возвращают числовые результаты, аргументы и результаты передаются в виде строк.
Строки принимают одну из трех общих форм интерпретации:
команды, выражения и списки.
Команды Tcl. Каждая команда является набором полей, разделенных пробелами или символами табуляции. Первое поле всегда имя команды, остальные, если они существуют, – параметры команды.
424 |
Глава 16. Моделирование мультисервисных сетей в NS2 |
|
|
Например, команда set x 10
устанавливает значение переменной x равным 10 и имеет три поля: set – имя команды, x и 10 – параметры команды.
Команды, как правило, разделяются символом новой строки, хотя допускается запись в одной строке нескольких команд, разделенных точкой с запятой. Точка с запятой не считается разделителем команд, если она находится внутри фигурных скобок или двойных кавычек.
Имена команд должны набираться полностью без сокращений, но если интерпретатор Tcl не может распознать команду, он вызывает специальную команду unknown, которая пытается найти и/или создать команду. На практике команда unknown завершает команду, напечатанную с сокращением, но это справедливо только для интерактивного режима работы. Использование сокращенных вариантов команд в скриптах не рекомендуется.
Если первый символ команды #, то строка от этого символа до символа новой строки интерпретируется как комментарий и игнорируется при исполнении.
Пример:
# Пример комментария Tcl;
Поскольку параметры команд разделяются пробелами, то внутри себя они не могут содержать пробелов. Чтобы использовать пробелы внутри параметров команд и выражений, в Tcl существует специальный способ. Для этой цели используются двойные кавычки – ―. Если поле аргумента начинается с двойных кавычек, то этот аргумент будет заканчиваться не пробелом или точкой с запятой, а только следующими двойными кавычками. При этом кавычки не входят в параметр команды.
Пример:
set x ―параметр с пробелами‖
Для группировки параметров могут использоваться также фигурные скобки. В отличие от кавычек в командах Tcl можно использовать вложенные фигурные скобки. В пределах фигурных скобок не производится подстановка переменных и не интерпретируется команда.
Пример:
set x {set x 10}
команда присвоит переменной x значение set x 10. Фигурные скобки могут использоваться для группировки нескольких параметров в один параметр команды.
Пример:
eval {
16.1. Основные сведения об NS2 |
425 |
|
|
set x 1; set y 2;
}
Если для группировки параметров используются квадратные скобки, то в поле происходит подстановка команды, т.е. текст внутри квадратных скобок интерпретируется как команда.
Пример:
set x [set y]
Квадратные скобки могут образовывать более сложные структуры.
Пример:
Данный набор команд set x rambler set y ru
set url [set x].[set y]
эквивалентен одной команде: set url rambler.ru
Для подстановки значений переменных используется знак доллара $. Символы после знака доллара до первого символа, не являющегося цифрой, буквой или подчеркиванием, составляют имя переменной.
Пример:
set x node set y $x
эквивалентно команде: set y node
Пример:
puts $y
команда выводит на экран значение переменной y.
Если после имени переменной стоят круглые скобки, то переменная является именем массива и все содержимое круглых скобок представляет собой индекс массива.
Пример:
set i 10
set arrayValue($i) ―10-th array’s value‖
Для ввода непечатных символов или специальных символов (например, фигурных скобок или двойных кавычек) в поля команд используется обратный слеш \.
426 |
Глава 16. Моделирование мультисервисных сетей в NS2 |
|
|
Примеры спецсимволов:
\n – новая строка
\t – горизонтальная табуляция \v – вертикальная табуляция \$ – символ доллара
Выражения Tcl. Еще одной смысловой формой строк Tcl являются выражения. Несколько Tcl-команд, таких как, например, expr, for, if, считают один или несколько своих параметров выражениями и вызывают обработчики выражений для выполнения. Выражения в большинстве случаев выдают числовые результаты (целые или с вещественной точкой).
Математические операции в выражениях Tcl обозначаются так же, как и в большинстве языков программирования (табл. 16.1).
Таблица 16.1. Математические операции Tcl
Знак операции |
Описание |
|
|
+ |
Сложение |
|
|
- |
Вычитание |
|
|
* |
Умножение |
|
|
/ |
Деление |
|
|
% |
Остаток от деления |
|
|
Пример:
set x 3.4 set y 2
set z [expr $x + $y]
Здесь переменная z примет значение 5.4 выражения expr $x + $y. Пробелы и символы табуляции при вычислении выражений
игнорируются. Там, где это возможно, операнды интерпретируются как целочисленные значения. Целочисленные значения могут быть представлены в десятичном, восьмеричном (начинаются с нуля), шестнадцатеричном виде (начинаются с символов ―0x‖). Если операнд не принадлежит ни к одному из перечисленных видов, он будет обработан как число с плавающей точкой. Допускаются следующие виды записи вещественных чисел в выражениях:
2.0, |
2., |
2e1, |
2.0e+1. |
Все перечисленные выше представления вещественного числа 2 идентичны.
Примеры выражений в Tcl:
3.1 + $x
16.1. Основные сведения об NS2 |
427 |
|
|
2 + ―$x.$y‖
4 * [llength ―6 2―]
Примеры выражений, использующих вложенные команды:
set y [expr $x/2] puts [expr {$y*$x}]
Кроме математических операций в выражениях могут использоваться логические операции, операторы булевой алгебры и поразрядные операции.
Логические операции:
&&– логическое и;
|| |
– логическое или; |
! |
– логическое не. |
Операции сравнения:
< > <= >= – меньше, больше, меньше или равно, больше или равно;
== != – равно, не равно.
С помощью описанных выше операций можно создавать управляющие конструкции: ветвления и циклы.
Ветвление:
Синтаксис: if {условие}{команды} else {команды}
Пример:
if {k > 0}{ return $k
} else {
return [expr {$k**$k}]
}
Циклы:
Цикл с предусловием. Синтаксис: while {условие} {
команды
}
Пример:
while {i <= 10} { incr i
}
428 |
Глава 16. Моделирование мультисервисных сетей в NS2 |
|
|
Цикл с параметром. Синтаксис:
for {инициализация}{условие}{действие}{ команды
}
Пример:
set p 1
for {set i 1} {i <= 5} {incr i} { set p [expr {$p*$i}]
}
Tcl, как и другие языки программирования, содержит множество встроенных функций.
Математические функции:
abs(x) |
– абсолютное значение (модуль); |
round(x) |
– округление; |
sin(x), cos(x), tan(x) |
– тригонометрические функции; |
log(x), log10(x) |
– логарифмирование; |
sqrt(x), pow(x,y) |
– извлечение корня и возведение в сте- |
|
пень. |
Пример: |
|
set a 2; |
|
set b [expr pow($a,3)];
puts $b;
При моделировании часто приходится использовать повторяющиеся фрагменты кода. Для повышения эффективности кода их оформляют в виде процедур (подпрограмм).
Процедуры:
Создание процедуры:
proc имя {параметры} { команды
return результат
}
Запуск процедуры осуществляется через ее имя и фактические параметры.
Пример:
proc factorial {n} { if {$n <= 1}{
return 1 } else {
16.1. Основные сведения об NS2 |
429 |
|
|
set i 1 set p 1
while {$i <= $n} {
set p [expr {$p*$i}] incr i
}
return $p
}
}
# Пример вызова процедуры factorial set n 5
set result [factorial $n] puts $result
Списки Tcl. Список – это обычная строка с подобной списку структурой, состоящей из полей, разделенных промежутками.
Например, строка Siberian State University of Telecommunications
является списком из пяти полей. Для списков действуют те же правила относительно кавычек, скобок и слешей, как и для команд.
Например, в списке a b\ c {d e {f g h}} три элемента:
a; b c;
d e {f g h}.
В списках никогда не выполняются подстановки команд и переменных. Tcl содержит команды работы со списками, такие как concat, foreach, lappend, lindex, linsert, list, llength, lrange, lreplace, lsearch, lsort, которые позволяют составлять списки, извлекать из них элементы, просматривать содержимое и др.
Язык OTcl. OTcl является объектно-ориентированным расширением языка Tcl. Программистам, ориентирующимся в С++, синтаксис OTcl не покажется сложным, хотя есть некоторые отличия.
Особенности программирования в среде OTcl:
каждое определение метода с использованием команды instproc добавляет метод к классу. Каждое определение переменной с использованием команды set или instvar добавляет переменную к объекту;
вместо конструктора, используемого в С++, необходимо определять instproc init. Вместо деструктора определяется destroy instproc. Методы init и destroy не объединяются с
430 |
Глава 16. Моделирование мультисервисных сетей в NS2 |
|
|
базовыми классами автоматически. Они должны быть объединены явно с использованием next;
методы в OTcl всегда вызываются через объекты, self аналогично this в С++ и может использоваться внутри метода. Методы OTcl всегда виртуальны;
вместо вызова скрытых методов посредством указания их имени, как в С++, необходимо использовать next. При этом сканируется диаграмма наследственности и скрытые методы находятся автоматически. Это позволяет объединять методы без зависимости имен;
необходимо избегать использования статических методов и переменных, так как в OTcl не существует их полных аналогов. Ввод общих переменных на объекте класса и обращение к ним из методов происходит при использовании $class;
если наследственность не необходима, используются proc методы на объекте класса.
Создание класса myClass производится следующим образом:
% Class myClass myClass
Создание реализации класса myClass: % myClass instance1 instance1
Интерфейс между языковыми доменами TclCL. Написанный на
C++ TclCL содержит шесть основных классов [2]:
класс Tcl обеспечивает методы доступа к объектам интерпретируемой иерархии из объектов компилируемой иерархии;
класс InstVar связывает переменные – члены обеих иерархий;
класс TclObject является базовым для всех объектов симуляции компилируемой иерархии;
класс TclClass преобразует имена иерархии интерпретации в имена иерархии компиляции;
класс TclCommand обеспечивает общий доступ к объектам компилируемой иерархии из объектов интерпретируемой иерархии;
класс EmbeddedTcl переводит OTcl скрипты в C++ коды.
16.1.3.NS2 и многоуровневый подход
Симулятор NS2 осуществляет имитационное моделирование сетей на уровне пакетов, т.е. моделирует генерацию пакетов и
