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,…...
如何或者无插件Web页面监控播放软件LiveNVR的固定视频流地址,实现大屏上墙、播放、视频分析等目的
1、LiveNVR介绍 LiveNVR的安防监控的视频直播,可以按标准的Onvif/RTSP协议接入监控设备,也可以通过海康、大华、天地伟业等厂家私有SDK接入监控,实现web页面的播放和录像回放。 可以分发HTTP-FLV、WS-FLV、WebRTC、RTMP、HLS(M3U8)、RTSP等多…...
postman断言脚本(2)
https://learning.postman.com/docs/writing-scripts/script-references/test-examples/#parsing-response-body-data状态码pm.test("Status code is 200",function(){pm.response.to.have.status(200);});pm.test("Status code is 200",()>{pm.expect(…...
js中?.、??的具体用法
1、?. (可选链运算符) 在javascript中如果一个值为null、undefined,直接访问下面的属性, 会报 Uncaught TypeError: Cannot read properties of undefined 异常错误。 而在真实的项目中是会出现这种情况,有这个值就…...
刷题笔记1 | 704. 二分查找,27. 移除元素
704. 二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 输入: nums [-1,0,3,5,9,12], target 9 输出: 4 …...
柔性电路板的优点、分类和发展方向
柔性电路板是pcb电路板的一种,又称为软板、柔性印刷电路板,主要是由柔性基材制作而成的一种具有高可靠性、高可挠性的印刷电路板,具有厚度薄、可弯曲、配线密度高、重量轻、灵活度高等特点,主要用在手机、电脑、数码相机、家用电器…...
OpenCV入门(二)快速学会OpenCV1图像基本操作
OpenCV入门(一)快速学会OpenCV1图像基本操作 不讲大道理,直接上干货。操作起来。 众所周知,OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大。今天就从读取图片,显示图片,输出图片信息和简单的…...
Redis源码---有序集合为何能同时支持点查询和范围查询
目录 前言 Sorted Set 基本结构 跳表的设计与实现 跳表数据结构 跳表结点查询 跳表结点层数设置 哈希表和跳表的组合使用 前言 有序集合(Sorted Set)是 Redis 中一种重要的数据类型,它本身是集合类型,同时也可以支持集合中…...
从计费出账加速的设计谈周期性业务的优化思考
1号恐惧症 你有没有这样的做IT的朋友?年纪轻轻,就头发花白或者秃顶,然后每个月周期性的精神不振,一到月底,就有明显的焦虑。如果有,他可能就是运营商行业做计费运营的,请对他好点,特…...
垃圾回收的概念与算法(第四章)
《实战Java虚拟机:JVM故障诊断与性能优化 (第2版)》 第4章 垃圾回收的概念与算法 目标: 了解什么是垃圾回收学习几种常用的垃圾回收算法掌握可触及性的概念理解 Stop-The-World(STW) 4.1. 认识垃圾回收 - 内存管理清洁工 垃圾…...
让您的客户了解您的制造过程“VR云看厂实时数字化展示”
一、工厂云考察,成为市场热点虚拟现实(VR)全景技术问世已久,但由于应用范围较为狭窄,一直未得到广泛应用。国外客户无法亲自到访,从而导致考察难、产品取样难等问题,特别是对于大型制造企业来说…...
网站开发企业/网店运营与推广
在使用maven插件执行spring-boot:run进行启动的时候,如果设置的断点进不去,要进行以下的设置。 1、添加jvm参数配置 在spring-boot的maven插件加上jvmArguments配置。 <project>...<build>...<plugins>...<plugin><groupI…...
漳州做网站建设/搜索引擎关键词排名优化
DB2查看VIEW定义的SQL文。 select VD.text as V_DLL from syscat.VIEWS as VD where VD.VIEWSCHEMA DB2ADMIN and VD.VIEWNAME V_DEPT; 字段V_DLL就是VIEW的DLL了。...
wordpress 设置页面内容具有缓存性/潍坊seo计费
040-云E办_ 个人中心一、个人中心二、个人中心操作controller 修改信息和密码service 更改密码:三、Bug解决CustomAuthorityDeserializerpojo/admin一、个人中心 在普通项目中需要获取当前登录用户的信息,一般做法是在登录成功后,将当前用户…...
哈尔滨网站建设那家好/淘宝推广公司
根据浏览器的保护规则,跨域的时候我们创建的sessionId是不会被浏览器保存下来的,这样,当我们在进行跨域访问的时候,我们的sessionId就不会被保存下来,也就是说,每一次的请求,服务器就会以为是一…...
淘宝的网站怎么做的好处/公司建立网站的步骤
一个端口就是一个潜在的通信通道,也就是一个***通道。对目标计算机进行端口 扫描,能得到许多有用的信息。进行扫描的方法很多,可以是手工进行扫描,也可 以用端口扫描软件进行。 在手工进行扫描时,需要熟悉各种命令。对…...
网站官网认证怎么做的/竞价托管哪家便宜
Google发布了稳定版本的Android Studio 3.0和开发人员预览版本的Android Oreo 8.1。\\Google在其I/O 2017会议上,首次宣布Android Studio 3.0,但当时是金丝雀发布,现在是正式发布(generally available)版本。从它的新特…...