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