DLLP包详解,Ack/Nak机制解读

1:概述:

        DLLP一般指的是由发送端的数据链路层发送,接收端的数据链路层接收的数据包,其和事务层(Transaction Layer)一般没有什么关系,本文将要介绍的DLLP指的正是这样的数据包,一般用于Ack/Nak机制,功耗管理,Flow Control和一些厂商自定义用途等,示意图如下:

DLLP的格式是固定的,一共有8个字节,包括Framing (SDP & END)。和TLP不一样的地方是DLLP并未携带任何路由信息,原因很简单,因为DLLP只在相邻两个设备的数据链路之间通信,DLLP包始于数据链路层也止于数据链路层,并且DLLP一般也不需要和事务层交换信息;

注:前面文章中介绍的Flow Control,Ack/Nak等都是针对TLP,并不会对DLLP产生影响,但是这些功能正是借助DLLP才得以实现的。

DLLP的一般格式如下所示:

DLLP的类型与目标应用如下表中所示:

其中用于Ack/Nak的DLLP的格式如下:

 当用于Ack/Mak时,在Byte2&3有12个有效bit,用于放置PCIe报文序列号(NEXT_RCV_SEQ)

当收到完好的TLP报文时:

  • 如果接收报文序列号等于NEXT_RCV_SEQ,那填入当前序列号,发送ACK类型报文给对端;
  • 如果接收报文序列号小于NEXT_RCV_SEQ,即收到了重复报文,则填入NEXT_RCV_SEQ-1,即上一个完好的TLP报文序列号,以ACK类型报文发送给对端;

如果收到错误的序列号大于NEXT_RCV_SEQ的TLP报文:

  • 则发送Nak报文给对端,填入NEXT_RCV_SEQ-1,即上一个完好TLP报文序列号

详细的重传过程见 :PCIe专题学习——3.2(数据链路层Ack/Nak机制解析)_pcie lcrc-CSDN博客

2:用于功耗管理(Power Management)的DLLP的格式如下

3:用于Flow Control的DLLP的格式如下

4:厂商自定义的DLLP格式如下

 Ack/Nak机制详解:

 https://zhuanlan.zhihu.com/p/446366874

 

