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

Практикум по дисциплине Иммитационное моделирование систем обнаружения вторжений

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
920 Кб
Скачать

где «FirstScriptExample» - имя компонента для которого будет вестись логирование.

Далее необходимо объявить главную функцию с помощью выражения

int

main (int argc, char *argv[])

{

и добавить в данную функцию весь код, который будет отвечать за моделирование.

Следующая функция устанавливает временную шкалу, при которой одна секунда представлена одной наносекундой:

Time::SetResolution (Time::NS);

Чтобы добавить логирование для компонентов Echo клиента и сервера следует воспользоваться следующим кодом:

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);

LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);

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

NodeContainer nodes; nodes.Create (2);

Далее с помощью помощника мы будем создавать связь между узлами в режиме точка-точка. Для начала следует задать параметры сети, такие как скорость передачи данных (5 Мбит в секунду) и задержку (2 мс):

PointToPointHelper pointToPoint;

pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps")); pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

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

NetDeviceContainer devices;

devices = pointToPoint.Install (nodes);

На данный момент у нас есть узлы и настроенные устройства, но нет стека протоколов (TCP, UDP, IP и т. д.). Следующее две строки кода позаботятся о его создании:

11

InternetStackHelper stack; stack.Install (nodes);

Далее свяжем наши устройства с IP адресами. Для этого необходимо установить базовый IP-адрес и маску:

Ipv4AddressHelper address;

address.SetBase ("10.1.1.0", "255.255.255.0");

По умолчанию адреса будут выделяться по мере возрастания, то есть первый адрес будет 10.1.1.1, второй 10.1.1.2 и т.д.

Следующей строкой присвоим IP адреса нашим устройствам:

Ipv4InterfaceContainer interfaces = address.Assign (devices);

Для тестирования созданной топологии воспользуемся вспомогательными классами UdpEchoServerApplication и UdpEchoClientApplication (на уровне приложений), которые имитируют клиент серверное взаимодействие.

Займёмся настройкой серверного приложения. Первым делом установим необходимый порт:

UdpEchoServerHelper echoServer (9);

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

ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));

и зададим интервал генерации трафика:

serverApps.Start (Seconds (1.0)); serverApps.Stop (Seconds (10.0));

Произведём настройку клиентского приложения:

UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9); echoClient.SetAttribute ("MaxPackets", UintegerValue (1)); echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));

echoClient.SetAttribute ("PacketSize", UintegerValue (1024));

в данном случае выбирает второй сетевой интерфейс (индексация с 0) и присваивается порт 9, а также устанавливаются такие атрибуты, как максимальное количество пакетов, которые могут быть приняты во время моделирования, интервал ожидания между пакетами и максимальный размер пакета, который может быть принят.

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

12

ApplicationContainer clientApps = echoClient.Install (nodes.Get (0)); clientApps.Start (Seconds (2.0));

clientApps.Stop (Seconds (10.0));

На данном этапе все настройки завершены, и мы можем запустить моделирование. Для этого воспользуемся следующим кодом:

Simulator::Run ();

После этого NS-3 начнёт просматривать все запланированные события и инициировать их выполнение.

Когда процесс модерирования будет завершён, необходимо выполнить очистку всех объектов из памяти с помощью функции:

Simulator::Destroy ();

После чего завершите главную функцию возвратом кода 0, который сообщает об успешном выполнении функции:

return 0;

}

Топология типа «шина»

Рассмотрим работу скрипта second.cc [2], который представляет собой имитацию работы сети по топологии типа «шина», которая выглядит следующим образом:

//10.1.1.0

// n0

-------------- n1

n2

n3

n4

//

точка - точка |

|

|

|

//

================

//

 

LAN 10.1.2.0

 

 

 

 

 

 

Вышеуказанный скрипт начинается со следующих строк:

bool verbose = true; uint32_t nCsma = 3;

CommandLine cmd;

cmd.AddValue ("nCsma", "Number of \"extra\" CSMA nodes/devices", nCsma);

cmd.AddValue ("verbose", "Tell echo applications to log if true", verbose);

cmd.Parse (argc, argv);

if (verbose)

13

