Определение метки времени назначения пакета (ов) NTP?

#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. Я мог бы это сделать, но в идеале я бы хотел использовать временную метку приема пакета (если эти данные доступны из системы; я не уверен), поскольку это дало бы более точные результаты.