Прием пакета
При получении пакета преобразования адресов (Запрос ARP в современной терминологии. Прим. перев.) принявший пакет модуль Ethernet передает этот пакет модулю преобразования адресов, который реализует описанный ниже алгоритм. Отрицательный результат в приведенной иллюстрации алгоритма означает завершение обработки и отбрасывание пакета.
- ? У меня имеется аппаратный адрес, заданный полем ar$hrd?
- Да: (почти определенный результат)
- [дополнительная проверка размера адреса — ar$hln]
- ? Указанный в поле ar$pro протокол поддерживается?
- Да:
- [дополнительная проверка размера адреса — ar$pln]
- Merge_flag := false
- Если пара <тип протокола, протокольный адрес отправителя> уже присутствует в таблице преобразования, поле аппаратного адреса отправителя обновляется в соответствии с полученным пакетом и устанавливается Merge_flag = true.
- ? У меня имеется протокольный адрес получателя?
- Да:
- Если Merge_flag = false, в таблицу преобразования добавляется триплет <тип протокола, протокольный адрес отиправителя, аппаратный адрес отправителя>.
- ? Код операции ares_op$REQUEST? (смотрим код запрошенной операции!!)
- Да:
- Меняем местами протокольное и аппаратное поля, помещаем локальный протокольный и аппаратный адрес в соответствующие поля отправителя.
- Устанавливаем ar$op = ares_op$REPLY
- Передаем пакет с использованием аппаратного адреса отправителя в качестве адресата.
Отметим, что триплет <тип протокола, протокольный адрес отправителя, аппаратный адрес отправителя> включается в таблицу до просмотра кода операции. Это делается, исходя из предположения о наличии двухсторонней связи (если A имеет что-то сказать B, то B возможно тоже имеет что сказать A). Отметим также, что при наличии в таблице записи для пары <тип протокола, протокольный адрес отправителя> в ней просто изменяется соответствующим образом поле аппаратного адреса.
Обобщение: Поля ar$hrd и ar$hln позволяют использовать описанный здесь протокол и формат пакетов для сетей, отличных от Ethernet. Лоя сетей Ethernet поля <ar$hrd, ar$hln> имеют значения <1, 6>. Для сетей других типов поле ar$pro может не соответствовать полю Ethernet type, но это значение должно быть связано с протоколом, для которого выполняется преобразование адресов.