Перейти к содержанию

Hop Limit / TTL (предельное число переходов)

Пакет, попавший в кольцо между двумя маршрутизаторами с неверными таблицами, крутился бы в нём вечно. Чтобы этого не случилось, в заголовке IP есть счётчик, который на каждом переходе уменьшается на единицу, — Hop Limit в IPv6 и Time to Live в IPv4.

Обновлено Редакция GAW

Hop Limit (предельное число переходов) в IPv6 и Time to Live (TTL, «время жизни») в IPv4 — 8-битное поле заголовка IP, которое каждый узел, пересылающий пакет, уменьшает на 1; дошедший до нуля пакет уничтожается (RFC 8200 разд. 3, RFC 791 разд. 3.1). Назначение — не дать пакету бесконечно ходить по кольцу при ошибке в маршрутах. Не путать с ТТЛ — транзисторно-транзисторной логикой: аббревиатура та же, смысл не имеет ничего общего.

Кто уменьшает и кто отбрасывает

СитуацияIPv6 (RFC 8200 разд. 3)IPv4 (RFC 791 разд. 3.1, 3.2)
Единица измеренияпереходысекунды, но минимум 1 за каждый узел — фактически переходы
Кто уменьшаеткаждый узел, пересылающий пакеткаждый модуль, обрабатывающий заголовок
Пакет пришёл с нулём на маршрутизаторотброситьуничтожить
Уменьшено до нуля при пересылкеотброситьуничтожить
Пакет с нулём дошёл до адресатаобработать как обычный— (в RFC 791 случай отдельно не описан)
Максимум255255 с = 4,25 мин

RFC 791 задумывал TTL как верхнюю границу времени в секундах, но поскольку каждый узел обязан вычесть хотя бы 1, поле ещё в 1981 году было по сути счётчиком переходов; в IPv6 это отражено в самом названии Hop Limit и в определении через число пересылающих узлов (RFC 8200 разд. 3).

ICMP Time Exceeded

Маршрутизатор, отбросивший пакет из-за Hop Limit, обязан отправить его источнику ICMPv6 Time Exceeded — тип 3, код 0 «hop limit exceeded in transit» (RFC 4443 разд. 3.3). Код 1 того же типа означает другое — истёк таймер сборки фрагментов. Сообщение доходит до прикладного процесса, если стек может определить, какому сокету принадлежал пакет; устройству это говорит либо о кольце маршрутизации, либо о слишком маленьком начальном значении. Родственный механизм для размера пакета — Packet Too Big, на котором построен Path MTU Discovery; обе ошибки, как и ICMP Echo, живут в ICMPv6.

Какое значение ставить

Начальное значение выбирает отправитель. Для IPv6 хост берёт его из поля Cur Hop Limit в Router Advertisement, если маршрутизатор его задал — 0 означает «не задано» (RFC 4861 разд. 4.2); так администратор меняет значение сразу у всех хостов канала. Два частных случая:

  • 255 — у всех пяти сообщений Neighbor Discovery. Пересланный пакет не может иметь 255, поэтому узел отбрасывает ND-сообщения с меньшим Hop Limit и защищён от подделок извне канала (RFC 4861 разд. 3.1). Тот же приём лежит в сжатии 6LoWPAN: кодирование IPHC умеет передавать Hop Limit 1, 64 и 255 двумя битами (RFC 6282 разд. 3.1.1), а при маршрутизации через узлы RPL поле несут целиком, потому что оно меняется на каждом переходе.
  • 1 — для пакетов, которым незачем покидать канал, например групповых с областью link-local: за первый маршрутизатор их всё равно не выпустят. RFC 6282 (разд. 1) называет типичными именно 1 для трафика внутри канала, 64 как обычное значение по умолчанию и 255 для проверки, что обмен идёт в один переход, — потому в IPHC сжимаются только эти три значения.

В lwIP на ESP32 значение для сокета задают опциями IP_TTL и IP_MULTICAST_TTL (IPv4) и IPV6_MULTICAST_HOPS для групповых пакетов IPv6; отдельной опции для unicast IPv6 в списке поддерживаемых в документации ESP-IDF нет.

Частые вопросы

Что происходит, когда Hop Limit доходит до нуля?

