Простой симулятор передачи пакетов в локальной сети
Моделирует передачу в локальной сети между устройствами и отображает путь пакета. Создан в рамках курсового проекта по курсу Сети ЭВМ и телекоммуникации
- Создание сети из ПК, хабов, роуетров
- Отправка пакета с ПК на произвольный IP
- Отображение маршрута всех пакетов
- Роутеры с поддержкой статической маршрутизации и PROXY-таблицы
- Визуальное отображение схемы сети
- Анимация передачи пакетов
Основа симулятора выполнена в виде велосипедов, скрепленных синей изолентой с костылями в виде библиотеки, содержащей компоненты
Windows Forms.
Список компонентов:
PC | Рабочая станиця. Имеет один интерфейс. Может послыать пакеты на другие узлы сети |
---|---|
Hub | Неуправляемый хаб. Рассылает пакеты на все порты, кромп того, с которого он пришел.Имеет произвольное число интерфейсов. |
Server | Роуетр. Осуществляет маршрутизацию. Имеет произвольное число интерфейсов |
PCGroup | Группа ПК. Автоматически создает много ПК с IP в заданном диапазоне |
Gate | Шлюз в интернет. Не реализован адекватно. Работает как ПК, не умеющий отправлять пакет. |
Все они должны располагаться на NetDrawer, который отвечает за отрисовку связей между ними и анимацию пакетов.
Ниже приведен пример необходимых предварительных настроек
Logger.TextWrited += Logger_TextWrited;
PackageManager.NewPackage += PackageManager_NewPackage;
AbstractNetworkDevice.SendingDrawDelay = 1000; //Время анимации отправки пакета
AbstractNetworkDevice.Drawer = netDrawer1; //Указание объекта, использующегося для анимации пакетов
Logger
- отвечает за логгирование прохождения пакетов при помощи событий и в отладочную консоль.
PackageManager
- хранит все существующие пакеты в системе, информаирует об изменении их состояния и добавлении новых.
Далее необходимо сконфигурировать сеть. После этого необходимо завершить настройку.
netDrawer1.Init();
netDrawer1.UpdateConnections();
Для анимации пакетов необходимо таймеров вызывать метод NetDrawer.UpdatePackages(uint interval)
Компоненты можно расположить в конструкторе форм или создать программно. После этого их надо настроиь и соединить:
Необходимо задать IP и маску подсети. Опционально - задать основной шлюз
admin.SetIP("197.253.67.10/24");
admin.SetGateway("197.253.67.1");
Просто указать количество портов свойством InterfacesCount_U
(можно в конструкторе)
Указать список IP и масок интерфейсов, задать таблицу маршрутизации и PROXY-таблицу. Количество интерфейсов - это params
, сколько IP
перечислите - столько интерфейсов и будет создано
server1.SetIP("197.253.85.2/24", "197.253.91.2/24");
server1.SetRoute(
@"197.253.67.0;255.255.255.0;197.253.91.1;1
197.253.85.0;255.255.255.0;-;0");
server1.SetProxy(
@"197.253.85.3-197.253.85.4;any;pass
197.253.85.130-197.253.85.131;any;deny
197.253.67.10;any;pass");
Указывается начальный и конечный IP-адреса диапазона, маска и основной шлюз
pcGroup1.SetPCs("197.253.85.3", "197.253.85.4", "255.255.255.128", "197.253.85.2");
Для соединения устройств необходимо установить соответстве между портами.
/// <summary>
/// Подключает другое устройство к этому устройству
/// </summary>
/// <param name="port_number">Номер порта, к которому подключается</param>
/// <param name="device">Подключаемое устройство</param>
/// <returns></returns>
public void Connect(int port_number, AbstractNetworkDevice device)
/// <summary>
/// Подключает другое устройство к этому устройству
/// </summary>
/// <param name="port_number">Номер порта, к которму подключается</param>
/// <param name="other_port_number">Номер порта на другом устройстве, которым оно полкючается</param>
/// <param name="device">Подключаемое устройство</param>
public void DuplexConnect(int port_number, int other_port_number, AbstractNetworkDevice device)
Connect
устанавливает связь устройства с текущим, но не наоборот (такой вот косяк). Чтобы сделать нормальное двустороннее соединение
используйте DuplexConnect
PCGroup соединяется путем указания начального порта. Например, если указан начальный порт 1, и подключается группа из 3х ПК, они займут порты 1,2,3.
Пример: Создание группы ПК, подключение ее к хабу, а хаба - к роутеру
pcGroup1.SetPCs("197.253.85.3", "197.253.85.4", "255.255.255.128", "197.253.85.2");
pcGroup1.Connect(hub1, 1);
server1.SetIP("197.253.85.2/24", "197.253.91.2/24");
server1.SetRoute(
@"197.253.67.0;255.255.255.0;197.253.91.1;1
197.253.85.0;255.255.255.0;-;0");
server1.SetProxy(
@"197.253.85.3-197.253.85.4;any;pass
197.253.67.10;any;pass");
hub1.DuplexConnect(0, 0, server1);
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
Everyone is permitted to copy and distribute verbatim or modified
copies of this license document, and changing it is allowed as long
as the name is changed.
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. You just DO WHAT THE FUCK YOU WANT TO.
Марков Алексей, 2016