网络时间协议(NTP )是由RFC 1305定义的时间同步协议,用于分布式时间服务器和客户端之间的时间同步。 基于UDP消息转发NTP,使用的UDP端口号是123。

使用NTP的目的是对网络中具有所有时钟的设备进行时钟同步,以匹配网络中所有设备的时钟,从而允许设备基于统一的时间提供各种APP应用程序。

在运行NTP的本地系统上,您可以从其他时钟源接收同步,将其他时钟作为时钟源同步,以及与其他设备相互同步。

实际上,据说NTP协议是一个简单的协议,很快就会被代替。 以前,python也解析过flv协议文件代码。 所有这些APP应用层协议都是开放的,不是私有的。 知道协议很容易解析,不用胡说八道

ntp.go

packagemainimport (' bytes ' ' encoding/binary ' ) Const ) UNIX_sta_timestamp=220898800 )/**NTP协议3358 www . typentpstruct {/1336032 bitsliuint8//2 bitsvnuint8///3bits mode3bitsstratumuint 8轮询单元8//2: rootdelayint 32 rootdispersionint 32 referenceidentifierint 32//64位时间戳指示上次调整参考系统时钟的时间receive timestamp uint 64//transmit timestamp uint 64//服务器时间戳到客户端,指示客户端向服务器发送请求的时间func NewNtp () ) p *Ntp ) /其他参数通常由服务器返回的p *Ntp ) Li:Vn: 3、Mode: 3、 stratum3360}returnp}/**NTP协议信息*/func(this*NTP ) getbytes([]byte(/) /注意在网络中为大端字节排序buf 3360 ) this.mode5) binary.write ) buf,binary.BigEndian,uint8) head ) ) binary.write ) buf,bigEndian,uint8) hig 写入binary.BigEndian,this.Precision ) /其他字节数据binary.write (buf )的this.rootdelay(binary.write ) buf,binary this.RootDispersion ) binary.write ) buf,binary.big endian binary.big endian,this.reference timestamp (binary.wriri ) this.OriginateTimestamp ) binary.BigEndian,this.OriginateTimestamp ) this.receive timestamp (binary.write ) buf, this.transmit timestamp (/27000000000000000000000000000000 ) returnbuf.bytes ) } func(this*NTP ) parse () useUnixSec bool ) var ) bit8uint 8bit 32 int 32 bit 64 uint 64 Rb ) bytes.reader )/这个bit32bit64Rb ) bytes.reader )好像要跳读的话切片BFRB=bytes.newreader(BF ) binary.read ) Rb,binary.BigEndian, bit8) /如果向右偏移6位得到高位2位的LI,则this.LI=bit8(/向右偏移6 )。高位3位的this.VN=(bit82 )5//)向左移动5位,然后向右移动5位,得到低位3位的Li 获得binary.BigEndian,bit8) binary.BigEndian,bit8(this.poll=bit8binary.read (Rb,binary.BigEndian ), bit8) this.precision=bit8//32 bit8/32 bit 32 ) this.root delay=bit 32 binary.read (Rb,binary.BigEndian,bit32 bit32 ) this.reference identifier=bit 32//以下字段均为64位时间戳(NTP均为64位时间戳) binary.read ) Rb, binary.BigEndian,bit64 ) this.reference timestamp=bit 64 binary.read (Rb,binary.BigEndian, bit64 ) this.originate timestamp=bit 64 bian bit 64 ) this.receive timestamp=bit 64 binary.read (Rb,binary.BigEndian, bit64 ) this.TransmitTimestamp=bit64//以及ntp的开始时间戳1900年1月1日0时0分0秒220898800 ifuseunixsec { this.reference timestamp=- UNIX _ sta _ timestampifthis.originate timestamp0(this.originate timestamp=(this.originate timestamp 32 )-UNIX _ on p32 (-UNIX _ sta _ timestamp this.transmit timestamp=) this.transmit

打包管理日志(fmt )网络) (func main ) (var ) NTP * NTP缓冲器) (byteerrerrorretint ) /链接AlibabaCloud (阿里巴巴云) ntp1.aliyun.com:123 ) ) defer func ) {if err :=recover; err!=nil{log.println(err ) }conn.Close ) ) ntp=NewNtp ) ) conn.write (NTP.getbytes ) ) buffer=make ) [ err true ) fmt.println (fmt.sprintf ) ) Li3360 n轮询3360 % d\r\n系统精度:%d\r\n延迟:%ds\r\n最大误差3333365365306; n时间戳表示3360%d%d%d%的ntp.Precision,ntp.RootDelay,ntp.RootDispersion,ntp.ReferenceIdentifier,NTP.referefence