#c #ntp #berkeley-sockets
#c #ntp #berkeley-сокеты
Вопрос:
Я пытаюсь создать простой SNTP-клиент на C, используя Berkeley sockets API, но у меня возникли проблемы с вычислением скорректированного времени из ответного сообщения. Я получил это от RFC2030.
Когда получен ответ сервера, клиент определяет переменную метки времени назначения как время прибытия в соответствии с его часами в формате метки времени NTP. В следующей таблице приведены четыре временные метки.
- Исходная временная метка (T1): запрос времени, отправленный клиентом
- Временная метка приема (T2): запрос времени, полученный сервером
- Временная метка передачи (T3): время ответа, отправленного сервером
- Временная метка назначения (T4): время ответа, полученного клиентом
Насколько я могу судить, я могу рассчитать скорректированное текущее время, взяв время клиента и добавив к нему смещение по времени t, причем смещение по времени определяется как
t = ((T2 - T1) (T3 - T4)) / 2
Мне нужно было бы знать T4, чтобы выполнить это вычисление, но это не является частью сообщения пакета. Как я могу получить эту временную метку?
Ответ №1:
Я полагаю, что только из этого опубликованного вами бита вы сможете получить T4 тем же способом, с помощью которого вы получили T1 (иначе говоря, они оба являются временем в соответствии с локальной машиной, когда она обрабатывает конкретный этап запроса). этап запроса).
Исходная временная метка (T1): запрос времени, отправленный клиентом
Временная метка назначения (T4): ответ времени, полученный клиентом
Упс, мое неверное предположение.
Будет ли достаточно использовать что-то вроде функции C gettimeofday для создания собственной метки времени сразу после получения пакета ответа?
Комментарии:
1. T1 фактически встроен в ответное сообщение, которое отправляется обратно сервером, поэтому мне не нужен специальный трюк для его извлечения. Вы можете привести пример ответного сообщения сервера в разбивке по Wireshark здесь: i.imgur.com/En4iG.png
2. Я мог бы это сделать, но в идеале я бы хотел использовать временную метку приема пакета (если эти данные доступны из системы; я не уверен), поскольку это дало бы более точные результаты.