给产品经理讲技术丨你了解计算机时间吗?小心肾6变砖6
【文章摘要】你也许会笑了,又不是TFBoys这种土豪,谁会去设置这种奇葩时间呢?
【相关推荐】
给产品经理讲技术丨乱码导致的悲剧告白
给产品经理讲技术丨把URL五马分尸
给产品经理讲技术丨没线,并不可怕?
给产品经理讲技术丨提需求的正确姿势是什么
给产品经理讲技术丨产品后悔药来了,讲讲热补丁技术
最近Apple老是搞出一些大新闻,感觉每天都能上头条,请问汪峰现在在哪里?即使你不关心「Apple Pay入华」,也不在乎「库克拒绝给FBI开后门」,但是这条「iPhone时间调到1970年1月1日将会变砖」应该要引起你的重视了。今天的封面少年就以身试法体验了一下这个iOS的新特性(bug),效果棒棒哒:)
究其原因还得从Unix时间说起。在我们生活中,时间的表示方法有多种,有的人喜欢这么写「2016/2/24 23:41:34」,老外们喜欢这样写「Wed, 24 Feb 2016 15:41:34 GMT」,而在程序中只会写成「1456328494」这样。这个就是Unix时间,它是用一个正整数来表示一个时间与基准时间(UTC时间的1970年1月1日0时0分0秒)相差的秒数,而「1456328494」表示我写文章的时间点距基准时间已经过去了1456328494秒。
而iOS这个坑是怎么趟上的呢?据砖家分析,这是因为一群活着东8区的人类,把系统时间改成了基准时间(1970年1月1日0时0分0秒),这个时候的时间戳是0,但是因为东8区要在UTC时间上加8个小时,那么算下来系统的Unix时间就是负8小时。可是Unix时间都是正整数啊,如果给一个负数,数字就会变成从最大的正整数倒着往下走了(假设你懂二进制),那么在32位的机器上的负8小时就会变成「2038年1月18日19时14分07秒」,这种情况系统还能应付,可是到了64位的机器上就变成了「292,277,026,596年12月4日7时30分08秒」,这个时候再启动手机,系统就懵逼了,完全搞不定这么久远的年代啊,结果就变砖咯…
你也许会笑了,又不是TFBoys这种土豪,谁会去设置这种奇葩时间呢?如果我说,存在某种手段,可以悄悄的把你手机时间改到1970年,你是不是就慌了呢?这种手段就是依赖了手机上的时间同步机制。
NTP(Network Time Protocol)网络时间协议是流行的一种同步时间的协议,iOS上也用它来同步时间。我们在网络上部署了一些标准的时钟服务器,其它设备都通过NTP协议来计算自己的时钟与标准时钟的误差,再调整自己的时钟来弥补这个误差,这样设备上的时间就和标准时间一致了。
简单学习一下NTP的原理,图中Device A是我们的设备,Device B是标准时钟服务器,同步流程如下:
- Device A发送一个NTP消息给Device B,这个消息包含了它离开Device A时的时间戳,该时间戳为10:00:00 am (T0)
- 当这个NTP消息到达服务器Device B时,Device B会加上自己的时间戳,该时间戳为11:00:01 am (T1)
- 然后再将这个NTP消息返回给Device A,当该NTP消息离开Device B时,再加上Device B的时间戳,该时间戳为11:00:02 am (T2)
- 当Device A接收到该NTP消息时,Device A的本地时间戳为10:00:03 am (T3)
这样我们可以算出两个时间,一个时间是消息往返两个设备的时延Delay=(T3-T0)-(T2-T1)=2秒;另一个时间是 Device A相对Device B的时间差offset=((T2-T1)+(T3-T4))/2=1小时。
如果你手机连接的局域网上有一台时间服务器,它将自己的时钟设置为1970年的那个基准时间,然后将这个局域网内的所有NTP协议,都劫持到这台服务器上,那么其它使用了自动同步时间的设备,时间都会变成1970年。如果恰好这个时候你重启了手机,那么恭喜你,你得到了一块砖头。
欢迎添加微信公众号:给讲技术