Linux下 C/C++ NTP网络时间协议详解
NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议。它是通过网络在计算机系统之间进行时钟同步的网络协议。NTP 在公共互联网上通常能够保持时间延迟在几十毫秒以内的精度,并在理想条件下,它能在局域网下达到低于一毫秒的延迟精度。它使用用户数据报协议(UDP)在端口 123 上发送和接受时间戳。它是个 C/S 架构的应用程序。
NTP工作原理
NTP的基本工作原理如图所示。Device A和Device B通过网络相连,它们都有自己独立的系统时钟,需要通过NTP实现各自系统时钟的自动同步。为便于理解,作如下假设:
·在Device A和Device B的系统时钟同步之前,Device A的时钟设定为10:00:00am,Device B的时钟设定为11:00:00am。
·Device B作为NTP时间服务器,即Device A将使自己的时钟与Device B的时钟同步。
·NTP报文在Device A和Device B之间单向传输所需要的时间为1秒。

系统时钟同步的工作过程如下:
·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的时钟同步。
以上内容只是对NTP工作原理的一个粗略描述.
/*** T1,客户端发送请求时的 本地系统时间戳;* T2,服务端接收到客户端请求时的 本地系统时间戳;* T3,服务端发送应答数据包时的 本地系统时间戳;* T4,客户端接收到服务端应答数据包时的 本地系统时间戳。*/
NTP 报文格式
/** Dissecting NTP packets version 3 and 4 (RFC5905, RFC2030, RFC1769, RFC1361,* RFC1305).** Those packets have simple structure:* 1 2 3* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* |LI | VN |Mode | Stratum | Poll | Precision |* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* | 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/160) |* | |* | |* | |* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* NTP timestamps are represented as a 64-bit unsigned fixed-point number,* in seconds relative to 0h on 1 January 1900. The integer part is in the* first 32 bits and the fraction part in the last 32 bits.*** NTP Control messages as defined in version 2, 3 and 4 (RFC1119, RFC1305) use* the following structure:* 1 2 3* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* |00 | VN | 110 |R E M| OpCode | Sequence |* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* | Status | Association ID |* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* | Offset | Count |* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* | |* | Data (468 octets max) |* | |* | | Padding (zeros) |* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* | Authenticator (optional) (96) |* | |* | |* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+** Not yet implemented: complete dissection of TPCTRL_OP_SETTRAP,* NTPCTRL_OP_ASYNCMSG, NTPCTRL_OP_UNSETTRAPSETTRAP Control-Messages**/
NTP Version 3
NTP Version 4

