1、NTP如何同步时间

NTP协议是对网络内所有具有时钟的设备进行时钟同步,使网络内所有设备的时钟保持一致。

系统时钟同步的工作过程如下:

Device A发送一个NTP报文给Device B,该报文带有它离开Device A时的时间戳,该时间戳为10:00:00am(T1)。

当此NTP报文到达Device B时,Device B加上自己的时间戳,该时间戳为11:00:01am(T2)。

当此NTP报文离开Device B时,Device B再加上自己的时间戳,该时间戳为11:00:02am(T3)。

当Device A接收到该响应报文时,Device A的本地时间为10:00:03am(T4)。

至此,Device A已经拥有足够的信息来计算两个重要的参数:

NTP报文的往返时延Delay=(T4-T1)-(T3-T2)=2秒。

Device A相对Device B的时间差offset=((T2-T1)+(T3-T4))/2=1小时。

这样,Device A就能够根据这些信息来设定自己的时钟,使之与Device B的时钟同步。

对于android平台,framework中有关于NTP客户端实现的代码SntpClient,使用其requestTime函数,即可同步时间。

2、鉴权模式修改

问题是这样的,最近有需求需要使用特定的NTP服务器,其服务器进行了鉴权加密处理,我使用Android原生的流程去进行时间同步,却一直请求超时,而使用Linux的ntpdate可以正确同步到时间。

下面是NTP报文格式:

其中最后两个字段,则是用于认证用的,分别是KEY ID和信息认证码。所以对于Android原生代码,则需要实现NTP V4版本的才能支持鉴权。从包的格式来看,需要多发KEY ID和信息认证码即可。

修改也不难,首先会从服务器端得到鉴权的KEY ID和鉴权信息。代码部分只需要将android里的NTP版本号改为4,在原本的包后加发一个KEY ID的4个字节数据,最后加发鉴权信息和包数据一起加密出来16个字节(MD5等,这个也得从服务器端得知)。

这样就试了一下,可以从服务器端同步到时间了,具体代码就不贴了,流程基本就是这样。

3、偶发同步到错误时间

但是后面发现一个bug,在同步的时候,会有概率(大概1/10)同步到错误的时间,看了一下包,其中 Originate Timestamp(NTP请求报文离开发送端时发送端的本地时间)和我请求时发出去的Transmit Timestamp(应答报文离开应答者时应答者的本地时间)不对应,这个时间就是我们在上面介绍的时间戳T1。但是Linux服务器使用ntpdate抓的包有时也这样,同步的时间是对的。。。

我对于SntpClient.java中的一处地方不是很理解,正常来说,这两处时间,应该是一样的才对,但是为什么SntpClient.java中不使用自己本地发出去的时间来计算,而是用了服务器返回的时间戳来计算?这里我不是很明白,希望有高手解答一下。

所以当我发现服务器返回的时间戳和我发出去的差别很大(针对我调试的这个服务器我觉得超过30分钟就是服务器回错了,当然这种方法很挫),我就直接用我自己发出去的时间来计算。

这下子就没出现同步时间错误的情况了。

