Пакет запросов NTP

Я пытаюсь выяснить, что мне нужно отправить (клиент) в пакете запроса NTP для получения пакета NTP с сервера. Я работаю с LWIP на Cortex M3, Stellaris LM3S6965

Я понимаю, что получу заголовок UDP, а затем протокол NTP с разными временными метками для устранения задержки. Я, вероятно, должен сделать заголовок UDP, но что мне нужно добавить в качестве данных?

Wireshark изображение:

Я надеюсь, что вы, ребята, можете мне помочь.

3 ответа

Пакет запроса клиента совпадает с пакетом ответа сервера - просто установите биты MODE в первом слове на 3 (Клиент), чтобы быть уверенным.

Отправьте весь 48-байтовый пакет на сервер, он ответит тем же.

Простейший пакет будет 0x1B, за которым следуют 47 нулей. (Версия = 3, режим = 3)

Это для начала: http://www.eecis.udel.edu/~mills/ntp/html/warp.html

Проверьте это, если вы еще этого не сделали: http://tools.ietf.org/html/rfc5905

Затем посмотрите на это: http://wiki.wireshark.org/NTP и посмотрите примеры загруженных файлов pcap.

Я не уверен, помогло ли это, но я надеюсь на это.

Я кодировал Arduino для подключения к NTP-серверу, используя этот код здесь,

http://www.instructables.com/id/Arduino-Internet-Time-Client/step2/Code/

Посмотрите на метод getTimeAndDate и sendNTPpacket.

Это пакет, который отправляется. Это настройка буфера и показывает, что двоичный (0b) и шестнадцатеричный (0x) устанавливаются в буфере из 48 символов. Адрес сервера времени NTP,

memset(packetBuffer, 0, NTP_PACKET_SIZE);
packetBuffer[0] = 0b11100011;
packetBuffer[1] = 0;
packetBuffer[2] = 6;
packetBuffer[3] = 0xEC;
packetBuffer[12]  = 49;
packetBuffer[13]  = 0x4E;
packetBuffer[14]  = 49;
packetBuffer[15]  = 52;                 
Udp.beginPacket(address, 123);
Udp.write(packetBuffer,NTP_PACKET_SIZE);
Udp.endPacket();

Вот что происходит с полученным пакетом,

Udp.read(packetBuffer,NTP_PACKET_SIZE);  // read the packet into the buffer
unsigned long highWord, lowWord, epoch;
highWord = word(packetBuffer[40], packetBuffer[41]);
lowWord = word(packetBuffer[42], packetBuffer[43]); 
epoch = highWord << 16 | lowWord;
epoch = epoch - 2208988800 + timeZoneOffset;
flag=1;
setTime(epoch);

setTime является частью библиотеки времени Arduino, поэтому эпоха должна быть числом секунд с 1 января 1900 г., как предлагается здесь (поиск эпохи),

https://en.wikipedia.org/wiki/Network_Time_Protocol

Но в случае, если вам нужна версия на C#, я нашел это здесь, скомпилировал код под освобожденным ответом, и он работает. Это, вероятно, будет иметь больше смысла для вас, и действительно показывает использование эпохи 01.01.1900.

Как запросить NTP-сервер с помощью C#?

Можно легко увидеть сходство.

Другие вопросы по тегам