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

Гусев Никита 3530901/70203 lab2_client #88

Closed
wants to merge 2 commits into from

Conversation

l1feforce
Copy link

DHCP client

Описание протокола
DHCP протокол - расширяющий BOOTP протокол и имеющий с ним обратную совместимость, протокол, использующийся для выдачи IP компьютерам, подключающимся к сети, в которой у них еще нет IP. DHCP клиент, подключающийся к сети, отправляет пакет DISCOVER с уникальным числом на широковещательный адрес, где его должен поймать какой-то DHCP сервер. Этот сервер широковещательно отправляет пакет OFFER(изначально предполагалось отправлять пакет таргетировано на MAC, но может использоваться и широковещательная рассылка), где используется уникальное число, которое клиент сгенерировал, когда отправлял DISCOVER, и по этому числу клиент должен опознать OFFER. Предполагаемый IP адрес, который сервер хочет выдать клиенту, указывается в сообщении, а все остальные параметры передаются в опциях. Чтобы исключить согласие клиента с несколькими предложенными адресами сразу, клиент выбирает первый пришедший оффер, и начинается проверка. Эта проверка состоит в том, чтобы клиент отправил сообщение типа REQUEST с тем IP адресом, который ему предложил сервер в OFFER так же широковещательно. В этом случае, только тот сервер, который выслал OFFER, ответит подтверждением - ACK, или отказом - NACK, и когда сервер отправляет ACK так же широковещательно, после этого он уже считает, что у клиента тот адрес, который сервер предложил в OFFER и с которым согласился клиент в REQUEST. Клиент, получая ACK, теперь считает, что этот адрес зарезервирован за клиентом(время аренды указывается в опциях). По истечении половины срока аренды адреса клиент высылает запрос на обновление адреса на сервер, и подтверждение на обновление аренды работает почти так же, как и запрос адреса, с тем только отличием, что клиент уже имеет адрес.

Описание пакетов
Здесь я рассмотрю устройство 4х основных пакетов - DISCOVER, OFFER, REQUEST, ACKNOWLEDGMENT
Пакеты имеют одинаковую структуру из одинаковых полей с ситуативно разным наполнением. Опознание пакетов проводится через первую опцию

  • op - (1 byte) -Тип сообщения. Например может принимать значения: BOOTREQUEST (0x01, запрос от клиента к серверу) и BOOTREPLY (0x02, ответ от сервера к клиенту).
  • htype - (1 byte) - Тип аппаратного адреса. Допустимые значения этого поля определены в RFC 1700 «Assigned Numbers». Например, для MAC-адреса Ethernet это поле принимает значение 0x01.
  • hlen - (1 byte) - Длина аппаратного адреса в байтах. Для MAC-адреса Ethernet —0x06.
  • hops - (1 byte) - Количество промежуточных маршрутизаторов (так называемых агентов ретрансляции DHCP), через которые прошло сообщение. Клиент устанавливает это поле в 0x00.
  • xid - (4 byte) - Уникальный идентификатор транзакции в 4 байта, генерируемый клиентом в начале процесса получения адреса.
  • secs - (2 byte) - Время в секундах с момента начала процесса получения адреса. Может не использоваться (в этом случае оно устанавливается в 0x0000).
  • flags - (2 byte) - Поле для флагов — специальных параметров протокола DHCP.
  • ciaddr - (4 byte) - IP-адрес клиента. Заполняется только в том случае, если клиент уже имеет собственный IP-адрес и способен отвечать на запросы ARP (это возможно, если клиент выполняет процедуру обновления адреса по истечении срока аренды).
  • yiaddr - (4 byte) - Новый IP-адрес клиента, предложенный сервером.
  • siaddr - (4 byte) - IP-адрес сервера. Возвращается в предложении DHCP
  • giaddr - (4 byte) - IP-адрес агента ретрансляции, если таковой участвовал в процессе доставки сообщения DHCP до сервера.
  • chaddr - (4 byte) - Аппаратный адрес (обычно MAC-адрес) клиента.
  • sname - (16 byte) - Необязательное имя сервера в виде нуль-терминированной строки.
  • file - (64 byte) - Необязательное имя файла на сервере, используемое бездисковыми рабочими станциями при удалённой загрузке. Как и sname, представлено в виде нуль-терминированной строки.
  • options - (unknown length) - Поле опций DHCP. Здесь указываются различные дополнительные параметры конфигурации. В начале этого поля указываются четыре особых байта со значениями 99, 130, 83, 99

(«волшебные числа»), позволяющие серверу определить наличие этого поля. Поле имеет переменную длину, однако DHCP-клиент должен быть готов принять DHCP-сообщение длиной в 576 байт (в этом сообщении поле options имеет длину 340 байт).

Примет пакета DISCOVER
image

Пример пакета OFFER
image

Пример пакета REQUEST
image

Пример пакета ACKNOWLEDGMENT
image

Инструкция по запуску
Проект написан на C.

  • Скачать проект
  • Скомпилировать make -f Makefile
  • Запустить ./dhcp_client

Процесс тестирования
В процессе тестирования можно воспользоваться программой wireshark, которая может отслеживать приходящие и уходящие пакеты. С помощью фильтров можно отследить только dhcp пакеты, что я и сделал:
Снимок экрана 2021-01-16 в 01 52 28

  • Отправка DHCP DISCOVERY

Снимок экрана 2021-01-16 в 01 54 10

  • Получение DHCP OFFER

Снимок экрана 2021-01-16 в 01 55 00

  • Отправка DHCP REQUEST

Снимок экрана 2021-01-16 в 01 55 15

  • Получение DHCP ACK

Снимок экрана 2021-01-16 в 01 55 29

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants