
Практика 4
.docxСеть устроена следующим образом 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;
}