通达信行情API是金融数据提供商通达信(TongDaXin)为开发者金融机构提供的接口服务,用于获取实时及历史的股票、期货、期权等金融市场数据。这个API允许用户在自己的应用程序中集成通达信的数据服务,实现个性化数据分析、交易策略开发等功能。 1. **API基本概念** - **API**:Application Programming Interface,应用程序编程接口,是软件之间交互的一种方式,提供预定义的函数方法,使得其他软件能够调用特定功能。 - **通达信**:国内知名的金融终端软件提供商,提供股票、期货、基金等市场数据,以及交易服务。 2. **通达信API的功能** - **实时行情**:获取股票、期货、期权等市场的实时报价信息,括最新价、涨跌额、涨跌幅、成交量等。 - **历史数据**:获取历史交易日的K线数据、分时数据、交易量等信息,支持自定义时间段查询。 - **深度数据**:获取买卖盘口的五档报价成交量,有助于分析市场买卖意愿。 - **资讯信息**:获取公告、研报、新闻等市场资讯。 - **交易委托**:通过API进行交易下单、撤单等操作,实现自动化交易。 3. **TdxHqApi** - **TdxHqApi** 是通达信行情API的具体实现,它含了调用通达信数据服务的各种函数类,如获取股票列表、获取实时行情、获取历史数据等。 - 开发者需要按照API文档的指示,导入TdxHqApi库,然后通过调用相应的函数来获取所需数据。 4. **使用步骤** - **安装**:下载并安装通达信API的SDK,通常括头文件动态链接库。 - **初始化**:在代码中实例化API对象,进行连接设置,如服务器地址、端口号等。 - **连接**:连接到通达信服务器,进行身份验证。 - **数据请求**:调用对应的API函数,例如`GetS
### PCIe 数据链路层功能与协议实现详解 #### 数据链路层概述 PCIe 的数据链路层位于物理层事务层之间,起到承上启下的作用[^4]。它主要负责确保 TLP(Transaction Layer Packet)在链路上的可靠传输,并通过一系列机制来管理数据流。 --- #### 数据链路层的主要功能 1. **TLP 封装与解封装** 数据链路层接收来自事务层的 TLP 并为其添加序列号以及校验字段(LCRC),形成完整的 DL_Packet 后发送给物理层。同样,在接收到物理层传来的 DL_Packet 后,会验证 LCRC 序列号并将其还原为原始 TLP 提交给事务层[^2]。 2. **ACK/NAK 协议** 数据链路层实现了基于 ACK/NAK 的重传机制,用于保障数据传输的可靠性。当接收方成功接收到无误的数据时,会返回 ACK;如果发现错误,则返回 NAK 请求重新发送该数据。 3. **DLLP (Data Link Layer Packets) 处理** DLLP 是一种特殊类型的短消息帧,主要用于链路管理状态更新等操作而非实际有效载荷传送。常见的 DLLP 类型括 Flow Control Credit Return、Power Management State Change Request 等[^1]。 --- #### 发送端逻辑 ##### 总体流程 发送端将从事务层获取到的 TLP 转化成适合于链路上传输的形式——即加上必要的头部信息如 Sequence Number 及 CRC 校验位之后再交由物理层进行电气信号转换输出。 具体步骤如下: - 对每一个新的 TLP 设置初始序号; - 添加相应的 LCRC 字段完成整个 DL_Packet 构造过程; - 随后依据当前可用资源情况决定是否立即发出或者暂时存储等待后续时机尝试再次提交。 ##### 使用 ACK/NAK 协议 对于每一次成功的发送动作都需要期待对方反馈确认信息(ACK),如果没有按时获得正面回应则认为此次通信失败进而触发自动重试机制直至最终能够得到肯定答复为止。 --- #### 接收端逻辑 ##### 处理流程 接收端的任务是对到达的数据单元执行初步检验工作以判断其合法性及完整性状况: - 检查 LCRC 是否匹配; - 核实 Sequence Number 连续性; - 如果一切正常就向源地址回执一份 ACK 报告表明已妥善接纳此份资料副本同时继续准备迎接下一个预期到来者; - 若存在问题则需及时告知发件人存在异常情形以便采取补救措施比如请求重复递交特定编号范围内的项目列表等等。 --- #### 特殊场景支持 当物理层检测到有效的对端链接时,会通知数据链路层进入 DL Inactive 状态,这意味着此时无法与其他设备建立正常的通讯联系[^3]。这种情况下通常意味着另一侧可能根本没有安装任何硬件组件或者是由于某些原因导致未能激活相应接口电路从而造成双方失去同步关系。 --- ```python class PCIEDataLinkLayer: def __init__(self): self.sequence_number = 0 def send_tlp(self, tlp_data): """ Encapsulate and send a TLP with sequence number and LCRC """ dl_packet = { 'sequence': self.sequence_number, 'data': tlp_data, 'lcrc': calculate_lcrc(tlp_data) } self.sequence_number += 1 return physical_layer_send(dl_packet) def receive_dl_packet(self, packet): """ Process incoming DL Packet by verifying LCRC & Seq Num""" if verify_lcrc(packet['data'], packet['lcrc']) and \ check_sequence_continuity(packet['sequence']): ack_response() else: nak_response() def ack_response(): pass # Implement sending ACK logic here def nak_response(): pass # Implement sending NAK logic here ``` --- #### 结论 综上所述,PCIe 数据链路层仅承担着基础性的数据转发职责,还引入了一系列复杂的控制策略用来增强系统的稳定性鲁棒特性。通过对上述内容的学习可以帮助工程师们更加深刻理解 PCI Express 设计背后的智慧结晶及其背后蕴含的技术魅力。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值