Маршрутизатор, который получил пакет с Hop Limit 0 или уменьшил его до 0, обязан пакет отбросить и отправить источнику ICMPv6 Time Exceeded (тип 3, код 0) — RFC 4443 разд. 3.3. Это признак кольца в маршрутах или слишком маленького начального значения. Узел-получатель, напротив, пакет с нулевым Hop Limit обрабатывает как обычный (RFC 8200 разд. 3): отбрасывают только при пересылке.

Чем Hop Limit отличается от TTL?

Полем называется одно и то же: 8 бит в заголовке IP, уменьшаемые на каждом переходе. RFC 791 (разд. 3.1) называл его Time to Live и определял в секундах, но требовал уменьшать минимум на 1 даже при обработке быстрее секунды, так что на практике поле всегда считало переходы. В IPv6 оно с самого начала называется Hop Limit и определено только через число переходов (RFC 8200 разд. 3). Максимум — 255 в обоих случаях.

Почему у сообщений Neighbor Discovery Hop Limit равен 255?

Потому что ни один маршрутизатор не может переслать пакет, не уменьшив поле: пакет с 255 заведомо пришёл из того же канала. RFC 4861 (разд. 3.1) использует это как защиту — Router Advertisement или Redirect, подделанный где-то в интернете, до хоста дойдёт с меньшим значением и будет отброшен. Все пять сообщений ND отправляются с Hop Limit 255.

Источники

  1. IETF. S. Deering, R. Hinden. Internet Protocol, Version 6 (IPv6) Specification. RFC 8200, July 2017 — разд. 3: Hop Limit — 8-битное беззнаковое поле, каждый узел, пересылающий пакет, уменьшает его на 1; при пересылке пакет отбрасывается, если Hop Limit был нулём при получении или стал нулём после уменьшения; узел-получатель пакет с нулевым Hop Limit не отбрасывает, а обрабатывает как обычно
  2. IETF. J. Postel (ed.). Internet Protocol. RFC 791, STD 5, September 1981 — разд. 3.1: Time to Live — 8 бит, максимальное время пребывания датаграммы в сети; при нуле датаграмма уничтожается; измеряется в секундах, но каждый модуль уменьшает поле минимум на 1, даже если обработал быстрее секунды, поэтому TTL — лишь верхняя граница; разд. 3.2: TTL задаёт отправитель, максимум 255 с, то есть 4,25 мин
  3. IETF. A. Conta, S. Deering, M. Gupta. Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification. RFC 4443, March 2006 — разд. 3.3: Time Exceeded — тип 3, код 0 — Hop Limit исчерпан в пути, код 1 — истёк таймер сборки фрагментов; маршрутизатор, получивший пакет с Hop Limit 0 или уменьшивший его до 0, обязан отбросить пакет и отправить источнику Time Exceeded с кодом 0 — признак кольца маршрутизации или слишком малого начального значения; сообщение передаётся процессу верхнего уровня, если его можно определить
  4. IETF. T. Narten, E. Nordmark, W. Simpson, H. Soliman. Neighbor Discovery for IP version 6 (IPv6). RFC 4861, September 2007 — разд. 3.1: Hop Limit 255 делает Neighbor Discovery невосприимчивым к отправителям вне канала; разд. 4.1–4.5: все пять сообщений ND отправляются с Hop Limit 255; разд. 4.2: поле Cur Hop Limit в Router Advertisement — значение по умолчанию для исходящих пакетов хостов, 0 — не задано
  5. IETF. J. Hui, P. Thubert. Compression Format for IPv6 Datagrams over IEEE 802.15.4-Based Networks. RFC 6282, September 2011 — разд. 1: типичные значения Hop Limit — 1 для входящего трафика в mesh-under сети, значение по умолчанию вроде 64 для исходящего, 255 для проверки, что обмен идёт в один переход; IPHC сжимает именно их; разд. 3: при маршрутизации через несколько IP-переходов Hop Limit не сжимается, так как уменьшается на каждом; разд. 3.1.1: поле HLIM — 00 in-line, 01 → 1, 10 → 64, 11 → 255
  6. Espressif. ESP-IDF Programming Guide v6.1, ESP32: lwIP — разд. Socket Options: опции уровня IPPROTO_IP — IP_TTL, для multicast UDP — IP_MULTICAST_TTL; уровня IPPROTO_IPV6 для multicast — IPV6_MULTICAST_HOPS
Страница помогла?

Нашли ошибку? ·