Skip to content
This repository was archived by the owner on Sep 9, 2021. It is now read-only.

Conversation

alekseivoroshilov
Copy link

@alekseivoroshilov alekseivoroshilov commented Nov 30, 2020

Инструкция по использованию

Запустить в терминале:

client.py

client

Демонстрация использования

Описание протокола

Взаимодействие через 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

  1. Устройство (клиент) рассылает широковещательный UDP запрос (DHCPDISCOVER) по всей сети с запросом «ну кто-нибудь, дайте мне IP адрес». Причем обычно (но не всегда) запрос происходит с 68 порта (источник), а назначение — 67 порт (назначение). Некоторые устройства отправляют пакеты и с 67 порта. Внутри пакета DHCPDISCOVER включен MAC адрес устройства клиента.
  2. Все сервера DHCP, находящиеся в сети (а их может быть несколько), формируют для устройства, отправившего DHCPDISCOVER, предложение DHCPOFFER с сетевыми настройками, и также широковещательно его отсылает его по сети. Идентификация кому предназначен этот пакет идет по MAC адресу клиента, предоставленного ранее в запросе DHCPDISCOVER.
  3. Клиент принимает пакеты с предложениями сетевых настроек, выбирает наиболее привлекательный (критерии могут быть различными, например, в т.ч. и по времени доставки пакета, количестве промежуточных маршрутов), и делает у понравившегося сервера DHCP «официальный запрос» DHCPREQUEST с сетевыми настройками. В этом случае пакет идет уже к конкретному серверу DHCP.
  4. Сервер, получивший DHCPREQUEST, отправляет пакет формата DHCPACK, в котором в очередной раз перечисляет сетевые настройки, предназначенные для данного клиента
    Реализация протокола.
    Так как в настоящем протоколов количество опций достаточно большое, то были реализованы только некоторые из них, которые позволяют корректно взаимодействовать с настоящими DHCP серверами и клиентами.
    Данный протокол работает на tcp сокетах.

Клиент

При старте клиента он широковещательно рассылает пакет DHCPDISCOVER, в опции 53, 55 и 61.

Опция 53 используется во всех пакетах, и она указывает какой тип пакета пересылается. В данном случае значения данной опции равно 1, что означает, что это DHCPDISCOVER.
В опции 55 указываются данные, которые мы запрашиваем. В данном случае 1 – Subnet Mask, 3 – Routers, 6 – DNS сервер. В опции 61 указывается мак адрес клиента.

После отправки пакета клиент прослушивает порт и ожидает ответа. После получения посылки клиент анализирует её с помощью функций options_analyzer и options_handler. Функция options_analyzer анализирует пакет и записывает опции и аргументы в удобном виде:

{'53': [2], '54': [192, 168, 0, 1], '51': [0, 0, 26, 36], '1': [255, 255, 255, 0], '3': [192, 168, 0, 1], '6': [192, 168, 0, 1]}

После этого функция options_handler проходится по всем опциям и в зависимости от значения опции обрабатывает аргументы. Опция в 51 сервер присылает клиенту время, на которое он выдает ему IP адрес. В зависимости от типа пришедшей посылки клиент либо отправляет свой пакет, либо если ему пришло подтверждение запрошенного IP адреса выводит свой IP и время на которое он его получил.

После получения IP адреса, клиент отправляет обратно пакет DHCPREQUEST в котором просит сервер выдать ему данный IP адрес. Затем клиент ждет следующую посылку от сервера. Если пришедшая посылка это DHCPACK от сервера, то клиент берет полученный IP адрес.

Для тестирования клиентского приложения использован сервер, написанный Шелеповым В.А.

@wrbbz wrbbz added the Вторая лабораторная Реальные UDP протоколы label Dec 2, 2020
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Вторая лабораторная Реальные UDP протоколы Зачтено
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants