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

Conversation

Alexandro9911
Copy link

Лабораторная №2с DHCP клиент.

Задание

Реaлизовать DHCP клиент.

Описание

DHCP - Dynamic Host Configuration Protocol или он же протокол динамической настройки узла.
Это сетевой протокол, позволяющий сетевым устройствам автоматически получать IP-адрес и другие параметры, необходимые для работы в сети TCP/IP. Данный протокол работает по модели «клиент-сервер». Для автоматической конфигурации компьютер-клиент на этапе конфигурации сетевого устройства обращается к так называемому серверу DHCP и получает от него нужные параметры.

Помимо IP-адреса, DHCP также может сообщать клиенту дополнительные параметры, необходимые для нормальной работы в сети. Эти параметры называются опциями DHCP.
Некоторыми из наиболее часто используемых опций являются:

  • IP-адрес маршрутизатора по умолчанию
  • маска подсети;
  • адреса серверов DNS;
  • имя домена DNS.

Рассмотрим процесс получения ip адреса. Процесс состоит из четырёх этапов. Эти этапы часто сокращаются как DORA (Discovery, Offer, Request, и Acknowledgement)

Форматы пакетов DHCP:
image

  1. DISCOVERY

В начале клиент выполняет широковещательный запрос по всей физической сети с целью обнаружить доступные DHCP-серверы. Он отправляет сообщение типа DHCPDISCOVER, при этом в качестве IP-адреса источника указывается 0.0.0.0 (если компьютер ещё не имеет собственного IP-адреса), а в качестве адреса назначения —широковещательный адрес 255.255.255.255.

Клиент заполняет несколько полей сообщения начальными значениями:

В поле xid помещается уникальный идентификатор транзакции, который позволяет отличать данный процесс получения IP-адреса от других, протекающих в то же время.
В поле chaddr помещается аппаратный адрес (MAC-адрес) клиента.

  1. OFFER

Получив сообщение от клиента, сервер определяет требуемую конфигурацию клиента в соответствии с указанными сетевым администратором настройками. Сервер отправляет ему ответ (DHCPOFFER), в котором предлагает конфигурацию. Предлагаемый клиенту IP-адрес указывается в поле yiaddr. Прочие параметры (такие, как адреса маршрутизаторов и DNS-серверов) указываются в виде опций в соответствующем поле.

Это сообщение DHCP-сервер отправляет хосту, пославшему DHCPDISCOVER, на его MAC, при определенных обстоятельствах сообщение может распространяться как широковещательная рассылка. Клиент может получить несколько различных предложений DHCP от разных серверов; из них он должен выбрать то, которое его «устраивает».

  1. REQUEST

Выбрав одну из конфигураций, предложенных DHCP-серверами, клиент отправляет запрос DHCP (DHCPREQUEST) в бродкаст. При этом к опциям, указанным клиентом в сообщении DHCPDISCOVER, добавляется специальная опция — идентификатор сервера — указывающая адрес DHCP-сервера, выбранного клиентом.

  1. ACK
    Наконец, сервер подтверждает запрос и направляет это подтверждение (DHCPACK) клиенту

Решение

Для реализации клиента DHCP достаточно реализовать механизм составления пакетов DISCOVER и REQUEST т.к только эти пакеты отправляет клиент, так же нужно реализовать механизм парсинга результата, который приходит от сервера.

Создание DISCOVER пакета:

реализуется в классе Client методом def build_discover_pack().
В этом методе формируется большой массив байтов, который как раз и является пакетом.
Мы по очереди к массиву прибавляем каждое поле, пакета DISCOVER (см. рисунок выше первую таблицу.) заполненное нужными данными.
Тип пакета ставится 1 - DISCOVER
поле yiaddr заполняется нулями.
Заполненный пакет, который отправлен был в ходе программы:

image

Видно что этот пакет широковещательный в пределах домашней сети, о чем свидетельствует 255 в последнем сегменте адреса достижения пакета.
Заполняются поля идентификатора пакета, он должен быть уникальным.
Так же указывается мак адрес.

Создание REQUEST пакета:
реализуется в классе Client методом def build_request_pack(). В этом методе формируется большой массив байтов, который как раз и является пакетом.
Мы по очереди к массиву прибавляем каждое поле, пакета REQUEST (см. рисунок выше третью таблицу.) заполненное нужными данными.
image

Видно что заполнено поле, которое содержит в себе выбранный ip адрес(предложение) а так же указан адрес узла, чье предложение было принято.
А так же установлен тип 3 - Request

Поскольку нас в большей части интересуют опции, нам достаточно считать опции и еще некоторую информацию.
Пакеты, которые присылает сервер парсятся в методах класса Client:
set_data() - одновременно читает с помощью другого метода данные опции, а потом устанавливает нужную конфигурацию пакета и собирает пакет.

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

Поскольку в опыте используется домашняя сеть, и домашний роутер, в коде задается нужный широковещательный адрес для домашней сети.
запускается это дело просто:
....путь\dhcp.py через командную строку.

Результат:
image

Был отправлен широковещательный запрос, и домашний роутер ответил на него. В итоге выполнился цикл DORA.
Так же его можно отследить в wireshark:
image

@Alexandro9911 Alexandro9911 changed the title Lab2c Лялин Александр /70201 Lab2c Feb 26, 2021
@wrbbz wrbbz added Вторая лабораторная Реальные UDP протоколы Зачтено labels Feb 27, 2021
@wrbbz wrbbz closed this Feb 27, 2021
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.

2 participants