它的字段含义参考如下:
LI 闰秒标识器,占用2个bit
VN 版本号,占用3个bits,表示NTP的版本号,现在为3
Mode 模式,占用3个bits,表示模式
stratum(层),占用8个bits
Poll 测试间隔,占用8个bits,表示连续信息之间的最大间隔
Precision 精度,占用8个bits,,表示本地时钟精度
Root Delay根时延,占用8个bits,表示在主参考源之间往返的总共时延
Root Dispersion根离散,占用8个bits,表示在主参考源有关的名义错误
Reference Identifier参考时钟标识符,占用8个bits,用来标识特殊的参考源
参考时间戳,64bits时间戳,本地时钟被修改的最新时间。
原始时间戳,客户端发送的时间,64bits。
接受时间戳,服务端接受到的时间,64bits。
传送时间戳,服务端送出应答的时间,64bits。
认证符(可选项)
NTP的工作模式
NTP支持以下几种工作模式:
1.客户端/服务器模式2.对等体模式3.广播模式4.组播模式
用户可以根据需要选择一种或几种工作模式进行时间同步,我们主要讲解客户端/服务器模式。
工作过程:
客户端上需要手工指定NTP服务器的地址。客户端向NTP服务器发送NTP时间同步报文。NTP服务器收到报文后会自动工作在服务器模式,并回复应答报文如果客户端可以从多个时间服务器获取时间同步,则客户端收到应答报文后,进行时钟过滤和选择,并与优选的时钟进行时间同步
一些常用的 NTP 服务器地址:
ntp.tencent.com
ntp1.tencent.com
ntp2.tencent.com
ntp3.tencent.com
ntp4.tencent.com
ntp5.tencent.com
ntp.aliyun.com
ntp1.aliyun.com
ntp2.aliyun.com
ntp3.aliyun.com
ntp4.aliyun.com
ntp5.aliyun.com
ntp6.aliyun.com
ntp7.aliyun.com
time.edu.cn
s2c.time.edu.cn
s2f.time.edu.cn
NTP客户端连接服务器获取网络时间戳
typedef enum xntp_mode_t
{ntp_mode_unknow = 0, ///< 未定义ntp_mode_initiative = 1, ///< 主动对等体模式ntp_mode_passive = 2, ///< 被动对等体模式ntp_mode_client = 3, ///< 客户端模式ntp_mode_server = 4, ///< 服务器模式ntp_mode_broadcast = 5, ///< 广播模式或组播模式ntp_mode_control = 6, ///< 报文为 NTP 控制报文ntp_mode_reserved = 7, ///< 预留给内部使用
} xntp_mode_t;static x_void_t output_tu(x_cstring_t xszt_info, xtime_vnsec_t xtm_vnsec)
{printf("%s : ", xszt_info);output_ns(xtm_vnsec);printf("\n");
}/**********************************************************/
/***打上信息标号,输出 NTP 时间戳 的 具体时间信息。*/
static x_void_t output_tm(x_cstring_t xszt_info, xtime_stamp_t * xtm_stamp)
{printf("%s : ", xszt_info);output_ts(xtm_stamp);printf("\n");
}...
xtime_vnsec_t ntpcli_get_time(x_cstring_t xszt_host,x_uint16_t xut_port,x_uint32_t xut_tmout)
{x_int32_t xit_errno = EPERM;xtime_vnsec_t xtm_vnsec = XTIME_INVALID_VNSEC;xntp_cliptr_t xntp_this = X_NULL;do{xntp_this = ntpcli_open();if (X_NULL == xntp_this){break;}xit_errno = ntpcli_config(xntp_this, xszt_host, xut_port);if (0 != xit_errno){errno = xit_errno;break;}xtm_vnsec = ntpcli_req_time(xntp_this, xut_tmout);} while (0);if (X_NULL != xntp_this){ntpcli_close(xntp_this);xntp_this = X_NULL;}return xtm_vnsec;
}
/**********************************************************/
/***初始化 NTP 的请求数据包。*/
static x_void_t ntp_init_req_packet(xntp_pack_t * xnpt_dptr)
{
...xnpt_dptr->xct_lvmflag = NTP_LI_VN_MODE(0, 3, ntp_mode_client);xnpt_dptr->xct_stratum = 0;xnpt_dptr->xct_ppoll = 4;xnpt_dptr->xct_percision = (x_char_t)(-6);xnpt_dptr->xut_rootdelay = (1 << 16);xnpt_dptr->xut_rootdisp = (1 << 16);xnpt_dptr->xut_refid = 0;xnpt_dptr->xtms_reference.xut_seconds = 0;xnpt_dptr->xtms_reference.xut_fraction = 0;xnpt_dptr->xtms_originate.xut_seconds = 0;xnpt_dptr->xtms_originate.xut_fraction = 0;xnpt_dptr->xtms_receive .xut_seconds = 0;xnpt_dptr->xtms_receive .xut_fraction = 0;xnpt_dptr->xtms_transmit .xut_seconds = 0;xnpt_dptr->xtms_transmit .xut_fraction = 0;
}/**********************************************************/
/*** 发送 NTP 请求,获取服务器时间戳。*/
xtime_vnsec_t ntpcli_req_time(xntp_cliptr_t xntp_this, x_uint32_t xut_tmout)
{x_int32_t xit_errno = EPERM;// 参数验证if (X_NULL == xntp_this){errno = EINVAL;return XTIME_INVALID_VNSEC;}if (name_is_ipv4(xntp_this->xszt_host, X_NULL))xit_errno = ntpcli_get_4T(xntp_this, xntp_this->xszt_host, xut_tmout);elsexit_errno = ntpcli_get_4T_by_name(xntp_this, xut_tmout);if (0 != xit_errno){errno = xit_errno;return XTIME_INVALID_VNSEC;}return ntp_calc_4T(xntp_this->xtm_4time);
}/** 常用的 NTP 服务器地址列表 */
x_cstring_t xszt_host[] =
{"ntp.tencent.com" ,"ntp1.tencent.com","ntp2.tencent.com","ntp3.tencent.com","ntp4.tencent.com","ntp5.tencent.com","ntp1.aliyun.com" ,"ntp2.aliyun.com" ,"ntp3.aliyun.com" ,"ntp4.aliyun.com" ,"ntp5.aliyun.com" ,"ntp6.aliyun.com" ,"ntp7.aliyun.com" ,"time.edu.cn" ,"s2c.time.edu.cn" ,"s2f.time.edu.cn" ,"s2k.time.edu.cn" ,X_NULL
};/** 网络地址(IP 或 域名)类型 */
typedef x_char_t x_host_t[TEXT_LEN_256];/*** 命令选项的各个参数。*/
typedef struct xopt_args_t
{x_bool_t xbt_usage; ///< 是否显示帮助信息x_uint16_t xut_port; ///< NTP 服务器端口号(默认值为 123)x_host_t xntp_host; ///< NTP 服务器地址x_int32_t xit_rept; ///< 请求重复次数(默认值为 1)x_uint32_t xut_tmout; ///< 网络请求的超时时间(单位为 毫秒,默认值取 3000)
} xopt_args_t;/** 简单的判断 xopt_args_t 的有效性 */
#define XOPT_VALID(xopt) (('\0' != (xopt).xntp_host[0]) && ((xopt).xit_rept > 0))/**********************************************************/
/*** 字符串忽略大小写的比对操作。*/
static x_int32_t xstr_icmp(x_cstring_t xszt_lcmp, x_cstring_t xszt_rcmp)
{x_int32_t xit_lvalue = 0;x_int32_t xit_rvalue = 0;if (xszt_lcmp == xszt_rcmp)return 0;if (X_NULL == xszt_lcmp)return -1;if (X_NULL == xszt_rcmp)return 1;do{if (((xit_lvalue = (*(xszt_lcmp++))) >= 'A') && (xit_lvalue <= 'Z'))xit_lvalue -= ('A' - 'a');if (((xit_rvalue = (*(xszt_rcmp++))) >= 'A') && (xit_rvalue <= 'Z'))xit_rvalue -= ('A' - 'a');} while (xit_lvalue && (xit_lvalue == xit_rvalue));return (xit_lvalue - xit_rvalue);
}/**********************************************************/
/***显示应用程序的 命令行格式。*/
x_void_t usage(x_cstring_t xszt_app)
{x_int32_t xit_iter = 1;printf("Usage:\n %s [-h] [-n <number>] -s <host> [-p <port>] [-t <msec>]\n", xszt_app);printf("\t-h Output usage.\n");printf("\t-n <number> The times of repetition.\n");printf("\t-s <host> The host of NTP server, IP or domain.\n");printf("\t-p <port> The port of NTP server, default 123.\n");printf("\t-t <msec> Network request timeout in milliseconds, default 3000.\n");printf("\nCommon NTP server:\n");for (xit_iter = 0; X_NULL != xszt_host[xit_iter]; ++xit_iter){printf("\t%s\n", xszt_host[xit_iter]);}printf("\n");
}/**********************************************************/
/*** 从命令行中,提取工作的选项参数信息。*/
x_void_t get_opt(x_int32_t xit_argc, x_cstring_t xszt_argv[], xopt_args_t * xopt_args)
{
...for (; xit_iter < xit_argc; ++xit_iter){if (!xopt_args->xbt_usage && (0 == xstr_icmp("-h", xszt_argv[xit_iter]))){xopt_args->xbt_usage = X_TRUE;}else if (0 == xstr_icmp("-s", xszt_argv[xit_iter])){if ((xit_iter + 1) < xit_argc){
...}}else if (0 == xstr_icmp("-n", xszt_argv[xit_iter])){if ((xit_iter + 1) < xit_argc)xopt_args->xit_rept = atoi(xszt_argv[++xit_iter]);}else if (0 == xstr_icmp("-p", xszt_argv[xit_iter])){if ((xit_iter + 1) < xit_argc)xopt_args->xut_port = (x_uint16_t)atoi(xszt_argv[++xit_iter]);}else if (0 == xstr_icmp("-t", xszt_argv[xit_iter])){if ((xit_iter + 1) < xit_argc)xopt_args->xut_tmout = (x_uint32_t)atoi(xszt_argv[++xit_iter]);}}
}int main(int argc, char * argv[])
{
...do{get_opt(argc, argv, &xopt_args);if (!XOPT_VALID(xopt_args)){usage(argv[0]);break;}if (xopt_args.xbt_usage){usage(argv[0]);}xntp_this = ntpcli_open();if (X_NULL == xntp_this){printf("ntpcli_open() return X_NULL, errno : %d\n", errno);break;}ntpcli_config(xntp_this, xopt_args.xntp_host, xopt_args.xut_port);for (xit_iter = 0; xit_iter < xopt_args.xit_rept; ++xit_iter){xtm_vnsec = ntpcli_req_time(xntp_this, xopt_args.xut_tmout);if (XTMVNSEC_IS_VALID(xtm_vnsec)){xtm_ltime = time_vnsec();xtm_descr = time_vtod(xtm_vnsec);xtm_local = time_vtod(xtm_ltime);printf("\n[%d] %s:%d : \n",xit_iter + 1,xopt_args.xntp_host,xopt_args.xut_port);printf("\tNTP response : [ %04d-%02d-%02d %d %02d:%02d:%02d.%03d ]\n",xtm_descr.ctx_year ,xtm_descr.ctx_month ,xtm_descr.ctx_day ,xtm_descr.ctx_week ,xtm_descr.ctx_hour ,xtm_descr.ctx_minute,xtm_descr.ctx_second,xtm_descr.ctx_msec );printf("\tLocal time : [ %04d-%02d-%02d %d %02d:%02d:%02d.%03d ]\n",xtm_local.ctx_year ,xtm_local.ctx_month ,xtm_local.ctx_day ,xtm_local.ctx_week ,xtm_local.ctx_hour ,xtm_local.ctx_minute,xtm_local.ctx_second,xtm_local.ctx_msec );printf("\tDeviation : %lld us\n",((x_int64_t)(xtm_ltime - xtm_vnsec)) / 10LL);}else{printf("\n[%d] %s:%d : errno = %d\n",xit_iter + 1,xopt_args.xntp_host,xopt_args.xut_port,errno);}}} while (0);if (X_NULL != xntp_this){ntpcli_close(xntp_this);xntp_this = X_NULL;}
...return 0;
}
...
运行结果:
If you need the complete source code, please add the WeChat number (c17865354792)
在客户端/服务器模式中,客户端向服务器发送时钟同步报文,报文中的Mode字段设置为3(客户模式)。服务器端收到报文后会自动工作在服务器模式,并发送应答报文,报文中的Mode字段设置为4(服务器模式)。客户端收到应答报文后,进行时钟过滤和选择,并同步到优选的服务器。
在该模式下,客户端能同步到服务器,而服务器无法同步到客户端。
- tcpdump抓包分析

