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-записи