This repository was archived by the owner on Sep 9, 2021. It is now read-only.
Лялин Александр /70201 Lab2c #152
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.
Лабораторная №2с DHCP клиент.
Задание
Реaлизовать DHCP клиент.
Описание
DHCP - Dynamic Host Configuration Protocol или он же протокол динамической настройки узла.
Это сетевой протокол, позволяющий сетевым устройствам автоматически получать IP-адрес и другие параметры, необходимые для работы в сети TCP/IP. Данный протокол работает по модели «клиент-сервер». Для автоматической конфигурации компьютер-клиент на этапе конфигурации сетевого устройства обращается к так называемому серверу DHCP и получает от него нужные параметры.
Помимо IP-адреса, DHCP также может сообщать клиенту дополнительные параметры, необходимые для нормальной работы в сети. Эти параметры называются опциями DHCP.
Некоторыми из наиболее часто используемых опций являются:
Рассмотрим процесс получения ip адреса. Процесс состоит из четырёх этапов. Эти этапы часто сокращаются как DORA (Discovery, Offer, Request, и Acknowledgement)
Форматы пакетов DHCP:

В начале клиент выполняет широковещательный запрос по всей физической сети с целью обнаружить доступные DHCP-серверы. Он отправляет сообщение типа DHCPDISCOVER, при этом в качестве IP-адреса источника указывается 0.0.0.0 (если компьютер ещё не имеет собственного IP-адреса), а в качестве адреса назначения —широковещательный адрес 255.255.255.255.
Клиент заполняет несколько полей сообщения начальными значениями:
В поле xid помещается уникальный идентификатор транзакции, который позволяет отличать данный процесс получения IP-адреса от других, протекающих в то же время.
В поле chaddr помещается аппаратный адрес (MAC-адрес) клиента.
Получив сообщение от клиента, сервер определяет требуемую конфигурацию клиента в соответствии с указанными сетевым администратором настройками. Сервер отправляет ему ответ (DHCPOFFER), в котором предлагает конфигурацию. Предлагаемый клиенту IP-адрес указывается в поле yiaddr. Прочие параметры (такие, как адреса маршрутизаторов и DNS-серверов) указываются в виде опций в соответствующем поле.
Это сообщение DHCP-сервер отправляет хосту, пославшему DHCPDISCOVER, на его MAC, при определенных обстоятельствах сообщение может распространяться как широковещательная рассылка. Клиент может получить несколько различных предложений DHCP от разных серверов; из них он должен выбрать то, которое его «устраивает».
Выбрав одну из конфигураций, предложенных DHCP-серверами, клиент отправляет запрос DHCP (DHCPREQUEST) в бродкаст. При этом к опциям, указанным клиентом в сообщении DHCPDISCOVER, добавляется специальная опция — идентификатор сервера — указывающая адрес DHCP-сервера, выбранного клиентом.
Наконец, сервер подтверждает запрос и направляет это подтверждение (DHCPACK) клиенту
Решение
Для реализации клиента DHCP достаточно реализовать механизм составления пакетов DISCOVER и REQUEST т.к только эти пакеты отправляет клиент, так же нужно реализовать механизм парсинга результата, который приходит от сервера.
Создание DISCOVER пакета:
реализуется в классе Client методом def build_discover_pack().
В этом методе формируется большой массив байтов, который как раз и является пакетом.
Мы по очереди к массиву прибавляем каждое поле, пакета DISCOVER (см. рисунок выше первую таблицу.) заполненное нужными данными.
Тип пакета ставится 1 - DISCOVER
поле yiaddr заполняется нулями.
Заполненный пакет, который отправлен был в ходе программы:
Видно что этот пакет широковещательный в пределах домашней сети, о чем свидетельствует 255 в последнем сегменте адреса достижения пакета.
Заполняются поля идентификатора пакета, он должен быть уникальным.
Так же указывается мак адрес.
Создание REQUEST пакета:

реализуется в классе Client методом def build_request_pack(). В этом методе формируется большой массив байтов, который как раз и является пакетом.
Мы по очереди к массиву прибавляем каждое поле, пакета REQUEST (см. рисунок выше третью таблицу.) заполненное нужными данными.
Видно что заполнено поле, которое содержит в себе выбранный ip адрес(предложение) а так же указан адрес узла, чье предложение было принято.
А так же установлен тип 3 - Request
Поскольку нас в большей части интересуют опции, нам достаточно считать опции и еще некоторую информацию.
Пакеты, которые присылает сервер парсятся в методах класса Client:
set_data() - одновременно читает с помощью другого метода данные опции, а потом устанавливает нужную конфигурацию пакета и собирает пакет.
Пример и инструкция по использованию
Поскольку в опыте используется домашняя сеть, и домашний роутер, в коде задается нужный широковещательный адрес для домашней сети.
запускается это дело просто:
....путь\dhcp.py через командную строку.
Результат:

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

Так же его можно отследить в wireshark: