NTP请求包

时间:2013-01-05 11:35:07

标签: udp request ntp cortex-m3 lwip

我正在尝试弄清楚我需要在NTP请求包中发送(客户端)以从服务器检索NTP包。我正在使用Cortex M3上的LWIP,Stellaris LM3S6965

据我所知,我将接收UDP头,然后使用不同时间戳的NTP协议来消除延迟。我可能需要制作UDP标头,但我需要添加什么作为数据?

wireshark图片: enter image description here

我希望你们能帮助我。

3 个答案:

答案 0 :(得分:3)

客户端请求数据包与服务器应答数据包相同 - 只需将第一个字中的MODE位设置为3(客户端)即可。

将整个48字节的数据包发送到服务器,它将以相同的方式回复。

最简单的数据包是0x1B,后跟47个零。 (版本= 3,模式= 3)

答案 1 :(得分:2)

这适用于初学者:http://www.eecis.udel.edu/~mills/ntp/html/warp.html

如果你还没有,请检查一下:http://tools.ietf.org/html/rfc5905

然后查看:http://wiki.wireshark.org/NTP并查看他们上传的示例pcap文件。

我不确定这是否有帮助,但我希望如此。

答案 2 :(得分:0)

我已经使用此代码将Arduino编码为连接到NTP服务器,

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

查看名为getTimeAndDate和sendNTPpacket的方法。

这是发送的数据包。这是设置缓冲区并显示在48字符缓冲区中设置的二进制(0b)和十六进制(0x)。地址是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时间库的一部分,所以epoch应该是自1900年1月1日以来的秒数,如此处所示(搜索纪元),

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

但是如果你想要一个C#版本,我在这里找到了这个,在例外答案下编译代码并且它有效。这可能对你更有意义,并且确实显示了1/1/1900年纪的使用。

How to Query an NTP Server using C#?

可以很容易地看到相似性。