通信协议 - ntp时间同步

概述

NTP(Network Time Protocol)网络时间协议基于UDP,用于网络时间同步的协议,使网络中的计算机时钟同步到UTC,再配合各个时区的偏移调整就能实现精准同步对时功能。提供NTP对时的服务器有很多,比如微软的NTP对时服务器,利用NTP服务器提供的对时功能,可以使我们的设备时钟系统能够正确运行。

注意

小编所有文章均是自己亲手编写验证,由于文件太多,小编就不在公众号后台一一回复列举了,若需要小编的工程代码,请关注公众号,后台回复需要的工程文件小编看到后会第一时间回复。

发展

NTP是由美国Delaware大学David L .Mills教授设计的,是最早用于网络中时钟同步的标准之一。NTP是从时间协议和ICMP时间戳报文演变而来,NTP的版本演进如下所示。

894f76db46c6453fbe144279492efcbf.png

报文

NTP有两种不同类型的报文,一种是时钟同步报文,另一种是控制报文。控制报文仅用于需要网络管理的场合,它对于时钟同步功能来说并不是必需的,这里不做介绍。

0b09bf7608303f501a57c14310403ab8.png

关于各字段说明如下:

d64cb5d3586461ce49e08672bd41227f.png

原理

NTP最典型的授时方式是Client/Server方式。

客户机首先向服务器发送一个NTP 包,其中包含了该包离开客户机的时间戳T0,当服务器接收到该包时,依次填入包到达的时间戳T1、包离开的时间戳T2,然后立即把包返回给客户机。客户机在接收到响应包时,记录包返回的时间戳T3。

ba8f5348e68f915260ff6a4e04f917cd.png

假设Server相对于Client时间偏移位offset,数据在网络中传输时间为delay(这里假设网络上的传输延迟相等,即T0传输到T1=T2传输到T3的时间),则:

1ceedd94f0e42ce7fe299314e9b50adb.png

得到

offset = ((T1-T0)+(T2-T3))/2    

delay = ((T1-T0)+(T3-T2))/2

精度分析

对往返路由延时对称的假设

由于以上公司是在假设NTP请求和回复包在网上传送延时相等,即均为delay的情况下得出的,因而NTP授时精度与NTP服务器与用户间的网络状况有关,主要取决于NTP包往返路由的延时对称程度。

由于往返路由的延时不对称值最大不超过网络延时,从而delay1、delay2的取值范围在(0…delay1+delay2)间,根据式(1),t也可表示为:t=(T1-T0)+delay1=(T1-T0)+(delay1+delay2)/2, 可以得出最大授时误差是±(delay1+delay2)/2。一般广域网的网络延时在10 ms~500ms之间;局域网的网络延时在计时操作系统内核处理延迟的情况下通常小1ms。

为何实际的往返路由时延是不同?这主要是因为那些排队。路由器中有队列,交换机中有队列,甚至终端设备的网络堆栈中也有队列。尽管消息通常在队列中花费最少的时间,但有时它们在等待交换机结束与同一端口上的其他消息的通信,或者等待操作系统完成正在执行的操作,以便获取时间戳。在某些情况下,等待造成的延迟可能非常长,如几十微秒,甚至毫秒。很明显,如果这些都发生在一个方向上的传输,而非另一方向上,将造成很大的延时不对称。

对客户端与服务器间的时钟偏差offset不变的假设

以NTP服务器时钟为标准时间,在某一时刻设置NTP客户机时间为NTP服务器当前时间T0,经过一段时间后,NTP服务器时间为T0+tsn,NTP客户端时间为T0+tcn。

因为存在时钟频率偏差,tsn与tcn并不相等。NTP客户端时间tcn需乘以时钟频率偏差系数k才等于tsn,即tsn=k×tcn,所以k=tsn/tcn。

任何晶振实际工作频率都是不稳定的,只是程度不同,晶振实际频率是受外界多种因素(温度、电压、老化等)影响而改变的。因此,时钟频率偏差系数k并非恒定不变的。每隔一定时间,NTP客户机要对时钟频率偏差系数k进行校正,才能保证计时精度。

往期 · 推荐

实时系统vxWorks - 任务(重要)

实时系统vxWorks - 加载应用程序的方法

实时系统vxWorks - 在线调试

实时系统vxWorks - 虚拟机环境搭建

实时系统vxWorks - zynq7020移植vxWorks

 关注

更多精彩内容,请关注微信公众号:不只会拍照的程序猿,本人致力分享linux、设计模式、C语言、嵌入式、编程相关知识,也会抽空分享些摄影相关内容,同样也分享大量摄影、编程相关视频和源码,另外你若想要获得更多内容教程请关注公众号:不只会拍照的程序猿。