android 自定义ntp,android NTP修改相关推荐

  1. android 自定义 popupwindow,Android自定义弹出窗口PopupWindow使用技巧

    PopupWindow是Android上自定义弹出窗口,使用起来很方便. PopupWindow的构造函数为 public PopupWindow(View contentView, int widt ...

  2. android 自定义特效,Android自定义View之高仿QQ健康

    我们都知道自定义View一般有三种直接继承View.继承原有的控件对控件的进行修改.重新拼装组合,最后一种主要针对于ViewGroup.具体的怎么做不是本文的所涉及的内容(本文是基于第一种方式实现的) ...

  3. android自定义seekbar,Android自定义SeekBar实现视频播放进度条

    本文实例为大家分享了Android实现视频播放进度条的具体代码,供大家参考,具体内容如下 首先来看一下效果图,如下所示: 其中进度条如下: 接下来说一说我的思路,上面的进度拖动条有自定义的Thumb, ...

  4. android自定义横线,Android实现自带横线的EditText

    (一)问题 怎样实现带有横栏的EditText(像记事本的编辑界面那样)? (二)初步思路 1.通过修改EditText背景来实现(系统背景是一个框形图片,内部透明,替换为一个带有横栏的图片即可) 2 ...

  5. zxing android 自定义,ZXing Android Embedded 的使用以及自定义布局 · 小憩之地

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 想做个扫描条形码的功能,第一想到的就是 ZXing 了.ZXing 的功能很强大,通常不需要完整把整个库都作为依赖放进应 ...

  6. android 自定义时钟,Android自定义控件之圆形时钟(续)

    在上篇文章中,我向大家介绍了如何通过自定义View一步步画出一个漂亮的圆形时钟.如果你还没看的话,我不建议你接着往下看,因为这篇文章是接着上篇的文章,如果直接看的话可能会不知所云,所以还是建议你先看一 ...

  7. android 自定义loading,Android自定义动画-StarLoadingView

    今天来分享第二个自定义loading的动画,起了个名字叫 蹦跶的星星 ,还是老规矩先介绍,后上图. 实现效果在最后,GIF有点大,手机流量慎重. 介绍 首先声明做这个动画的初衷是为了学习和分享,所以从 ...

  8. android 自定义命名空间,Android自定义ActionBar实例

    本文实例讲述了android自定义actionbar的实现方法.分享给大家供大家参考.具体实现方法如下: android 3.0及以上已经有了actionbar的api,可以通过引入support p ...

  9. android 自定义图形,Android自定义View之图形图像(模仿360的刷新球自定

    概述: 360安全卫士的那个刷新球(姑且叫它刷新球,因为真的不知道叫什么好,不是dota里的刷新球!!),里面像住了水一样,生动可爱,看似简单,写起来不太简单,本例程只是实现了它的部分功能而已,说实话 ...

  10. android 自定义event,Android运用onTouchEvent自定义滑动布局

    写在自定义之前 我们也许会遇到,自定义控件的触屏事件处理,先来了解一下View类中的,onTouch事件和onTouchEvent事件. 1.boolean onTouch(View v, Motio ...

最新文章

  1. ubuntu下安装ftp服务器
  2. 激动~这是我看到的最好的目标检测RCNN了!
  3. 安装32位mysql报错_在CentOS中安装32位或64位MySql报错error: Failed dependencies解决办法...
  4. wireshark 与 tcpdump抓包
  5. Qt on android 蓝牙开发(控制小车)
  6. MVC3 Razor学习资料汇总(ScottGu的博客截至2011-02-15动态)
  7. 解题报告——蓝桥 试题 基础练习 矩阵乘法——27行代码AC
  8. JBoss5 启动报错java.lang.IllegalArgumentException: ...
  9. Android Studio 无法浏览插件市场
  10. 对 比 学 习 小 综 述
  11. 【045】HTML初学
  12. 在那个春暖花开的季节 今天微微的小雨 伴着轻轻的晚风我们一起来编写 员工考勤信息管理...
  13. python - 正则表达式 与或非
  14. 基于SSH的校园网上订餐系统
  15. 联想服务器 操作系统,联想服务器的raid配置及Server2012操作系统的安装.pdf
  16. 【MySQL】【入门】第二章:数据库及表的创建
  17. 国际化RFID射频常用协议标准
  18. 段永平抄底腾讯:高手不是最完美的,而是最淡定的
  19. 分布式事务之——两段式、三段式
  20. 相机画幅等值计算器_全画幅相机和作物传感器相机有什么区别?

热门文章

  1. element popover 不显示/不隐藏问题解决方法
  2. # 前端基础(HTML + CSS + JavaScript)
  3. golang printf 格式化输出
  4. 伟创力Flextronics EDI 850订单详解
  5. Unity——Invoke
  6. mysql.user表_mysql.user表详解
  7. 实现CentOS/Ubuntu server上任务栏固定到桌面下方 - 收藏夹一直显示 - 任务栏在哪里 - 任务栏怎么弹出
  8. Oracle公司的历史发展
  9. react-notifications-component,一个强大的React Notifications库
  10. usaco java_USACO Section1.1