EMZETT.
Войти

TTL

Коротко: «Time To Live» (время жизни) — указывает, как долго значение (например, запись DNS или сетевой пакет) остаётся действительным, прежде чем его нужно отбросить или запросить заново.

Подробнее: Для записей DNS TTL — это промежуток времени в секундах, определяющий, как долго резолвер может хранить результат в кэше, прежде чем снова спросить авторитетный сервер имён. Для IP-пакетов же TTL — счётчик, уменьшающийся на 1 на каждом пройденном маршрутизаторе; при достижении 0 пакет отбрасывается — это не даёт пакетам бесконечно циркулировать по сети.

Подробности

Несмотря на общее название, два значения TTL технически принципиально различны, но служат одной общей цели: не допустить, чтобы устаревшие или неверно маршрутизированные данные бесконечно «бродили» по системе.

TTL в DNS: промежуток времени

Для записей DNS TTL — настоящий промежуток времени в секундах, например 3600 (один час) или 86400 (один день). Он определяет, как долго резолвер может хранить в кэше результат запроса, прежде чем придётся снова спросить авторитетный сервер имён. Выбор TTL — классический компромисс:

  • Малый TTL (например, 300 секунд): изменения быстро доходят повсюду, но резолверам приходится спрашивать чаще — больше нагрузка на серверы имён, чуть выше задержка для пользователей, так как «холодный» запрос нужен чаще.
  • Большой TTL (например, 86400 секунд): заметно разгружает серверы имён и улучшает воспринимаемую скорость для вернувшихся пользователей, но соответственно задерживает распространение изменений.

Поэтому перед запланированными переносами DNS (например, сменой хостинг-провайдера) TTL обычно за несколько дней снижают до малого значения — когда фактическое изменение вступает в силу, оно распространяется за минуты, а не за часы, поскольку большинству резолверов и так приходится спрашивать заново из-за истёкшего старого TTL.

TTL IP-пакета: счётчик

У IP-пакетов TTL — не значение времени, а чистый счётчик (диапазон значений 0–255 для IPv4, в IPv6 называется «Hop Limit»), который уменьшается ровно на 1 на каждом пройденном маршрутизаторе. Когда счётчик достигает 0, пакет немедленно отбрасывается, а исходному отправителю отправляется сообщение об ошибке ICMP («Time Exceeded»). Без этого механизма неверно маршрутизированный пакет, застрявший в петле маршрутизации (два маршрутизатора бесконечно пересылают его друг другу), теоретически мог бы вечно циркулировать по сети, постоянно расходуя пропускную способность.

Начальное значение TTL задаётся отправляющей операционной системой и традиционно различается по системам (Linux/macOS часто начинают с 64, старые версии Windows — со 128) — эта разница иногда даже используется для грубого определения операционной системы («OS fingerprinting»): фактически пришедший к получателю TTL сравнивают с обычными начальными значениями и обратным расчётом определяют число пройденных hop’ов.

Практическое применение: traceroute

Механизм счётчика сознательно используется диагностическими утилитами вроде traceroute (в Windows: tracert), чтобы сделать видимым весь маршрут до цели:

$ traceroute emzett-digital.com
 1  router.local (192.168.1.1)  1.2 ms
 2  10.0.0.1 (10.0.0.1)  8.4 ms
 3  core-router.isp.net (203.0.113.1)  12.1 ms
 4  emzett-digital.com (198.51.100.42)  24.7 ms

Утилита посылает к одной цели пакеты с намеренно малым, постепенно растущим TTL (сначала 1, затем 2, затем 3, …). Пакет с TTL=1 «умирает» уже на первом маршрутизаторе по пути и вызывает там сообщение «Time Exceeded» отправителю — так traceroute узнаёт адрес этого первого hop’а. Следующий пакет с TTL=2 проходит на один hop дальше, прежде чем «умереть», раскрывая второй маршрутизатор, и так далее — пока пакет в конце концов не достигнет самой цели.

См. также: Кэширование, DNS-записи