<think>好的,我现在需要处理用户关于BUUCTF-USB题目的询问。首先,我得回忆一下这个题目的具体内容。BUUCTF是一个CTF(Capture The Flag)竞赛平台,里面的题目通常涉及各种安全领域的挑战,比如逆向工程、密码学、取证等。USB相关的题目可能涉及到USB流量分析,这在CTF中是比较常见的取证类题型。 首先,用户可能想知道如何解决这个题目,或者需要了解解题的一般步骤。通常,USB流量分析的题目会提供一个抓包文件,比如pcap或者pcapng格式,其中包含USB传输的数据。解题的关键在于提取这些数据,并分析其中可能的键盘输入、鼠标移动或存储设备的数据传输。 接下来,我需要考虑解题的具体步骤。首先,用户可能需要使用Wireshark之类的工具打开提供的流量文件,然后过滤出USB传输的数据包。对于键盘数据,通常关注的是URB_INTERRUPT in类型的传输,因为键盘输入是通过中断传输实现的。数据部分可能包含按键的键码,需要将这些键码转换为实际的字符。 这里需要注意,USB键码到字符的转换可能需要对照USB HID使用表。例如,键码0x04对应a,0x05对应b,依此类推,但可能会有移位或修饰键的影响。此外,有些题目可能会将数据隐藏在鼠标移动的坐标中,或者存储设备的批量传输中,所以需要根据具体情况调整分析方法。 另外,可能需要使用脚本来自动化提取和处理数据。例如,用Python的scapy库读取pcap文件,过滤出有效的数据段,然后进行转换。用户可能需要编写这样的脚本,或者在互联网上查找现有的工具或脚本进行辅助。 可能遇到的挑战包括数据包的过滤是否正确,键码转换是否有误,或者数据是否经过加密或编码。这时候需要仔细检查每一步的输出,确认是否遗漏了某些关键数据包,或者是否需要调整转换逻辑。 此外,BUUCTF的题目可能有不同的变种,所以需要根据具体的题目文件进行调整。比如,有些题目可能使用不同的传输类型,或者数据被分成多个包,需要重新组合。这时候需要仔细分析数据包的结构,查看是否有长度字段或标识符来帮助重组数据。 最后,总结解题思路:分析流量文件,确定数据传输类型,提取有效数据,转换数据格式,最终得到flag。可能需要结合工具和脚本,逐步排除干扰信息,找到关键数据段。</think>BUUCTF中的USB类题目通常涉及USB流量分析,属于取证题型。以下是解题的逐步指南: --- ### **1. 题目背景** - 题目提供一个包含USB设备通信数据的抓包文件(如`.pcap`)。 - 目标:从流量中提取隐藏的Flag,常见于键盘输入、鼠标轨迹或存储设备传输。 --- ### **2. 解题步骤** #### **步骤1:分析流量类型** - 使用 **Wireshark** 打开文件,过滤USB流量: - 键盘输入:`usb.transfer_type == 0x01`(中断传输)且`usb.endpoint_number == 0x81`。 - 鼠标移动:`usb.endpoint_number == 0x81`,数据长度可能为4字节。 - 存储设备:`usb.transfer_type == 0x02`(批量传输)。 #### **步骤2:提取数据** - **键盘输入**:提取`Leftover Capture Data`字段(例如:`2d0000000000`)。 - 键码转换规则: - 第3字节为实际键码(如`0x04`→a,`0x05`→b,参考[HID键码表](https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf))。 - 若存在`0x02`修饰键(Shift),字符需转换大写或符号。 - **鼠标数据**:提取坐标(如`x=bytes[1], y=bytes[2]`),可能用于绘制轨迹。 #### **步骤3:编写脚本自动化处理** - 使用Python示例提取键盘数据: ```python from scapy.all import * packets = rdpcap('usb.pcap') keystrokes = [] for pkt in packets: if pkt.haslayer('USBTransferData'): data = pkt['USBTransferData'].leftover if len(data) >= 8: # 键盘数据通常为8字节 key = data[2:3].hex() if key != '00': keystrokes.append(key) # 转换键码为字符(需对照HID表) ``` #### **步骤4:处理特殊编码** - 若数据经过加密或编码(如Base64、Hex),需进一步解码。 - 示例:提取的字符串`666c61677b...7d`→Hex解码→`flag{...}`。 --- ### **3. 常见技巧** - **数据重组**:若数据分片,需按`URB ID`或包顺序合并。 - **流量筛选**:排除无效数据(如`000000000000`)。 - **工具辅助**:使用`tshark`命令行快速提取字段: ```bash tshark -r usb.pcap -T fields -e usb.capdata | grep -v "000000000000" ``` --- ### **4. 例题参考** - **BUUCTF-USB** 示例解法: 1. 过滤键盘中断流量,提取键码。 2. 发现键码序列:`0x16 0x07 0x08...`。 3. 对照HID表转换,得到`f l a g { ... }`。 --- ### **5. 总结** - 关键点:确定设备类型→过滤有效数据→转换键码/坐标→解码隐藏信息。 - 扩展学习:了解USB协议细节及更多HID设备的数据格式(如游戏手柄)。 遇到具体题目时,需结合流量特征灵活调整分析策略!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不只会拍照的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值