Метод динамического назначения адресов особенно удобен для клиентов DHCP, нуждающихся в IP-адресе для временного подключения к сети. Для примера рассмотрим сеть класса С, к которой могут подключаться до 300 мобильных пользователей с портативными компьютерами. Сеть класса С может содержать до 253 узлов B55 - 2 специальных адреса = 253). Поскольку компьютеры, подключающиеся к сети через TCP/IP, должны обладать уникальными IP-адресами, все 300 компьютеров не могут подключиться к сети одновременно. Тем не менее, если в любой момент времени в сети возможно не более 200 физических подключений, появляется возможность переназначения неиспользуемых адресов класса С за счет применения механизма динамического назначения адресов DHCP.
Динамическое назначение адресов также хорошо подходит для назначения IP-адресов новым хостам с постоянным подключением в ситуациях, когда свободных адресов не хватает. По мере отключения из сети старых хостов их IP-адреса могут немедленно назначаться новым хостам.
Какой бы из трех способов назначения IP-адресов ни был избран, вы все равно сможете один раз настроить параметры IP на центральном сервере DHCP вместо того, чтобы повторять настройку конфигурации TCP/IP для каждого компьютера по отдельности.
Обратившись с запросом к серверу DHCP, клиент DHCP проходит ряд внутренних стадий, во время которых он согласовывает с сервером срок и область использования IP-адреса. Процесс получения IP-адреса клиентом DHCP лучше всего объяснить на диаграмме переходов (то есть конечного автомата). На Рис.6 "Диаграмма переходов для протокола DHCP, поясняющая процесс взаимодействия между клиентом и сервером" изображена диаграмма, поясняющая процесс взаимодействия между клиентом и сервером DHCP.
При первом запуске клиент DHCP находится в состоянии ИНИЦИАЛИЗАЦИЯ. На этой стадии клиент DHCP еще не знает своих параметров IP, поэтому он рассылает запрос DHCPDISCOVER, инкапсулированный в пакете UDP/IP. В пакете указан приемный порт UDP 67 (десят) - такой же, как у сервера ВООТР, потому что протокол DHCP является расширением ВООТР. В пакете DHCPDISCOVER используется адрес локальной рассылки 255.255.255.255. Если серверы DHCP находятся за пределами локального сегмента, на маршрутизаторе IP должен работать агент-ретранслятор, который перешлет запрос DHCPDISCOVER в другие подсети. Поддержка агентов-ретрансляторов DHCP рассматривается в RFC 1542.
Прежде чем рассылать запрос DHCPDISCOVER, клиент DHCP выдерживает паузу случайной продолжительности от 1 до 10 секунд. Это делается для того, чтобы предотвратить одновременное начало работы клиентов DHCP при их одновременном включении (как иногда происходит после сбоя питания).
После рассылки запроса DHCPDISCOVER клиент DHCP входит в состояние ВЫБОР. В этом состоянии клиент DHCP получает сообщения DHCPOFFER от серверов DHCP, настроенных для ответа этому клиенту. Период времени, в течение которого клиент DHCP ожидает сообщения DHCPOFFER, зависит от реализации. Если клиент получает сразу несколько ответов DHCPOFFER, он должен выбрать один из них. Выбрав сообщение DHCPOFFER от одного из серверов, клиент DHCP посылает этому серверу сообщение DHCPREQUEST. Сервер DHCP отвечает сообщением DHCPACK.
Дополнительно клиент DHCP может проверить IP-адрес, переданный в сообщении DHCPACK, и убедиться в том, что этот адрес не используется. В сетях с широковещательной рассылкой клиент DHCP может отправить по указанному адресу запрос ARP и проверить наличие ответа ARP. Получение ответа ARP означает, что предложенный IP-адрес уже используется; в этом случае ответ DHCPACK от сервера игнорируется, отправляется ответ DHCPDECLINE, а клиент DHCP переходит в исходное состояние ИНИЦИАЛИЗАЦИЯ и пытается получить свободный IP-адрес. При рассылке запроса ARP в локальной сети клиент указывает в пакете ARP собственный аппаратный адрес в поле аппаратного адреса отправителя, но в поле IP-адреса отправителя заносится нулевое значение. Нулевой IP-адрес используется вместо предложенного IP-адреса, чтобы избежать возможной путаницы с кэшами ARP других хостов TCP/IP (в том случае, если предложенный IP-адрес уже используется).
Когда клиент получает от сервера DHCP сообщение DHCPACK, он определяет три временных интервала и переходит в состояние ПРИВЯЗКА. Первый интервал Т1 определяет срок возобновления аренды; второй интервал Т2 определяет срок повторной привязки; третий интервал ТЗ определяет продолжительность аренды.
С сообщением DHCPACK всегда возвращается значение ТЗ, то есть продолжительность аренды. Значения Т1 и Т2 настраиваются на сервере DHCP, а если они не были заданы, используются значения по умолчанию, основанные на продолжительности срока аренды, рассчитанные по следующим формулам:
Т1 = интервал возобновления Т2 = интервал повторной привязки ТЗ = продолжительность аренды Т1 = 0,5 х ТЗ
Т2 = 0,875 х ТЗ
Моменты времени, в которые происходит тайм-аут, вычисляются прибавлением интервала ко времени отправки сообщения DHCPREQUEST, по которому было сгенерировано подтверждение DHCPACK.
Если запрос DHCP был отправлен в момент ТО, то моменты тайм-аута по всем трем интервалам вычисляются по следующим формулам:
тайм-аут по Т1 = ТО + Т1
тайм-аут по Т2 - ТО + Т2
тайм-аут по ТЗ в ТО + ТЗ
В RFC 2131 рекомендуется увеличивать Т1 и Т2 на величину случайной задержки, чтобы предотвратить одновременное наступление тайм-аута на нескольких клиентах DHCP.
При истечении интервала Т1 клиент DHCP переходит из состояния ПРИВЯЗКА в состояние ВОЗОБНОВЛЕНИЕ. В этом состоянии клиент DHCP должен согласовать с сервером DHCP, выдавшим исходный IP-адрес, новый срок аренды для назначенного IP-адреса. Если исходный сервер DHCP отказывается возобновить аренду, он посылает сообщение DHCPNAK; клиент возвращается в состояние ИНИЦИАЛИЗАЦИЯ и пытается получить новый IP-адрес. Если исходный сервер DHCP отправляет сообщение DHCPACK, в этом сообщении указывается новая продолжительность аренды. Клиент DHCP снова устанавливает интервалы Tl, T2 и ТЗ и переходит в состояние ПРИВЯЗКА.
Если интервал Т2 истекает в тот момент, когда клиент DHCP в состоянии ВОЗОБНОВЛЕНИЕ ожидает сообщения DHCPACK или DHCPNAK от исходного сервера DHCP, клиент переходит из состояния ВОЗОБНОВЛЕНИЕ в состояние ПОВТОРНОЕ СВЯЗЫВАНИЕ. Исходный сервер DHCP может не ответить из-за того, что он временно недоступен или из-за сбоя в сетевом канале. Из приведенных выше формул видно, что Т2 > Т1, поэтому клиент DHCP дополнительно ждет возобновления аренды в течение времени Т2-Т1.
При истечении интервала Т2 в сети рассылается широковещательный запрос DHCPREQUEST для всех серверов DHCP, способных возобновить аренду; клиент DHCP находится в состояние ПОВТОРНОЕ СВЯЗЫВАНИЕ. Рассылка запроса объясняется тем, что после ожидания Т2-Т1 секунд в состоянии ВОЗОБНОВЛЕНИЕ клиент DHCP приходит к выходу, что исходный сервер DHCP недоступен, и пытается связаться с любым сервером DHCP, способным ему ответить. Если сервер DHCP отвечает сообщением DHCPACK, клиент DHCP возобновляет аренду (ТЗ), задает интервалы Т1 и Т2 и переходит в состояние ПРИВЯЗКА. Если ни один сервер DHCP не сможет возобновить аренду до истечения интервала ТЗ, аренда становится недействительной и клиент DHCP переходит в состояние ИНИЦИАЛИЗАЦИЯ. Обратите внимание: к этому моменту клиент DHCP уже дважды пытался возобновить аренду - сначала с исходного сервера DHCP, а затем с любого сервера DHCP в сети.
При истечении срока аренды (ТЗ) клиент DHCP должен прекратить использование IP-адреса и все сетевые операции с этим IP-адресом.
Чтобы прекратить использование IP-адреса, клиент DHCP не обязан дожидаться истечения срока аренды (ТЗ). Он может намеренно отказаться от использования IP-адреса, отменив аренду. Предположим, пользователь с портативным компьютером подключился к сети для выполнения некоторой операции. Сервер DHCP в сети предоставил ему IP-адрес сроком на один час. Пользователь закончил свою работу за 30 минут и теперь хочет отключиться от сети. В процессе корректного отключения компьютера клиент DHCP посылает серверу сообщение DHCPRELEASE, чтобы сервер отменил аренду досрочно. Возвращенный IP-адрес в дальнейшем может использоваться другим клиентом.
Если клиент DHCP работает на компьютере, оснащенном жестким диском, то IP-адрес может храниться на этом диске и при запуске компьютера клиент может запросить использовавшийся ранее адрес. На рис.8.6 этой ситуации соответствует состояние "ПЕРЕЗАГРУЗКА с известным IP-адресом".
Структура сообщения DHCP изображена на рис.7 "Формат пакета DHCP". В сообщениях DHCP все поля имеют фиксированный формат, кроме поля дополнительных данных, минимальный размер которого равен 312 октетам. Видно, что сообщения DHCP и ВООТР имеют почти одинаковый формат, не считая полей флагов и дополнительных параметров. Более того, сервер DHCP может быть настроен на обработку запросов ВООТР (процедура настройки зависит от операционной системы).
Отдельные поля сообщений протокола DHCP описаны в табл.3 "Поля сообщений DHCP". В поле флагов используется только крайний левый бит (рис.8 "Формат пакета DHCP"), остальные биты должны быть равны нулю.
Поле | Длина в октетах | Описание |
ор | 1 | Тип сообщения: 1 - запрос (BOOTREQUEST), 2 - ответ (BOOTREPLY) |
htype | 1 | Тип аппаратного адреса. Значения совпадают со значениями аналогичного поля в пакетах ARP. Например, код 1 соответствует сети Ethernet 10 Мбит/с |
hlen | 1 | Длина аппаратного адреса в октетах. Аппаратные адреса Ethernet и Token Ring имеют длину 6 байт |
hops | 1 | Поле обнуляется клиентом DHCP. Может использоваться агентом-ретранслятором, работающим на маршрутизаторе, при пересылке сообщений DHCP |
xid | 1 | Код транзакции - случайное число, задаваемое клиентом DHCP при построении сообщения. Сервер DHCP использует код транзакции в своих ответах клиенту. Наличие кода xid позволяет клиентам и серверам DHCP связать сообщение DHCP с ответом |
seсs | 1 | Заполняется клиентом DHCP. Содержит количество секунд, прошедших с начала загрузки клиента |
flags | 2 | Если крайний левый бит равен 1, сообщение является широковещательным. Все остальные биты должны быть равны 0 |
ciaddr | 4 | IP-адрес клиента DHCP. Заполняется клиентом в сообщении DHCPREQUEST, предназначенном для проверки использования ранее назначенных параметров конфигурации. Если клиент не знает свой IP-адрес, полю присваивается 0 |
yiaddr | 4 | IP-адрес клиента DHCP, возвращаемый сервером DHCP |
siaddr | 4 | IP-адрес сервера. Значение присваивается клиентом DHCP, если клиент хочет связаться с конкретным сервером DHCP. IP-адрес сервера DHCP может быть получен при помощи сообщений DHCPOFER и DHCPACK, ранее возвращенных сервером. Сервер может вернуть адрес следующего сервера, с которым следует связаться в процессе загрузки, - например, адрес сервера, на котором хранится загрузочный образ операционной системы |
giaddr | 4 | IP-адрес маршрутизатора, на котором работает агент-рретранслятор DHCP |
chaddr | 16 | Аппаратный адрес клиента DHCP.16 октетов зарезервированы для того, чтобы данное поле позволяло представлять различные типы аппаратных адресов. В архитектурах Ethernet и Token Ring используются только 6 октетов |
sname | 64 | Необязательное имя сервера (если оно известно клиенту DHCP). Хранится в формате строки, завершенной нуль-символом |
file | 128 | Имя загрузочного образа. Хранится в формате строки, завершенной нуль-символом. Если клиент DHCP хочет загрузить образ операционной системы, принятый с сетевого устройства, он может задать в DHCPDISCOVER обобщенное имя - например, "unix" для загрузки образа Unix. На сервере DHCP может храниться дополнительная информация о конкретной операционной системе, необходимой для этой рабочей станции. Ответ сервера DHCP может возвращаться в виде полностью определенного имени файла в сообщении DHCPOFFER |
options | 312 | Дополнительные параметры |
Большинство сообщений DHCP, передаваемых сервером DHCP клиенту, являются направленными (то есть посылаются на один конкретный IP-адрес). Это объясняется тем, что сервер DHCP узнает адрес клиента DHCP из сообщений, отправляемых клиентом серверу. Клиент DHCP может потребовать, чтобы сервер отвечал по адресу широковещательной рассылки, для чего крайний левый бит поля options устанавливается в 1. Клиент DHCP поступает подобным образом, если он еще не знает своего IP-адреса. Модуль IP на клиенте DHCP отвергает полученную дейтаграмму, если IP-адрес получателя, указанный в дейтаграмме, не совпадает с IP-адресом сетевого интерфейса клиента DHCP. Если IP-адрес сетевого интерфейса неизвестен, дейтаграмма также отвергается. С другой стороны, модуль IP принимает любые широковещательные дейтаграммы DHCP. Следовательно, чтобы модуль IP заведомо принимал ответ сервера DHCP, когда IP-адрес еще не настроен, клиент DHCP должен потребовать, чтобы сервер отправлял широковещательные сообщения вместо направленных.