NTP时间溢出

今天在通过wireshark查看一个Diameter消息的时候,发现一个AVP解析失败了,看起来是长度出了问题。

这个AVP的类型是Time,在RFC3588里定义了Time类型:

The Time format is derived from the OctetString AVP Base Format. The string MUST contain four octets, in the same format as the first four bytes are in the NTP timestamp format.
This represents the number of seconds since 0h on 1 January 1900 with respect to the Coordinated Universal Time (UTC).
On 6h 28m 16s UTC, 7 February 2036 the time value will overflow. SNTP [SNTP] describes a procedure to extend the time to 2104.

也就是说NTP协议的时间戳采用了和Unix类似的32位整数表示,但不同Unix的1970+68年的时间范围,NTP使用的是无符号整型,并且以1900年作为时间的起点,这样意味着它的时间终点将会是1900+136 = 2036年2月6日。超出这个时间,将会导致时间获取异常而无法更新时间。

在RFC2030里定义了如何来解决问题的方法。

延长NTP时间戳记使用寿命的一种方便方法是:如果设置位0,则UTC时间在1968-2036范围内,UTC时间从1900年1月1日的0h0m0s UTC开始计算。如果未设置位0,时间范围为2036-2104,UTC时间从2036年2月7日的6h28m16s UTC开始计算。

回到最开始的问题,北向接口发来的时间是字符串格式的”2099-07-04T00:00:00Z“,为了在Diameter消息中传送NTP时间,这个字符串时间先被解析为Unix时间,再加上了2208988800,得到了一个大于2^32的结果,因为time_t是64bits,这个结果并没有被截断。在构建Diameter消息时,这个AVP就被构造成了一个5bytes的字段,Wireshark无法解码。

展开阅读全文

页面更新:2024-05-05

标签:戳记   时间   范围内   整数   字段   字符串   定义   消息   类型   方法

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top