{

LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO); LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);

}

nCsma = nCsma == 0 ? 1 : nCsma;

Это особый механизм NS-3, который позволяет передавать пользовательские значения из командной строки во время запуска. В код было добавлено две переменных: nCsma и verbose. Чтобы задать собственные значения этим переменным, передайте необходимые параметры следующим образом:

./waf --run "second --nCsma=4"

Параметр nCsma отвечает за количество узлов, а параметр verbose позволяет включить логирование (в команде выше логирование не используется).

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

NodeContainer p2pNodes; p2pNodes.Create (2);

NodeContainer csmaNodes; csmaNodes.Add (p2pNodes.Get (1)); csmaNodes.Create (nCsma);

PointToPointHelper pointToPoint;

pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps")); pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

NetDeviceContainer p2pDevices;

p2pDevices = pointToPoint.Install (p2pNodes);

Для моделирования сетевых устройств и каналов NS-3 использует технологию CSMA (Carrier Sense Multiple Access - множественный доступ с прослушиванием несущей). Стоит отметить, что NS-3 CSMA сетевые устройства лишь частично соответствуют стандарту Ethernet, так как Ethernet

использует CSMA/CD (Carrier Sense Multiple Access with Collision Detection -

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

Для работы с CSMA может быть использован CsmaHelper, который работает по тому же принципу, что и PointToPointHelper. Однако, обратите внимание на то, что CsmaHelper устанавливает атрибуты не для отдельных устройств, а для всего канала. Это обусловлено тем, что CSMA не позволяет использовать устройства, работающие по разным стандартам, например, 10BASE-T и

100Base-T.

14

CsmaHelper csma;

csma.SetChannelAttribute ("DataRate", StringValue ("100Mbps")); csma.SetChannelAttribute ("Delay", TimeValue (NanoSeconds (6560)));

NetDeviceContainer csmaDevices; csmaDevices = csma.Install (csmaNodes);

Все последующие строки кода вам также знакомы из первого скрипта:

InternetStackHelper stack; stack.Install (p2pNodes.Get (0)); stack.Install (csmaNodes);

Ipv4AddressHelper address;

address.SetBase ("10.1.1.0", "255.255.255.0"); Ipv4InterfaceContainer p2pInterfaces; p2pInterfaces = address.Assign (p2pDevices);

address.SetBase ("10.1.2.0", "255.255.255.0"); Ipv4InterfaceContainer csmaInterfaces; csmaInterfaces = address.Assign (csmaDevices);

UdpEchoServerHelper echoServer (9);

ApplicationContainer serverApps = echoServer.Install (csmaNodes.Get (nCsma));

serverApps.Start (Seconds (1.0)); serverApps.Stop (Seconds (10.0));

UdpEchoClientHelper echoClient (csmaInterfaces.GetAddress (nCsma), 9);

echoClient.SetAttribute ("MaxPackets", UintegerValue (1)); echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));

echoClient.SetAttribute ("PacketSize", UintegerValue (1024));

ApplicationContainer clientApps = echoClient.Install (p2pNodes.Get (0));

clientApps.Start (Seconds (2.0)); clientApps.Stop (Seconds (10.0));

Так как мы создали целую сеть, то нам необходима маршрутизация. Для упрощения этой задачи NS-3 поддерживает так называемую глобальную маршрутизацию, в которой каждый узел работает по протоколу OSPF (Open Shortest Path First) [3], который отслеживает состояние канала и находит кратчайший путь используя алгоритм Дейкстры.

Данный режим устанавливается всего одной строкой кода:

Ipv4GlobalRoutingHelper::PopulateRoutingTables ();

На следующем шаге мы включим режим сбора трафика в pcap файл:

15

pointToPoint.EnablePcapAll ("second"); csma.EnablePcap ("second", csmaDevices.Get (1), true);

Существует два режима сбора трафика. Первый режим создаёт трассировочный файл для каждого узла в сети, второй же использует «неразборчивый» (promiscuous) режим для сбора трафика. Это означает, что всего один узел в сети будет собирать весь трафик со всех узлов. В данном примере узлы в режиме «точка-точка» будут производить сбор трафика в отдельные файлы, а CSMA узел с индексом 1 работает в «неразборчивом» режиме.

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

