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

Практика 4

.docx
Скачиваний:
0
Добавлен:
02.07.2025
Размер:
277.72 Кб
Скачать

Сеть устроена следующим образом node 0 – клиент, который отправляет пакеты. node 1 – сервер 1, который принимает пакеты и отвечает на них. node 2 – сервер 2, который заменяет сервер 1 после его отключения.

Сначала происходит работа node 0 – клиента и node 1 – сервера 1, отправляются пакеты и происходит на них ответ, что представлено на рисунке 1.

Рисунок 1 – Успешная отправка пакетов между клиентом и сервером 1

Далее связь node 0 – клиента и node 1 – сервер 1 рушится и отправляются пакеты по новой связи node 0 – клиента и node 2 – сервера 2, но в это же время node 0 – клиент пытает отправить пакеты на node 1 – сервер 1, но получает сообщение о том, что узел недоступен, что представлено на рисунке 2.

Рисунок 2 – Успешная отправка пакетов между клиентом и сервером 2 и невозможность отправки пакетов на сервер 1

Приложение

Код подписан комментариями для понятности

#include "ns3/core-module.h"

#include "ns3/network-module.h"

#include "ns3/internet-module.h"

#include "ns3/point-to-point-module.h"

#include "ns3/applications-module.h"

using namespace ns3;

// объявление для pcap-файла

Ptr<PcapFileWrapper> PcapFile1;

// метод для записи пакетов в pcap-файл

void Write(Ptr<const Packet> packet)

{

if (PcapFile1)

{

PcapFile1->Write(Simulator::Now(), packet);

}

}

int main(int argc, char *argv[]) {

// 3 обьекта

NodeContainer nodes;

nodes.Create(3);

// обьявление соединения точка-точка

PointToPointHelper p2p;

p2p.SetDeviceAttribute("DataRate", StringValue("5Mbps"));

p2p.SetChannelAttribute("Delay", StringValue("2ms"));

// соединение объекта 0 и 1

NetDeviceContainer devices01 = p2p.Install(nodes.Get(0), nodes.Get(1));

// это добавление архитектуры TCP/IP ко всем объектам

InternetStackHelper stack;

stack.Install(nodes);

Ipv4AddressHelper address;

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

Ipv4InterfaceContainer interfaces01 = address.Assign(devices01);

// время работы обьекта 1 или сервера 1

UdpEchoServerHelper echoServer(9);

// время работы обьекта 1 или сервера 1

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

serverApps.Start(Seconds(0.0));

serverApps.Stop(Seconds(6.0));

// отправка пакетов между объектом 0 и объектом 1 (сервером 1)

UdpEchoClientHelper Client(interfaces01.GetAddress(1), 9);

Client.SetAttribute("MaxPackets", UintegerValue(10));

Client.SetAttribute("Interval", TimeValue(Seconds(0.5)));

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

ApplicationContainer Cont = Client.Install(nodes.Get(0));

Cont.Start(Seconds(1.0));

Cont.Stop(Seconds(6.0));

// отправка пакетов после отключения сервера 1

UdpEchoClientHelper Client_(interfaces01.GetAddress(1), 9);

Client_.SetAttribute("MaxPackets", UintegerValue(10));

Client_.SetAttribute("Interval", TimeValue(Seconds(0.5)));

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

ApplicationContainer Cont_ = Client_.Install(nodes.Get(0));

Cont_.Start(Seconds(6.1));

Cont_.Stop(Seconds(11.0));

// соединение объекта 0 и 2

NetDeviceContainer devices02 = p2p.Install(nodes.Get(0), nodes.Get(2));

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

Ipv4InterfaceContainer interfaces02 = address.Assign(devices02);

// время работы обьекта 2 или сервера 2

ApplicationContainer serverApps2 = echoServer.Install(nodes.Get(2));

serverApps2.Start(Seconds(6.1));

serverApps2.Stop(Seconds(11.0));

// отправка пакетов между объектом 0 и объектом 2 (сервером 2)

UdpEchoClientHelper Client2(interfaces02.GetAddress(1), 9);

Client2.SetAttribute("MaxPackets", UintegerValue(10));

Client2.SetAttribute("Interval", TimeValue(Seconds(0.5)));

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

ApplicationContainer Cont2 = Client2.Install(nodes.Get(0));

Cont2.Start(Seconds(6.5));

Cont2.Stop(Seconds(11.0));

// запись pcap-файл

PcapHelper pcapHelper;

PcapFile1 = pcapHelper.CreateFile("traffic.pcap", std::ios::out, PcapHelper::DLT_PPP);

for (uint32_t i = 0; i < nodes.GetN(); ++i) {

Ptr<Node> node = nodes.Get(i);

for (uint32_t j = 0; j < node->GetNDevices(); ++j) {

Ptr<NetDevice> dev = node->GetDevice(j);

dev->TraceConnectWithoutContext("MacRx", MakeCallback(&Write));

}

}

Simulator::Run();

Simulator::Destroy();

return 0;

}

Соседние файлы в предмете Моделирование сетевых протоколов