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 случай отдельно не описан) |
| Максимум | 255 | 255 с = 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.
Источники
- IETF. S. Deering, R. Hinden. Internet Protocol, Version 6 (IPv6) Specification. RFC 8200, July 2017 — разд. 3: Hop Limit — 8-битное беззнаковое поле, каждый узел, пересылающий пакет, уменьшает его на 1; при пересылке пакет отбрасывается, если Hop Limit был нулём при получении или стал нулём после уменьшения; узел-получатель пакет с нулевым Hop Limit не отбрасывает, а обрабатывает как обычно
- 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 мин
- 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 — признак кольца маршрутизации или слишком малого начального значения; сообщение передаётся процессу верхнего уровня, если его можно определить
- 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 — не задано
- 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
- 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
Нашли ошибку? ·
Смотрите также
- ICMP Echo (ping)Запрос и ответ ICMP, на которых работает ping: типы, идентификатор, номер последовательности, данные
- Neighbor Discovery (NDP)Протокол IPv6 поверх ICMPv6: поиск маршрутизаторов, префиксов, MAC-адресов соседей и проверка их доступности
- Групповые адреса IPv6Формат FF00::/8: флаги, область действия, известные группы FF02::1 и FF02::2, solicited-node адрес
- 6LoWPANIPv6 поверх IEEE 802.15.4: сжатие заголовков IPHC, фрагментация под кадр 127 байт, MTU 1280
- RPL (маршрутизация в сетях датчиков)Маршрутизация IPv6 для сетей с потерями: дерево DODAG, DIO/DAO, ранг, storing и non-storing режимы
- Path MTU Discovery (PMTUD)Как узел IPv6 подбирает размер пакета под самый узкий канал пути: Packet Too Big, минимум 1280, таймеры
- ТТЛ (транзисторно-транзисторная логика)Семейство логики на биполярных транзисторах с питанием 5 В и порогами 0,8 и 2 В
- ESP32ESP32, S2, S3, C2, C3, C5, C6, H2, P4: ядра, радио, USB, GPIO — сравнение и выбор