卫星授时(网络授时服务器)源代码挥泪吐血共享

序号

功能需求

说明

1

基本功能

1. 根据NTP 服务协议,与外部 ntp 服务器进行通讯。 2. 解析ntp 协议包,从中提取有效信息。 3. 通过计算得到网络延时、本地时差,并计算出本地的标准时间。 4. 重新设定本地时间。

2

扩展功能

1. 设置校准时间间隔,即每隔指定时间校准一次。 2. 实现服务日志,对启动服务后的程序状态进行记录。 3. 实现后台运行,使程序脱离终端在后台运行,程序需通过解析配置文档获得配置信息。

3

服务模式

1. 交互式运行:在终端交互式运行服务程序,交互式获取配置信息。 2. 守护进程模式:作为守护进程在后台运行,通过配置文件获取配置信息,配置文件默认路劲:/etc/ntpclient/ntpclient.conf 。

4

启动脚本

1. 默认路径:/etc/ini.d/ntpclient 。 2. 启动选项:start ,后台启动服务。 3. 启动选项:stop ,终止后台服务。 4. 启动选项:status ,查看服务状态。 5. 启动选项:restart ,重启服务。

5

安装脚本

1. 安装选项:-i ,安装程序。 2. 安装选项:-d ,卸载程序。

背景知识:

1. 培训视频:

《Linux 应用程序开发班》 / 第 8 天 -NTP 网络协议实现 /培训视频 /NTP网络协议实现 .avi 。

2. NTP协议介绍:

网络时间协议(NTP )是一种通过因特网服务于计算机时钟的同步时间协议。它提供了一种同步时间机制,能在庞大而复杂多样的因特网中用光速调整时间分配。它使用的是可返回时间设计方案,其特点是:时间服务器是一种分布式子网,能自我组织操作、分层管理配置,经过有线或无线方式同步逻辑时钟达到国家标准时间。此外,通过本地路由选择运算法则及时间后台程序,服务器可以重新分配标准时间。

NTP 的校时涉及三个概念 — 时间偏差、时间延迟及差量,它们与指定参考时钟都是相关联的。时钟偏差表示本地时钟与参考时钟之间的偏差数;时间延迟表示在指定时间内由一方发送消息到另一方接收到消息间的延时时间;差量表示了相对于参考时钟本地时钟的最大偏差错误。因为大多数主机时间服务器通过其它对等时间服务器达到同步,所以这三个参量都有两个组成部分:其一是由对等决定的部分,这部分是相对于原始标准时间的参考来源而言;其二是由主机衡量的部分,这部分是相对于对等而言。每一部分在协议中都是独立维持的,从而可以使错误控制和子网本身的管理操作变得容易。它们不仅提供了偏移和延迟的精密测量,而且提供了明确的最大错误范围,这样用户接口不但可以决定时间,而且可以决定时间的准确度。

3. NTP协议包结构:

进行网络协议实现时最重要的是了解协议数据格式。除了可扩展部分,基本的NTP 数据包有 48 个字节,其中 NTP 包头 16 字节,时间戳 32 个字节。其协议格式下表所示。

2

5

8

16

24

32bit

LI (2 )

VN (3 )

Mode (3 )

Stratum (8 )

Poll (8 )

Precision (8 )

Root Delay

Root Dispersion

Reference Identifier

Reference timestamp( 64 )

Originate Timestamp( 64 )

Receive Timestamp( 64 )

Transmit Timestamp( 64 )

Key Identifier( optional )( 32 )

Message digest( optional )( 128 )

· LI:跳跃指示器,警告在当月最后一天的最终时刻插入的迫近闺秒(闺秒)。

· VN:版本号。

· Mode:模式。该字段包括以下值:0-预留;1-对称行为;3-客户机;4-服务器;5-广播;6-NTP 控制信息

· Stratum:对本地时钟级别的整体识别。

· Poll:有符号整数表示连续信息间的最大间隔。

· Precision:有符号整数表示本地时钟精确度。

· Root Delay:有符号固定点序号表示主要参考源的总延迟,很短时间内的位15到16间的分段点。

· Root Dispersion:无符号固定点序号表示相对于主要参考源的正常差错,很短时间内的位15到16间的分段点。

· Reference Identifier:识别特殊参考源。

· Originate Timestamp:这是向服务器请求分离客户机的时间,采用64位时标(Timestamp)格式。

· Receive Timestamp:这是向服务器请求到达服务器的时间,采用64位时标(Timestamp)格式。

· Transmit Timestamp:这是向客户机答复分离服务器的时间,采用64位时标(Timestamp)格式。

Authenticator(Optional):当实现了 NTP 认证模式,主要标识符和信息数字域就包括已定义的信息认证代码(MAC)信息。

4. Daemon 进程概念:

Daemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,是因为它没有控制终端,无法和前台的用户交互。Daemon程序一般都作为服务程序使用,等待客户端程序与它通信。我们也把运行的Daemon程序称作守护进程。

