NTP 解析
1.
202.107.6.88 22 02 30 E7 00 00 03 13 00 00 00 44 64 6B 19 72 E6 BA E0 03 50 79 91 F4 30 30 30 30 30 30 30 30 E6 BA E0 2A FB B4 D1 98 E6 BA E0 2A FB B5 79 31 【Hex】 LI[2bits],VN[3bits],Mode[3bits],Statum[8bits],Poll[8bits],Precision[8bits] RootDelay RootDispersion ReferenceIdentifier ReferenceTimestamp OriginateTimestamp ReceiveTimestamp TransmitTimestamp 根延时 根描述 参考标志 T3 参考时间戳 T0 起源时间戳[请求时的T2] T1 接收时间戳 T2 传输时间戳 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 22 02 30 E7 00 00 03 13 00 00 00 4B 64 6B 19 72 E6 BA EB D9 E2 DF 8C 97 30 30 30 30 30 30 30 30 E6 BA EC 67 21 74 DB 15 E6 BA EC 67 21 75 A4 EA 22 02 30 E7 00 00 03 13 00 00 00 50 64 6B 19 72 E6 BA EB D9 E2 DF 8C 97 30 30 30 30 30 30 30 30 E6 BA EC B1 B1 D0 60 92 E6 BA EC B1 B1 D1 5A F4 22 02 30 E7 00 00 03 13 00 00 00 51 64 6B 19 72 E6 BA EB D9 E2 DF 8C 97 30 30 30 30 30 30 30 30 E6 BA EC C8 36 E9 BC 3C E6 BA EC C8 36 EA 3F E4 22 02 30 E7 00 00 03 13 00 00 00 45 64 6B 19 72 E6 BA ED 1C 67 15 56 B6 30 30 30 30 30 30 30 30 E6 BA ED 46 37 35 5D 5E E6 BA ED 46 37 36 3B 2C 22 02 30 E7 00 00 03 13 00 00 00 45 64 6B 19 72 E6 BA ED 1C 67 15 56 B6 30 30 30 30 30 30 30 30 E6 BA ED 50 05 BD 22 A9 E6 BA ED 50 05 BD 7B 2B 22 02 30 E7 00 00 03 15 00 00 00 42 64 6B 19 72 E6 BA F0 66 25 58 73 44 30 30 30 30 30 30 30 30 E6 BA F0 72 05 C1 DC C4 E6 BA F0 72 05 C5 6C 71 22 02 30 E7 00 00 03 15 00 00 00 42 64 6B 19 72 E6 BA F0 66 25 58 73 44 30 30 30 30 30 30 30 30 E6 BA F0 72 05 C1 DC C4 E6 BA F0 72 05 C5 6C 71 #define JAN_1970 0x83aa7e80 // (2208988800) 1900年到1970年的秒数 ReferenceTimestamp:[33][34][35][36] [37][38][39][40] 【E6 BA F0 66】 【25 58 73 44】 0xE6BAF066 - 0x83aa7e80 = 0x631071E6 = 1662022118 [Unix时间戳] = 2022-09-01 16:48:38 【C代码】 target_timestamp = buf[40] << 24 | buf[40 + 1] << 16 | buf[40 + 2] << 8 | buf[40 + 3]; // 当前时间戳 local_timestamp = target_timestamp - NTP_TIMESTAMP_DELTA; // 减去1970和1900的差值 #define NTP_TIMESTAMP_DELTA 2208988800 【对应分析】 0xE6BAF07205 - 0x83aa7e80 = 0xE63745F385 =988 769 809 285 【C代码】 t2.integer = buf[32] << 24 | buf[32 + 1] << 16 | buf[32 + 2] << 8 | buf[32 + 3]; //0xE6 BA EC 67 t2.integer = t2.integer - NTP_TIMESTAMP_DELTA; // 0xE6 BA EC 67 - 0x83aa7e80 = 0x63106DE7 = 1 662 021 095 = 1970-01-01 08:00:01 t2.fraction = buf[36] << 24 | buf[36 + 1] << 16 | buf[36 + 2] << 8 | buf[36 + 3]; //0x21 74 DB 15 t2.fraction = GETUSEC( t2.fraction ); 【对应分析】 【C代码】 t3.integer = local_timestamp; t3.fraction = buf[44] << 24 | buf[44 + 1] << 16 | buf[44 + 2] << 8 | buf[44 + 3]; //0x21 75 A4 EA t3.fraction = GETUSEC( t3.fraction ); local_tick = t3.integer + t.integer; //T4表示接收时间加上时间延迟 t3服务器回传时间 local_ms = t3.fraction + ( t.fraction / 10 ); UTC_time_set( local_tick ); UTC_ms_set( local_ms );