Simulator::Run (); Simulator::Destroy (); return 0;

}

После того как вы запустите данный скрипт, вы должны увидеть три файла в папке верхнего уровня: second-0-0.pcap, second-1-0.pcap и second-2-0.pcap.

Имена файлов имеют следующий формат: <имя>-<узел>-<устройство>.pcap

Задание на практикум

1.Создайте топологию типа «точка-точка», изобразите её графическое представление

2.Установите echo server на одном из узлов на 14-ом порте.

3.Установите echo client на другом узле.

4.Передайте 8 сетевых пакетов между узлами.

5.Создайте топологию типа «шина», состоящую из 7 узлов. Изобразите её графическое представление

6.Установите echo server на одном из узлов на 14-ом порте.

7.Установить echo client на любых двух других узлах.

8.Передайте по 8 сетевых пакетов между каждым узлом и сервером.

9.Произведите запись сетевого трафика в pcap файл.

Содержание отчёта по практикуму

1.Титульный лист

2.Цель практикума и краткие теоретические сведения

3.Выполнение практикума в соответствии с заданием

4.Ответы на контрольные вопросы

16

Контрольные вопросы

1.Какое графическое представление имеет топология типа «точкаточка»? В чём заключаются достоинства и недостатки топологии типа «точка-точка»?

2.Что представляет собой топология типа «шина»? Расскажите о достоинствах и недостатках данной топологии.

3.Что такое CSMA?

4.Для чего необходимо производить вызов функции Simulator::Destroy?

5.Какие варианты сбора трафика существуют в NS-3?

Литература

1.first.cc File Reference // Интернет ресурс https://www.nsnam.org/doxygen/first_8cc_source.html (дата обращения: 05.11.2016)

2.second.cc File Reference // Интернет ресурс https://www.nsnam.org/doxygen/second_8cc_source.html (дата обращения: 05.11.2016)

3.J. Moy. OSPF Version 2, 1998 г. // Интернет ресурс http://www.ietf.org/rfc/rfc2328.txt (дата обращения: 05.11.2016)

Практикум №3

“Построение беспроводной топологии и топологии типа «звезда» в NS-3”

Цель практикума

Получить навыки построения беспроводной топологии и топологии типа «звезда» в сетевом симуляторе NS-3.

Краткие теоретические сведения

Беспроводная топология

Скрипт third.cc [1] представляет собой имитацию беспроводной топологии следующего вида:

//

*

*

*

*

 

 

 

 

//

|

|

|

|

10.1.1.0

 

 

 

// n5

n6

n7

n0

-------------- n1

n2

n3

n4

//

 

 

 

 

точка-точка |

|

|

|

//

 

 

 

 

================

//

 

 

 

 

 

LAN 10.1.2.0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

17

 

 

 

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

//10.1.1.0

// n0

-------------- n1

n2

n3

n4

//

точка -точка |

|

|

|

//

================

//

 

LAN 10.1.2.0

 

не имеет существенных различий с уже рассмотренными топологиями и поэтому будет опущена.

Начнём наше рассмотрение с создания беспроводной части сети. Первым делом создадим необходимое количество узлов:

NodeContainer wifiStaNodes; wifiStaNodes.Create (nWifi);

NodeContainer wifiApNode = p2pNodes.Get (0);

Следующий фрагмент кода обеспечивает моделирование wi-fi устройств и канала связи между ними. Во-первых, нам необходимо настроить PHY уровень и канал связи:

YansWifiChannelHelper channel = YansWifiChannelHelper::Default (); YansWifiPhyHelper phy = YansWifiPhyHelper::Default (); phy.SetChannel (channel.Create ());

После того как уровень PHY настроен, перейдём к настройке уровня MAC. В данном примере используется non-QoS MAC, поэтому настройка выглядит следующим образом:

WifiHelper wifi = WifiHelper::Default (); wifi.SetRemoteStationManager ("ns3::AarfWifiManager");

NqosWifiMacHelper mac = NqosWifiMacHelper::Default ();

