Предохранитель от бесконечной пересылки
TTL, Time To Live, представляет собой однобайтовое поле в заголовке IP-пакета, где хранится число от 0 до 255. Каждый маршрутизатор, обработавший пакет, уменьшает его на единицу. Если после уменьшения получается ноль, пакет уничтожается, а отправитель может получить уведомление ICMP «время истекло».
Зачем это нужно? В сложных сетях случаются маршрутные петли: из-за ошибки конфигурации два маршрутизатора отправляют пакет друг другу по кругу. Без ограничителя такой пакет жил бы вечно и нагружал каналы. TTL обеспечивает то, что любой пакет рано или поздно исчезнет.
Несмотря на название, в поле хранится не время в секундах, а именно число переходов. Историческое название сохранилось с первых версий протокола.
Начальные значения и что они говорят
Начальное значение задаёт отправитель, и оно зависит от системы: часто встречаются 64, 128 и 255. По умолчанию в Linux и macOS обычно ставят 64, в Windows 128, а сетевое оборудование иногда 255. Значение, которое вы видите в ответе ping, уже уменьшено маршрутизаторами на пути.
Отсюда грубая прикидка: если ответ пришёл с TTL 52, вероятно, начальное значение было 64, и путь занял двенадцать переходов. Это лишь оценка, поскольку начальное значение зависит от настроек, а обратный маршрут может отличаться от прямого. Делать по нему точные выводы о системе удалённого узла нельзя.
Как на нём построен traceroute
Утилита трассировки отправляет пакеты с последовательно растущим TTL. Первый пакет с единицей погибает на первом маршрутизаторе, который присылает в ответ сообщение ICMP и тем самым называет свой адрес. Второй пакет доходит до второго, и так далее, пока очередной не доберётся до цели. Список отвечающих узлов и время между ними показывают путь и места, где задержка растёт.
Звёздочки в выводе означают, что конкретный маршрутизатор не ответил на служебный пакет. Такое бывает из-за фильтрации, и оно не всегда говорит о неполадке, если дальнейшие узлы отвечают нормально.
Где ещё используется TTL
У слова «TTL» есть и другое значение: в DNS время жизни записи в кэше, которое измеряется в секундах. Это отдельный механизм, не связанный с IP-полем, но идея схожая: ограничить срок существования информации. Подробнее о нём рассказано на странице про dns-ttl.
В IPv6 аналогичное поле называют Hop Limit, чтобы подчеркнуть, что считаются именно переходы. Функция полностью сохранилась.
Некоторые провайдеры и мобильные операторы обращают внимание на значение TTL в трафике, чтобы определить, что за устройством находится ещё одно, раздающее интернет. Подробности такой практики зависят от оператора, и утверждать что-то определённое об условиях нельзя.
Как проверить у себя: TTL пакета
Выполните ping любого узла и обратите внимание на поле TTL в ответе. Затем запустите tracert в Windows или traceroute в Linux с тем же адресом и посчитайте число строк: оно примерно соответствует тому, на сколько уменьшилось значение. Если сомневаетесь, сравните с несколькими адресами: до близких узлов TTL в ответе будет выше, до далёких ниже.
Менять значение TTL на компьютере без причины не следует: слишком малое сделает удалённые узлы недостижимыми, а слишком большое лишь замедлит устранение петель.
Практические наблюдения
Для наблюдения за TTL достаточно пинга нескольких узлов. Отправьте запросы на адрес роутера: значение TTL в ответе будет равно начальному, поскольку промежуточных переходов нет. Затем пингуйте сервер в интернете: значение станет меньше, а разница с ближайшим круглым числом даст число переходов.
Если трассировка показывает подозрительно много строк, например больше двадцати, путь неоптимален, и стоит сравнить его с маршрутом до того же узла из другой сети. TTL не позволяет судить о качестве связи напрямую: короткий путь может быть медленным из-за загрузки, а длинный быстрым. Число переходов полезно скорее как одна из подсказок при поиске причин задержки.
Итак, полезнее всего помнить, что TTL защищает сеть от петель и служит основой трассировки, а не показателем скорости.
Если вы хотите закрепить материал, повторите опыт с ping и tracert на нескольких узлах и сопоставьте значения TTL с числом строк трассировки.