Как работает время в интернете
Начнём с того, что подравняемся в плане терминов.
Распределённая система — набор компьютеров, которые решают общую задачу, общаются через сообщения по сети и не имеют общих физических ресурсов (память, вычислительные мощности).
🔏 Единое значение времени во всех частях распределённой системы важно для её правильной работы:
• Точное время помогает в обеспечении безопасности, например, для своевременного мониторинга и реагирования на события безопасности, проверки подлинности транзакций или предотвращения повторных атак
• В распределенных системах, которые работают с данными из разных источников, точное время обеспечивает согласованность данных
• В приложениях, работающих с мультимедиа, синхронизация времени критически важна для правильного воспроизведения
Виды часов для отсчета времени:
1️⃣ Атомные часы основаны на колебаниях атома, поэтому они высокоточные и постоянны в выдаче результата
2️⃣ В часах большинства компьютеров используются кварцевые часы, который тоже способны выдавать высокую и стабильную частоту, хотя и не такую, как у атомных
😔 Под влиянием внешних факторов разные кварцевые часы постепенно начинают показывать разные значения. Поэтому как только появляется несколько процессоров, каждый со своим тактовым модулем, возникает проблема их синхронизации
⌛️ Все часы синхронизируются по всемирному координированному времени (UTC). Около 40 радиостанций и несколько спутников передают импульсы в начале каждой секунды. Комбинируя прием со всех этих источников, можно создать серверы времени, которые обеспечивают точность в 50 наносекунд
📲 Протокол NTP позволяет клиентам связаться с сервером времени с атомными часами или приемником UTC.
💡 Задача такого протокола заключается в том, чтобы вычислить и нивелировать задержки при отправке сообщений
🔂 Решение: клиент отправляет запрос с собственной временной меткой Т1. Сервер записывает время получения с собственной временной меткой Т2 и отправляет значение времени Т2 и текущее значение времени Т3. Клиент сохраняет сообщение и время его получения. Зная T1, T2, T3 и T4, алгоритм рассчитывает сетевую задержку и смещение клиента во времени для корректировки его часов
Когда NTP может помочь:
💸 Например, у пользователя украли данные карты и хотят снять 1000$
💸 Пользователь хочет предотвратить ситуацию и в ту же секунду блокирует карту
💸 Банковская система отсортирует по времени входящие сообщения о снятии денег и о блокировке карты
💸 Если часы клиента, который отправил сообщение о блокировке карты, отстают, мошеннику удастся снять деньги
💸 Если обмен сообщениями проходит с использованием NTP, клиент успеет спасти свои деньги
⚙️ Другой пример — компилятор при пересборке проверяет время изменения файла
⚙️ Если исходный файл имеет большее время, чем его объектный файл, значит, исходный файл был изменен, и его нужно перекомпилировать
⚙️ При отставании одних часов распределённой системы даже на миллисекунду результат компиляции будет состоять из старых и новых файлов, что делает отладку невозможной
⚙️ Если исходные файлы из разных частей системы передаются через NTP, у программиста не взорвется мозг при попытке отладить неправильно скомпилированный код
🔢 Классы точности NTP-серверов (цифра - уровень по отношению к UTC):
Stratum 1 — самые точные серверы, которые могут учитывать время с точностью в одну триллионную долю секунды. Они получают время напрямую от атомных часов либо от станций UTC. Для запуска такого сервера нужно сложное дорогое оборудование, поэтому их очень мало и большинство stratum 1 не отвечает на запросы от обычных пользователей и обслуживает только другие серверы
Stratum 2 — серверы второго уровня. Они получают данные от stratum 1 и работают с погрешностью примерно 0,001 секунды.
Stratum 3 получают данные от stratum 2, и с точностью до 0,05 секунды. Дальше идут уровни 4, 5 и т.д.
Что может пойти не так? Атаки на NTP
☠️ Взламывают NTP, вас спамят запросами, в итоге ваш сервер не выдерживает и ложится (атака называется NTP amplification)
☠️ NTP сервер перестает отвечать, и ваша программа начинает себя вести непредсказуемо
☠️ NTP начинает слать неправильные ответы, и злоумышленник может замести следы. Тогда он будет действовать смелее и использовать агрессивные способы кибератаки, не опасаясь быть обнаруженным и арестованным
О чем стоит подумать аналитику при проектировании системы:
❓ Как программа будет реагировать на неправильное время на сервере, на которой она находится?
❓ Отслеживается ли корректность времени? Какую ошибку стоит выдавать, если время резко изменилось? А что, если резкое изменение — это не атака, а изменение часового пояса пользователя?