Метод SetRemoteStationManager устанавливает тип алгоритма управления скоростью. В данном случае используется алгоритм AARF [2, 3].

Продолжим конфигурирование MAC. Следующие строки кода позволяют установить SSID:

Ssid ssid = Ssid ("ns-3-ssid"); mac.SetType ("ns3::StaWifiMac", "Ssid", SsidValue (ssid),

"ActiveProbing", BooleanValue (false));

Данный код создаёт сервис 802.11, устанавливает его тип равным «ns3 :: StaWifiMac» [4], SSID равным «ns-3-ssid» [5] и значение атрибута ActiveProbing (активировать зондирование) с типом «false».

18

Когда настройка PHY и MAC уровней завершены, мы можем создать сетевые wi-fi устройства с помощью уже знакомого нам кода:

NetDeviceContainer apDevices;

apDevices = wifi.Install (phy, mac, wifiApNode);

Чтобы добиться более реального поведения беспроводных устройств, необходимо добавить им какое-то перемещение в пространстве (за исключением точки доступа, которая должна оставаться неподвижной). Для этой цели воспользуемся классом MobilityHelper:

MobilityHelper mobility;

mobility.SetPositionAllocator ("ns3::GridPositionAllocator", "MinX", DoubleValue (0.0),

"MinY", DoubleValue (0.0),

"DeltaX", DoubleValue (5.0),

"DeltaY", DoubleValue (10.0),

"GridWidth", UintegerValue (3), "LayoutType", StringValue ("RowFirst"));

Данный код создаёт сетку в двумерном пространстве и задаёт начальное положение для узлов.

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

mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel", "Bounds", RectangleValue (Rectangle (-50, 50, -50, 50)));

С помощью MobilityHelper мы устанавливаем созданную модель мобильности на наших беспроводных узлах:

mobility.Install (wifiStaNodes);

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

mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel"); mobility.Install (wifiApNode);

После того как все узлы, каналы и сетевые устройства настроены, пришло время настройки сетевых протоколов:

InternetStackHelper stack; stack.Install (csmaNodes); stack.Install (wifiApNode); stack.Install (wifiStaNodes);

19

и IP-адресов сетевых устройств:

Ipv4AddressHelper address;

address.SetBase ("10.1.1.0", "255.255.255.0"); Ipv4InterfaceContainer p2pInterfaces; p2pInterfaces = address.Assign (p2pDevices);

address.SetBase ("10.1.2.0", "255.255.255.0"); Ipv4InterfaceContainer csmaInterfaces; csmaInterfaces = address.Assign (csmaDevices);

address.SetBase ("10.1.3.0", "255.255.255.0"); address.Assign (staDevices);

address.Assign (apDevices);

Следующая часть кода устанавливает echoServer на крайнем правом узле:

UdpEchoServerHelper echoServer (9);

ApplicationContainer serverApps = echoServer.Install (csmaNodes.Get (nCsma));

serverApps.Start (Seconds (1.0)); serverApps.Stop (Seconds (10.0));

и echoClient на последнем беспроводном узле:

UdpEchoClientHelper echoClient (csmaInterfaces.GetAddress (nCsma), 9);

echoClient.SetAttribute ("MaxPackets", UintegerValue (1)); echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));

echoClient.SetAttribute ("PacketSize", UintegerValue (1024));

ApplicationContainer clientApps = echoClient.Install (wifiStaNodes.Get (nWifi - 1));

clientApps.Start (Seconds (2.0)); clientApps.Stop (Seconds (10.0));

Как и прежде нам необходимо настроить маршрутизацию в нашей сети:

Ipv4GlobalRoutingHelper::PopulateRoutingTables ();

В созданной нами сети есть одна особенность, которая отсутствовала в предыдущих примерах: имитация никогда не будет остановлена и будет выполняться бесконечно. Причиной такого поведения является созданная нами беспроводная точка доступа, которая будет генерировать маяки для беспроводных клиентов в бесконечном цикле. Чтобы избежать такого поведения, необходимо явным образом сообщить NS-3 об окончании имитации через заданный промежуток времени:

Simulator::Stop (Seconds (10.0));

20

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]