比如,我们的网络服务程序,可以在完成创建套接口,绑定套接口,设置套接口为监听模式后,变成守护进程进入后台执行而不占用控制终端,这是网络服务程序的常用模式。Linux下的网络服务程序,如samba、FTP、Telnet一般都是由守护进程(Daemon)来实现的。Linux的守护进程一般都命名为*d的形式,如httpd,telnetd等等。守护进程一旦脱离了终端,退出就成了问题。可以使用命令:ps aux|grep *,其中*号为进程名,找到相应进程的ID,再使用命令:kill -SIGTERM ID,终止它。

5. Daemon 程序编写:

编写Daemon程序有一些基本的规则,以避免不必要的麻烦。

(1) 首先是程序运行后调用fork,并让父进程退出。子进程获得一个新的进程ID,但 继承了父进程的进程组ID。

(2) 调用setsid创建一个新的session,使自己成为新session和新进程组的leader,并使进程没有控制终端(tty)。

(3) 改变当前工作目录至根目录,以免影响可加载文件系统。或者也可以改变到某些特定的目录。

(4) 设置文件创建mask为0,避免创建文件时权限的影响。

(5) 关闭不需要的打开文件描述符。因为Daemon程序在后台执行,不需要于终端交互,通常就关闭STDIN、STDOUT和STDERR。其它根据实际情况处理。

另一个问题是Daemon程序不能和终端交互,也就无法使用printf方法输出信息了。我们可以使用syslog机制来实现信息的输出,方便程序的调试。当然,你也可以把这些信息输出到自己的日志文件中查看。

下面给出一段Daemon程序的例子:

#include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <stdio.h> #include <syslog.h> #include <signal.h> int daemon_init(void) { pid_t pid; if((pid = fork()) < 0) return(-1); else if(pid != 0) exit(0); /* parent exit */ /* child continues */ setsid(); /* become session leader */ chdir("/"); /* change working directory */ umask(0); /* clear file mode creation mask */ close(0); /* close stdin */ close(1); /* close stdout */ close(2); /* close stderr */ return(0); } void sig_term(int signo) { if(signo == SIGTERM) //catched signal sent by kill(1) command { syslog(LOG_INFO, "program terminated."); closelog(); exit(0); } } int main(void) { daemon_init(); openlog("daemontest", LOG_PID, LOG_USER); syslog(LOG_INFO, "program started."); signal(SIGTERM, sig_term); /* arrange to catch the signal */ while(1) { sleep(1); /* put your main program here */ } return(0); }

333�3XTҏ

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏中科院渣渣博肆僧一枚

Linux的sed命令

Linux sed 命令是利用脚本来处理文本文件。sed 可依照脚本的指令来处理、编辑文本文件。Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编...

8510
来自专栏从零开始学自动化测试

jmeter压测学习2-linux运行jmeter环境

使用jmeter做压测的时候,在windows上不太稳定,所有一直在linux服务器上使用jmeter做压力测试。 本篇记录下linux上搭建jmeter环境,...

6710
来自专栏Kirito的技术分享

系统性能优化工具集合与使用技巧

之前组内一位大佬分享了一些关于系统性能优化方面的干货,这里我将它整理成文并且加入自己平时常用的一些工具和技巧。由于关于系统性能优化涉及的内容非常多,我会分几篇文...

6210
来自专栏深圳java培训

深圳软件测试培训学习:网络基础 — ping命令(1)--千锋

ping命令可以说是我们平时最常用的一个网络命令了,用于检测本地与目标主机的网络是否连通。这个命令有许多选项可以帮我们进一步分析网络的通信情况。

9020
来自专栏二狗的DBA之路

ES索引管理工具 - curator

官方文档:https://www.elastic.co/guide/en/elasticsearch/client/curator/current/action...

17540
来自专栏曲水流觞TechRill

【小知识大道理】被忽视的位运算

运算符的优先级:~ 的优先级最高,其次是 <<、>> 和 >>>,再次是&,然后是 ^,优先级最低的是 |。

9920
来自专栏Spring Boot 2.X 系列

Spring Boot 2.X(十二):定时任务

定时任务是后端开发中常见的需求,主要应用场景有定期数据报表、定时消息通知、异步的后台业务逻辑处理、日志分析处理、垃圾数据清理、定时更新缓存等等。

5520
来自专栏曲水流觞TechRill

漫谈“架构团队”之组织架构

关于架构可以谈的东西太多,本文聚焦在组织架构维度,基本也算是笔者在当前公司里的最佳实践(别抬杠,对您很可能不是最佳),另外部分内容参考了《架构即未来》一书。

8310
来自专栏Jenkins

Jenkins CLI 命令行 v0.0.22

项目地址:https://github.com/jenkins-zh/jenkins-cli

4920
来自专栏云爬虫技术研究笔记

下一代容器架构已出,Docker何去何处?看看这里的6问6答!!

我猜很多人一看这个标题已经感觉很懵逼了,什么?下一代容器都出来了,我还没学Docker呢!!!

14530

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励