Пакет запросов 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#?
Можно легко увидеть сходство.