V6NET.RU

+ НАЧАЛО - НАЧАЛО

+ РАЗДАЧА АДРЕСОВ - РАЗДАЧА АДРЕСОВ

+ СБОР СТАТИСТИКИ - СБОР СТАТИСТИКИ

+ ДЕТАЛИ - ДЕТАЛИ

+ СПРАВОЧНАЯ - СПРАВОЧНАЯ

Немного первоисточников

ICMPv6

Все сообщения в ICMPv6 (RFC4443) можно разделить на:

Существует несколько типов сообщений, конкретный тип может дополняться детализирующим кодом. Структура всех сообщений однотипна:

тип(8бит)-код(8бит)-контрольная сумма(16бит)-сообщение (..до общей длины 1280 байтов).

Вот сообщения об ошибках (тип-код-сообщение-комментарий). У них старший бит всегда установлен в «0», то есть тип может принимать значения от 0 до 127.

1:0:Destination unreacheable:No route to destination В таблице маршрутизации нет нужного маршрута

1:1:Destination unreacheable:Administratively Prohibited Пакет попал под запрещающее правило в фильтре-файерволе

1:2:Destination unreacheable:Beyond the scope of source address Пакет попал не на тот интерфейс

1:3:Destination unreacheable:Address unreacheable не определяется link-layer адрес получателя

1:4:Destination unreacheable:Port unreacheable Получатель не «слушает» на этом порту

1:5:Destination unreacheable:Source address failed ingress/egress policy С таким адресом источника сюда не пускают

1:6:Destination unreacheable:Reject route to destination Пакет попал под действие запрещающего фильтра на роутере

2:0:Packet too big MTU на интерфейсе меньше, чем длина пакета. В таком сообщении сразу за контрольной суммой идет MTU интерфейса, которое затем может быть использовано в процессе MTU Discovery отправителем

3:0:Time exceeded:Hop limit reached После обработки пакета поле Hop Limit стало равным нулю.

3:1:Time exceeded:Fragmentation reassembly timeout За 60 секунд не удалось собрать пакет из фрагментов

4:0:Parameter problem:Error in header Ошибка в заголовке IPv6-пакета или ошибка в расширении заголовка

4:1:Parameter problem:Unknown next header В поле Next Header обнаружена ошибка

4:2:Parameter problem:Unknown option В заголовке просто что-то непонятное

Эти сообщения не отправляются в ответ на каждую ошибку, существуют ограничение на частоту их отправки.

А вот информационные сообщения: тут старший бит всегда установлен в «1», то есть тип может принимать значения от 128 до 255, например тип 128 и тип 129, Echo request и Echo reply соответственно.

128:0:Echo Request

129:0 Echo Reply

В этих пакетах содержится дополнительная информация: идентификатор (16 бит) и порядковый номер (16 бит), чтобы можно было увязать запрос и ответ.

Path MTU Discovery

Поскольку MTU на пути от отправителя к получателю может меняться, существует механизм определения минимального MTU для всего пути. Это значение и будет использоваться. Алгоритм прост: отправитель отправляет пакеты с MTU исходящего интерфейса. Если придет сообщение Packet Too Big, то новое MTU будет взято из него. И так до достижения консенсуса.

Neighbor Discovery

Немного терминологии:

Внутри ND-пакета (то есть ICMPv6-пакета) содержится информация: Next Header=58 (то есть протокол ICMPv6), далее идет Neighbor Discovery Message Header, затем идут опции.

Структура информации в опциях — TLV, то есть тип-длина-значение.

ND используют:

Основные процессы в ND

Формат сообщений: тип сообщений от 133 до 137:

133 — Router Solicitation
134 — Router Advertisement
135 — Neighbor Solicitation
136 — Neighbor Advertisement
137 — Redirect

Поскольку эти сообщения не должны покидать 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

1:данный префикс доступен,
0:данный префикс анонсится, но недоступен. Хитро…

Autonomous flag 1:данный префикс используется для SLAAC, то есть для stateless-автоконфигурации адреса, 0:-не используется для SLAAC.

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 бит) — сам префикс, используемый для автоконфигурации

Neighbor Discovery messages

1. Router Solicitation
2. Router Advertisement
3. Neighbor Solicitation
4. Neighbor Adverticement
5. Redirect
  1. Тип сообщения — 133, код 0. Сообщение отправляется хостом для нахождения роутера. Отправка такого сообщения позволяет получить информацию о роутерах не дожидаясь прихода RA. В IPv6-заголовке такого собщения в качестве источника укзаывается unspecified address, то есть ::, или link-local адрес хоста. Адрес получателя устанавливается FF02::2, hop-limit задается равным 255.

  2. Роутер отправляет такое сообщение по своей инициативе через заданный интервал плюс-минус случайная величина, или в ответ на RS, при этом ответ также следует с произвольной задержкой,, чтобы несколько роутеров не ответили одновременно. В RA содержится следующая информация:

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 — содержит дополнительные пути, которые следует включить в локальную таблицу маршрутизации у хоста, чтобы обеспечить оптимальную маршрутизацию.

Neighbor solicitation

Сообщение отправляется хостом в ответ на NA или по своей инициативе, например при изменении link-layer адреса. В сообщении содержится информация о роли отправителя в сети, о 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:

Duplicate address detection

Хост отправляет NS со своим предполагаемым адресом в качестве адреса получателя и слушает ответ. Если услышит NA — то адрес занят. После такого события требуется конфигурирование адреса вручную.

Router discovery

– значение 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, и начинает процесс определения адреса. Все просто..