This repository was archived by the owner on Sep 9, 2021. It is now read-only.
Ворошилов Алексей, 3530901/70203 #36
Closed
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Инструкция по использованию
Запустить в терминале:
Описание протокола
Взаимодействие через UDP протокол было реализовано на языке Python.
DHCP - сетевой протокол, позволяющий сетевым устройствам автоматически получать IP-адрес и другие параметры, необходимые для работы в сети TCP/IP. Данный протокол работает по модели «клиент-сервер».
Для автоматической конфигурации компьютер-клиент на этапе конфигурации сетевого устройства обращается к так называемому серверу. DHCP и получает от него нужные параметры. Сетевой администратор может задать диапазон адресов, распределяемых сервером среди компьютеров. Это позволяет избежать ручной настройки компьютеров сети и уменьшает количество ошибок.
Протокол DHCP используется в большинстве сетей TCP/IP.
Формат DHCP пакета
Поля пакета:
opcode - указывает нам на тип DHCP-сообщения. Если в этом поле вы видите значение 0×01, то это говорит нам о том, что сообщение является запросом от клиента к серверу. Такое сообщение еще иногда называется BOOTREQUEST. Если же в поле opCode записано значение 0×02, то это означает, что оно являет ответом DHCP-сервера;
Hardware Type - Тип адреса на канальном уровне;
Hardware Length (hlen) - Длина аппаратного адреса в байтах. Для протокола Ethernet и, соответственно, мак-адресов, указывается значение 0×06;
Hops - Количество промежуточных маршрутизаторов, которые находятся на пути между клиентом и сервером;
Transaction ID - Когда клиент начинает процесс получения IP-адреса, он генерирует значение для этого поля, чтобы сервер не перепутал конкретный процесс этого клиента с другим процессом;
Seconds Elapsed - Время в секундах с момента начала процесса получения IP-адреса, это время обычно никого не интересует и обычно в нем стоят нули: 0×0000;
Flags - Поле для флагов или специальных параметров протокола DHCP;
Client IP Address - Поле, в котором указывается IP-адрес клиента. Клиент заполняет его только в том случае, если у него уже есть IP-адрес и он может ответить на ARP-запрос. Такая ситуация возможно в том случае, если клиент хочет продлить время аренды IP-адреса;
Your ID Address - В это поле DHCP-сервер вписывает IP-адрес, который хочет предложить клиенту;
Server IP Address - IP-адрес сервера. Сервер указывает свой IP-адрес, когда делает DHCPOFFER;
Gateway IP Address - Если используется схема с DHCP Relay Agent, то в этом поле передается его IP-адрес
Client Hardware Address - Если на канальном уровне используется протокол Ethernet, то в это поле записывается MAC-адрес клиента
Server Host Name - Если у сервера есть доменное имя/имя хоста, то он может сообщить его в этом поле, поле не является обязательным
Boot File - Это поле также не является обязательным и служит указателем для бездисковых рабочих станций о том, как называется файл на сервере, которые следует использовать для загрузки;
Options - Поле опций, в котором передается львиная доля полезной информации для динамической конфигурации хоста
Поле опция выглядит как номер опции -> длина опции-> аргументы опции.
Общий принцип работы DHCP
Реализация протокола.
Так как в настоящем протоколов количество опций достаточно большое, то были реализованы только некоторые из них, которые позволяют корректно взаимодействовать с настоящими DHCP серверами и клиентами.
Данный протокол работает на tcp сокетах.
Клиент
При старте клиента он широковещательно рассылает пакет DHCPDISCOVER, в опции 53, 55 и 61.
Опция 53 используется во всех пакетах, и она указывает какой тип пакета пересылается. В данном случае значения данной опции равно 1, что означает, что это DHCPDISCOVER.
В опции 55 указываются данные, которые мы запрашиваем. В данном случае 1 – Subnet Mask, 3 – Routers, 6 – DNS сервер. В опции 61 указывается мак адрес клиента.
После отправки пакета клиент прослушивает порт и ожидает ответа. После получения посылки клиент анализирует её с помощью функций options_analyzer и options_handler. Функция options_analyzer анализирует пакет и записывает опции и аргументы в удобном виде:
После этого функция options_handler проходится по всем опциям и в зависимости от значения опции обрабатывает аргументы. Опция в 51 сервер присылает клиенту время, на которое он выдает ему IP адрес. В зависимости от типа пришедшей посылки клиент либо отправляет свой пакет, либо если ему пришло подтверждение запрошенного IP адреса выводит свой IP и время на которое он его получил.
После получения IP адреса, клиент отправляет обратно пакет DHCPREQUEST в котором просит сервер выдать ему данный IP адрес. Затем клиент ждет следующую посылку от сервера. Если пришедшая посылка это DHCPACK от сервера, то клиент берет полученный IP адрес.
Для тестирования клиентского приложения использован сервер, написанный Шелеповым В.А.