This repository has been archived by the owner on Sep 9, 2021. It is now read-only.
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.
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
Пакеты имеют одинаковую структуру из одинаковых полей с ситуативно разным наполнением. Опознание пакетов проводится через первую опцию
(«волшебные числа»), позволяющие серверу определить наличие этого поля. Поле имеет переменную длину, однако DHCP-клиент должен быть готов принять DHCP-сообщение длиной в 576 байт (в этом сообщении поле options имеет длину 340 байт).
Примет пакета DISCOVER
Пример пакета OFFER
Пример пакета REQUEST
Пример пакета ACKNOWLEDGMENT
Инструкция по запуску
Проект написан на C.
make -f Makefile
./dhcp_client
Процесс тестирования
В процессе тестирования можно воспользоваться программой wireshark, которая может отслеживать приходящие и уходящие пакеты. С помощью фильтров можно отследить только dhcp пакеты, что я и сделал: