Все сообщения в ICMPv6 (RFC4443) можно разделить на:
Существует несколько типов сообщений, конкретный тип может дополняться детализирующим кодом. Структура всех сообщений одинакова:
тип(8бит)-код(8бит)-контрольная сумма(16бит)-сообщение (..до общей длины 1280 байтов).
Вот сообщения об ошибках (тип-код-сообщение-комментарий). У них старший бит всегда установлен в «0», то есть тип может принимать значения от 0 до 127.
Эти сообщения не отправляются в ответ на каждую ошибку, существуют ограничение на частоту их отправки.
А вот информационные сообщения: тут старший бит всегда установлен в «1», то есть тип может принимать значения от 128 до 255, например тип 128 и тип 129, Echo request и Echo reply соответственно.
В этих пакетах содержится дополнительная информация: идентификатор (16 бит) и порядковый номер (16 бит), чтобы можно было увязать запрос и ответ.
Поскольку MTU на пути от отправителя к получателю может меняться, существует механизм определения минимального MTU для всего пути. Это значение и будет использоваться. Алгоритм прост: отправитель отправляет пакеты с MTU исходящего интерфейса. Если придет сообщение Packet Too Big, то новое MTU будет взято из него. И так до достижения консенсуса.
Немного терминологии:
Node — любое устройство с сетевым интерфейсом (c ip-адресом)
Host — устройство, работающее тслько с пакетами, адресованными ему
Router — устройство, работающее с пакетами,не адресованными ему (с транзитными)
Внутри ND-пакета (то есть ICMPv6-пакета) содержится информация: Next Header=58 (то есть протокол ICMPv6), далее идет Neighbor Discovery Message Header, затем идут опции.
Структура информации в опциях — TLV, то есть тип-длина-значение.
ND используют:
Nodes: для определения link-layer адресов соседей, отслеживание изменений в этих адресах и отслеживание доступности соседей Hosts: для поиска роутеров, для автоконфигурации адреса и других параметров Routers: для анонсирования своих префиксов, для уведомления хостов о наличии предочитаемых next-hop адресов для конкретного получателя
Основные процессы в ND:
Формат сообщений: тип сообщений от 133 до 137:
Поскольку эти сообщения не должны покидать local-link, у них устанавливается Hop-limit равным 255. Если обнаруживается ND-пакет с другим значением этого параметра, то он должен быть уничтожен. Роутеры не пересылают такие пакеты.
Поле Type в опциях занимает 8 бит. Основные типы:
1 — link-layer адрес источника (NS, RS, RA)
2 — link-layer адрес приемника
3 — информация о префиксах
4 — Redirected Header
5 — MTU
7 — Advertisement Interval
8 — Host Agent Information
24 — Route Information С содержимым полей типа 1 и 2 все ясно, для Ethernet — это 48-битный mac-адрес.
Поле типа 3 устроено интереснее: тип=3, длина=4(х8 байт), дальше идет длина префикса (обычно 64 бит) и побитные флажки:
On-Link flag
Router address flag — используется в Mobile IPv6
Site prefix flag — вроде бы уже не используется (и еще 4 бита зарезервировано)
Далее следуют:
Valid lifetime — время, в течение которого действителен адрес, полученный путем автоконфигурации. 32 бита, для «вечного» адреса все устанавливаются в 1
Preferred lifetime — по истечению этого времени адрес, полученый при автоконфигурации, не следует использовать для новых соединений. Старые можно продолжать (и еще 3 байта зарезервировано)
Site prefix length (1 байт) — используется только если Site prefix flag := 1
Prefix (16 байт, 128 бит) — сам префикс, используемый для автоконфигурации
Тип сообщения — 133, код 0. Сообщение отправляется хостом для нахождения роутера. Отправка такого сообщения позволяет получить информацию о роутерах не дожидаясь прихода RA. В IPv6-заголовке такого собщения в качестве источника укзаывается unspecified address, то есть ::, или link-local адрес хоста. Адрес получателя устанавливается FF02::2, hop-limit задается равным 255.
Роутер отправляет такое сообщение по своей инициативе через заданный интервал плюс-минус случайная величина, или в ответ на RS, при этом ответ также следует с произвольной задержкой,, чтобы несколько роутеров не ответили одновременно. В RA содержится следующая информация:
тип — 1байт — равен 134 код — 1байт — равен 0 контрольная сумма — 2 байта hop limit — 1байт Managed address configuration flag — 1бит — если установлен в 1, то хост должен использовать DHCP-сервер для получения адреса
Other stateful configuration bit — 1бит — если установлен в 1, то хост должен использовать DHCP-сервер для получения дополнительных параметров, например адреса DNS-сервера
Home Agent flag — используется в Mobile IP
Default router preference — 2 бита, приоритет данного роутера в качестве роутера по умолчанию. 01 — высокий, 00 — средний, 11 — низкий. Значение 10 запрещает использование данного роутера в качестве дефолтного.
Router lifetime — время, в течение которого данный роутер может быть дефолтным. От нуля до 65535 секунд. Значение 0 запрещает использование роутера в качестве дефолтного.
Reachable time — 32 бита — время в милисекундах, в течение которого хост считает этот роутер достижымым. 0 означает, что роутер не устанавливает этот параметр.
Retransmission timer — 32 бита — интервал между NS-сообщениями. Используется для проверки достижимости хостов.
Prefix information option — содержит префиксы, которые можно использовать для автоконфигурации
Route information options — содержит дополнительные пути, которые следует включить в локальную таблицу маршрутизации у хоста, чтобы обеспечить оптимальную маршрутизацию.
Сообщение отправляется хостом в ответ на NA или по своей инициативе, например при изменении link-layer адреса. В сообщении содержится информация о роли отправителя в сети, о Link-layer адресе и др.
Структура сообщения:
Тип — 1байт = 136 Код — 1байт = 0 Контрольная сумма Router flag — 1бит — установлен в 1, если отправитель — роутер. У хоста установлен в 0. Solicited flag — 1бит — если это ответ на запрос NA. Используется как индикатор достижимости. Override flag — 1бит — если установлен в 1, то следует переписать link-layer адрес на тот, что в пакете (резерв 29 бит) Анонсируемый адрес — 8 байтов Опции адреса получателя — используется для получения link-layer адреса хоста, сделавшего анонс Neighbor discovery process
ND-протокол используется в процессах:
Каждый хост хранит такие данные (RFC4861):
Neighbor cache — Кэш с информацией о соседях в пределах общего линка: IP-адреса, соответствующие им link-layer адреса, индикатор доступности
Destination cache — кэш с информацией о адресах, служащих шлюзом для достижения получателей. Содержит информацию: адрес получателя, соотвествующий ему next-hop адрес, значение MTU для данного получателя
Prefix list — список префиксов — список префиксов для данного линка. Составляется из RA.
Default router list IP addresses — список адресов, которые могут служить шлюзом по умолчанию. Составлен из RA.
«Разрешение» адресов, то есть получение link-layer адреса по ip-адресу делается путем обмена NS-NA. NS отправляется на multicast адрес, получатель обновляет свою таблицу соседей, и отвечает unicast-NA. Отправитель добавляет данные в свою таблицу соседей.
Neighbor Unreachability Detection
Узел считается достижимым, если есть подтверждение того, что пакет отправленный к нему, был им получен. Поскольку между узлами могут быть другие (транзитные) узлы, недостижимость может быть связана с проблемами на транзитном оборудовании. По этой причине под достижимостью понимается только достижимость на первом хопе.
Один из путей проверки достижимости — обмен NS-NA. Полученные unsolicitated NA и RA не считаются индикаторами достижимости. Если А отправил NS к B, а тот ответил NA к А, то А считает B достижимым, но не наоборот. Для того, чтобы B считал А достижимым, он должен отправить NS к А и получить от А NA в ответ. Другой метод получения информации о достижимости — это информация от протоколов верхнего уровня, например от ТСР.
Состояние Neighbor cache:
Incomplete — запрос отправлен, но link-layer адрес еще не получен Reachable — получено подтверждение от соседа Stale — истекло время, в течение которого сосед считался достижимым, или получено unsolicited NA Delay — ожидается подтверждение от протокола верхнего уровня, как правило в течение 5 сек. При неполучении — переход в состояние Probe Probe — отправлен NS для соседей в состоянии Delay или Stale No entry exists — нет такой записи.. Duplicate address detection
Хост отправляет NS со своим предполагаемым адресом в качестве адреса получателя и слушает ответ. Если услышит NA — то адрес занят. После такого события требуется конфигурирование адреса вручную.
Проходит через процесс обмена RS-RA. Роутер, кроме своего адреса, сообщает:
– значение hop limit, которое будет использоваться по умолчанию – будет ли node использовать dhcp или нет – значения таймеров для определения достижимости соседей – список префиксов для данного линка – MTU – маршруты, ведущие к отдельным узлам
Роутер посылает RA по псевдослучайному закону или в ответ на RS.
Host sending algorithm (алгоритм обмена между хостами)
Unicast-обмен описывается в RFC4861 (пункт 5.2) и выглядит так:
Проверяются Destination cache, Prefix list, Default router list для определения next-hop адреса, а затем по Neighbor cache определяется link-layer адрес получателя.
Отправитель просматривает таблицу префиксов и ищет совпадение («попадание») по самому длинному префиксу и проверяет, находятся ли они на одном линке с получателем. Если да — то next-hop адрес совпадает с адресом получателя, в противном случае выбирается адрес роутера из списка роутеров по умолчанию, то есть очень похоже на IPv4.
После определения next-hop адреса он заносится в Destination Cache и дальше определение next-hop адреса для последующих пакетов для этого получателя не делается.
После определения next-hop адреса отправитель ищет его link-layer адрес в Neighbor cache, и если его нет, то создает новую запись с типом INCOMPLETE, и начинает процесс определения адреса. Все просто..