NTP协议应用于分布式时间服务器和客户端之间,实现客户端和服务器的时间同步,从而使网络内所有设备的时钟基本保持一致。下面的报文是客户端连接服务器时产生的交互过程。

- NTP协议解析
If you need the complete source code, please add the WeChat number (c17865354792)
总结
NTP客户端启动与NTP服务器的时间请求交换。交换的结果是,客户端能够计算链路延迟及其本地偏移,并调整其本地时钟以匹配服务器计算机上的时钟。
Welcome to follow WeChat official account【程序猿编码】
参考:1.RFC 1305
2.http://ntp.neu.edu.cn/archives/92/
3.http://ntp.neu.edu.cn/archives/95
相关文章:
Linux下 C/C++ NTP网络时间协议详解
NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议。它是通过网络在计算机系统之间进行时钟同步的网络协议。NTP 在公共互联网上通常能够保持时间延迟在几十毫秒以内的精度,并在理想条件下,它能…...
Pytest自动化框架-权威教程02-Pytest 使用及调用方法
Pytest 使用及调用方法使用python -m pytest调用pytest2.0版本新增你可以在命令行中通过Python编译器来调用Pytest执行测试:Copypython -m pytest [...]通过python调用会将当前目录也添加到sys.path中,除此之外,这几乎等同于命令行直接调用pytest [...]。可能出现的执行退出cod…...
大数据技术——概述
根据IBM前首席执行官郭士纳的观点,IT领域每隔十五年就会迎来一次重大变革三次信息化浪潮1.存储设备容量不断增加2.CPU处理能力大幅提升3.网络带宽不断增加运营式系统阶段数据库的出现使得数据管理的复杂度大大降低,数据往往伴随着一定的运营活动而产生并记录在数据库…...
java-代理模式
背景 代理模式指的是提供一个代理对象用于访问目标对象,可以很方便的在不修改目标对象的情况下,提供额外的功能,扩展目标对象。 case1:静态代理 约束:代理对象和目标对象要实现相同的接口 优点:不修改目标对象的情况下扩展功能 缺点:必须实现相同的接口,如果接口发生变…...
路由网络的构建与配置
Part.1 ⑴ 需求分析 在构建的局域网中,通过路由器间配置静态路由,实现PC1和PC2主机直接连通,主机网段不能与路由器直接互联网段通信。 ⑵ 环境要求 配置虚拟网卡的计算机,安装华为eNSP模拟软件。 规划拓扑 Part.2 ⑴ 拓扑描述…...
软件测试-接口测试-数据库管理
文章目录 1.数据库介绍2.数据库基本操作2.1安装2.2 操作流程2.3数据准备2.4数据的基本操作2.4.1 连接数据库并查询数据库版本2.4.2 连接数据库执行数据库查询操作2.4.3 连接数据库执行数据库插入操作2.4.4 连接数据库执行数据库更新操作3.数据库事务操作3.1 案例:数据不一致性…...
【华为OD机试 】天然蓄水库(C++ Java JavaScript Python)
文章目录 题目描述输入描述输出描述备注用例题目解析C++JavaScriptJavaPython题目描述 公元2919年,人类终于发现了一颗宜居星球——X星。 现想在X星一片连绵起伏的山脉间建一个天热蓄水库,如何选取水库边界,使蓄水量最大? 要求: 山脉用正整数数组s表示,每个元素代表山脉…...
普元EOS中导出excl页面下载
起因 需要做一个筛选功能的导出表格 解决办法 这个垃圾eos我是真受不了,sb玩意的缺点三天三夜也说不完 后边就没法整response的这些个东西,可真是够愁人的 在网上搜了搜 在普元的帮助文档里也看了看 普元提供的像是老太太的裹脚布一般又臭又长 参照这个可以看一下...
内存的管理
取指令——译码——执行——返存 计组课我们学过cpu真正读指令并非是从内存中读入,而是从cache读和存,再由cache进行取指或返存,因为cpu指令周期比内存周期速度快很多,cpu若要取指或返存都需要等待内存完成他的动作才可以进行下一…...
OpenFeign 切换HttpClient遇到的问题
背景 OpenFeign支持三种Http请求方式,默认情况下通过jdk中的HttpURLConnection向下游服务发起http请求(详见下图,源码详见feign.Client.Default), 默认的Client 采用 HttpURLConnection, 这种是无法复用的…...
流计算框架storm概览
Attention: supervison 和 nimbus的状态都实时保存在zookeeper集群中和本地. Enchance, this means you can kill -9 Nimbus or the Supervisors and theyll start back up as nothing happened. Topologies 1. storm jar all-my-code.jar org.apache.storm.MyTopology a…...
如何使用Coercer强制Windows Server认证任意主机
关于Coercer Coercer是一款功能强大的Python脚本,该工具可以通过九种不同的方法来强制让一台Windows Server认证任意主机。 功能介绍 1、自动检测远程设备的开放SMP管道; 2、一一调用存在安全漏洞的RPC功能来强制一台Windows Server认证任意主机&#…...
【小程序】已有公众号认证,一步一步申请小程序(图文)
一、登陆公众号后台,找到左侧广告与服务,小程序管理,开通 二、选择快速注册认证小程序 三、快速创建 四、选择微信认证资质(复用),这样不用再付认证费了 五、需要一个新的邮箱,这点挺让人无语&a…...
Redis学习笔记:缓存运用常见问题
这是本人学习的总结,主要学习资料如下 马士兵教育 目录1、数据一致性的问题1.1、新增数据一致性的问题1.2、修改/删除一致性问题1.2.1、操作分析1.2.1、总结和再深入2、缓存穿透,缓存击穿和缓存雪崩2.1、缓存穿透(查不到)2.1.1、…...
使用python 脚本挑出coco 数据集中的某一类数据
文章大纲 简介代码样例制作一个走路玩手机数据集简介 MS COCO的全称是Microsoft Common Objects in Context,起源于微软于2014年出资标注的Microsoft COCO数据集,与ImageNet竞赛一样,被视为是计算机视觉领域最受关注和最权威的比赛之一。 COCO数据集是一个大型的、丰富的物…...
Python虚拟环境(pipenv、venv、conda一网打尽)[通俗易懂]
一、什么是虚拟环境 1. 什么是Python环境 要搞清楚什么是虚拟环境,首先要清楚Python的环境指的是什么。当我们在执行python test.py时,思考如下问题: python哪里来?这个主要归功于配置的系统环境变量PATH,当我们在命…...
Android Kotlin实战之高阶使用泛型扩展协程懒加载详解
前言: 通过前面几篇文章,我们已基本掌握kotlin的基本写法与使用,但是在开发过程中,以及一些开源的API还是会出现大家模式的高阶玩法以及问题,如何避免,接下来讲解针对原来的文章进行一些扩展,解…...
数字映射:数字孪生技术的应用场景及作用
对于许多行业来说,数字孪生技术是未来。数字孪生定义数字孪生不仅仅是某物的副本或克隆,它是对象或系统的动态实时表示。数字孪生是一种虚拟模型,旨在准确反映物理对象。是物理对象、流程、服务或环境的数字表示,其行为和外观与现…...
配置二层远程端口镜像案例
实验拓扑: 实验需求: 如图1所示,某公司行政部通过SwitchA与外部Internet通信,监控设备Server通过SwitchB与SwitchA相连。 现在希望Server能够远程对行政部访问Internet的流量进行监控。 操作步骤: 配置观察端口 # 在…...
Linux-0.11 kernel目录fork.c详解
Linux-0.11 kernel目录fork.c详解 fork.c中主要实现内核对于创建新的进程的行为。其中copy_process是其最核心的函数。 copy_process int copy_process(int nr,long ebp,long edi,long esi,long gs,long none,long ebx,long ecx,long edx,long fs,long es,long ds,long eip,…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
