PCIe专题学习——3.2(数据链路层Ack/Nak机制解析)

2023-11-20

之前我们讲了对PCIe的一些基础概念作了一个宏观的介绍,了解了PCIe是一种封装分层协议(packet-based layered protocol),主要包括事务层(Transaction layer), 数据链路层(Data link layer)和物理层(Physical layer)。

一:Ack/Nak机制

在上一篇文章“DLLP结构与类型”中,我们有说到,数据链路层会产生多个DLLP,其中有两个DLLP分别是Ack DLLP和Nak DLLP,这两个DLLP均是由接收端传至发送端,也可以理解为一种反馈机制。

Ack DLLP: 表示接收端收到了来自发送端的正确的TLP报文;

Nak DLLP: 表示接收端有来自发送端的TLP报文没有被正确接收,需要发送端重新发送;

我们通过下面这张图,先来大致了解一下Ack/Nak的工作机制:

  1. 发送端数据链路层传送一个TLP(Sequence+TLP+LCRC),通过Link,到达接收端。

  2. 接收端接收到来自发送端数据链路层的TLP报文之后,先检验LCRC,在检验Sequence ID。

  3. 当Sequence ID和LCRC检验均正确时,接收端返回Ack DLLP告知发送端:"您发送的TLP,我方已正确接收,请知悉!"。

  4. 当Sequence ID或者LCRC检验中,发现哪怕一个错误,接收端都会返回Nak DLLP告知发送端:"对不起,您发送的TLP没有被正确接收,请您再发送一下"。

现在大概知道Ack/Nak的工作机制了吧?继续王往下看,再来一张图:

 

是不是有点晕,小编第一次看到的时候也晕~

上面这幅图是数据链路层Ack/Nak机制详细的结构图,理解了上面这副图就基本掌握了Ack/Nak机制;

不要被上面这幅图吓到,我们下面就一步一步地分析:

1:从发送端事务层传送的TLP到达数据链路层

如下图红丝圈内所示,不过这里需要注意的是:当Retry buffer是满的或者正在执行重新发送TLP的状态,数据链路层将会锁定TLP传送,不再接收。

2:为TLP分配Sequence ID

当TLP到达数据链路层之后,第一件事就是被分配Sequence ID,也可以理解为给TLP一个身份编号,以便于后续的检验工作;

这里还要提一个参数:NEXT_TRANSMIT_SEQ, 简称NTS,是一个12位的Sequence ID计数器,初始值为0,最大取值为4095。一个TLP被分配Sequence ID之后,NTS会加1,然后把累加后的数值再赋值给下一个TLP。

3:为TLP增加LCRC

TLP分配Sequence ID后,下一步就是生成LCRC

 

LCRC为32bit,基于事务层传送的TLP和数据链路层分配的Sequence ID生成;

 

4:将TLP在Retry Buffer备份

TLP在加上前缀Sequence ID和后缀LCRC之后,会在Retry buffer里面完整备份

  • 单个TLP最大占用的Retry Buffer大小为:4122 Bytes ( 2 bytes Sequence ID + 16 bytes Header + 4096 bytes Data + 4 bytes ECRC +  4 bytes LCRC ).

  • PCIe Spec中并没有规定Retry Buffer大小,不同的设计采用的大小不同,但是必须保证在TLP传输的过程中不能遇到瓶颈.

 

 5:接收端对接收的TLP进行LCRC检查

接收端接收到发送端传来的TLP后会先根据Sequence ID,Header,Data,ECRC计算LCRC然后再跟传进来的LCRC对比,检查是否一致;

 

6:LCRC检查fail

当LCRC检查fail时,会舍弃刚才传进来的TLP,并将NAK_SCHEDULED标志位置起来,给发送端回报NAK DLLP,此外将期望接收到。

 

7:LCRC检查OK,检查Sequence ID

当TLP的LCRC检查OK之后,接收端继续检查Sequence ID,这里出现了新的参数:NEXT_RSV_SEQ,简称NRS,用于追踪下一个期望获得的TLP的Sequence ID,NRS有12位,取值范围为0~4095;

 

检查Sequence ID时分为三个情况:

  • Sequence ID=NRS, 代表是TLP接收正确;

  • Sequence ID<NRS, 代表是TLP是重复的;

  • Sequence ID>NRS, 代表是TLP有发生丢失的情况;

(1)当Sequence ID = NRS时

这个情况下,正确接收TLP,并将TLP传送至上层事务层,同时NRS要加1,准备接收下一个TLP,另外还要给发送端回报Ack DLLP告知发送端已正确接收TLP;

 

 (2)当Sequence ID < NRS时

这个情况下,代表接收端收到了重复的TLP,当下收到的这个TLP会被舍弃,此时NRS保持原有数值,并给发送端报上一个有效TLP的Ack DLLP;

(3)当Sequence ID > NRS时

这个情况下,代表当下Sequence ID之前的TLP丢失,当下收到的这个TLP会被舍弃,此时NRS保持原有数值,NAK_SCHEDULED标志位被置起,并给发送端回报上一个有效TLP的Ack DLLP;

 

8:Ack/Nak Latency Timer

接收端还有一个重要的参数:Ack/Nak Latency Timer,延迟时间不是固定的,与Link Width,Max payload有关。

Latency timer超时,Ack/Nak生成器会给发送端发送Ack DLLP。发送Ack DLLP之后,Latency Timer会重置。 

9:发送端检查接收端返回的DLLPs

当发送端收到接收端返回的Ack/Nak DLLPs之后,会先检查其CRC,如下图中红色圈内所示:

 

发送端会根据Ack/Nak DLLPs的byte0-3计算CRC,并与传进来的CRC做比对,验证是否一致;

 

(1)CRC检查fail

只要CRC检查fail,当下的Ack/Nak DLLPs就会被舍弃;

 

(2)CRC检查OK之后,继续后续步骤

10,发送端检查AS参数

这里有一个新的参数:Acknowledged Sequence Numbers,简化标记为AckD_SEQ,缩写为AS,AckD_SEQ是一个12位的计数器,用于记载最近收到的Ack/Nak DLLP中的Sequence ID;

当发送端收到的Ack/Nak DLLP中的Sequence ID大于AS时,代表TLPs传输正在进行中。

11:接收到Nak DLLP,TLP retry

 

当发送端接收到一个Nak DLLP时,代表前面传送的TLP有问题,需要重新发送,此时会有两种情况:

(1)如果Nak DLLP的Sequence ID=AS:

这个情况下,说明没有新的TLP传输,此时需要将Retry buffer中所有的TLPs重新发送,并且更新Relay_NUM+1;

(2)如果Nak DLLP的Sequence ID > AS:

这个情况下,说明有新的TLP传输,此时需要Retry buffer中Nak DLLP中Sequence ID之前的TLP全部清空,并将当下的TLP重新发送,与此同时,将Replay_TIMER以及Replay_NUM重置,并且Replay_NUM重置后加1;

12:NTS-AS >=2048?

发送端在接收到Ack/Nak DLLPs最后一步要检验NTS-AS差值,NTS-AS差值最小为2048;

  • 如果NTS-AS>=2048不成立,则说明数据链路层有协议错误。

  • 如果NTS-AS>=2048成立,则数据链路层继续传输TLPs

看完上面的理论之后是不是还有点晕晕的,我们再来看两个例子加深一下理解:

例1:TLPs丢失 

(1)下图中,Device A要给DeviceB传输5个TLPs,Sequence ID分别是4094,4095,0,1,2;

(2)TLP 4094第一个被成功接收,返回Ack DLLP给Device A,同时Next_RCV_SEQ加1(也就是=4095)

(3)TLP 4095第二个被成功接收,返回Ack DLLP给Device A,同时Next_RCV_SEQ加1(也就是=0,因为4095+1超过了Next_RCV_SEQ的最大取值4095,从0开始计)

(4)TLP 4094第三个被成功接收,返回Ack DLLP给Device A,同时Next_RCV_SEQ加1(也就是=1)

(5)在TLP 0被成功接收之后,Ack/Nak_LATENCY_TIMER超时,重新发送Sequnce ID=0对应的Ack DLLP;

(6)TLP1在传输的过程中由于某些原因(比如物理层的Error)丢失,TLP2继续传输,但是在Device B端在等待TLP1,比较Sequnce ID(=2)与NRS(=1)发现,Sequence ID > NRS,Device B端才知道有TLP丢失,此时将TLP2丢失,并回报NRS-1(1-1=0)对应的Nak,也就是Nak 0;

(7)Device A端接收到Sequence ID=0对应的Ack DLLP之后,重新发送TLP1和TLP2,并且将Sequence ID=0之前的TLPs(4094,4095,0)全部从Retry buffer里面清除。

 

 例2:Nak DLLP错误

(1)下图中,Device A要给Device B传输5个TLPs,Sequence ID分别是4094,4095,0,1,2.

(2)TLP 4094,4095,0被依次成功接收,此时Next_RCV_SEQ= 1

(3)在TLP 1 到达Device B端,检查32-bit LCRC fail,此时,返回NRS-1对应的Nak DLLP,也就是Nak 0;

(4)Nak 0 到达Device A端,检查16-bit CRC fail,Nak 0 则被丢弃;

(5)Nak 0 被丢弃后,Device B不会再发送任何Ack或者Nak,由于长时间没有收到Device B的反馈(Ack/Nak),Replay_TIMER超时,Device A 将Retry buffer中所有的TLPs重新发送。

(6)TLP 4094,4095,0重新发送后在Device B端会被识别到时重复的TLPs,然后被丢弃,TLP1,2继续正确传输。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PCIe专题学习——3.2(数据链路层Ack/Nak机制解析) 的相关文章

随机推荐

  • ECG信号三大主要噪声-基线漂移,工频干扰,肌电干扰

    1 基线漂移 基线漂移属于 低频干扰 呼吸的节奏 四肢动作以及前端处理电路设计 都有可能造成基线漂移 致使原始ECG信号漂移之后的 幅度达到R波最大幅值的0 1 0 2倍 ECG信号的一般采用是 粘贴式或吸球式 电极来采集信号 那么存在于体
  • 请关闭该文件夹或文件,然后重试 怎么处理?

    一 打开任务管理器 性能 gt 打开资源监视器 选择CPU gt 搜索句柄中填入文件夹名称 右击结束进程 就能进行操作了
  • 【Linux入门教程】2 文件权限和访问模式、环境变量、管道和过滤器

    Linux文件权限和访问模式 为了更加安全的存储文件 Linux为不同的文件赋予了不同的权限 每个文件都拥有下面三种权限 所有者权限 文件所有者能够进行的操作 组权限 文件所属用户组能够进行的操作 外部权限 其他权限 其他用户可以进行的操作
  • QT编程之信号和槽机制知识

    qt知识总结 一 常见的父窗口有3类 1 QWidget 它是所有对象的基类 继承自QOject和OPaintDevice 2 QMainWindow 它提供了一个主要的应用窗口 可以用来构建APP的应用界面 3 QDialog 对话框 其
  • TensorFlow.js预测鸢尾花种类

    源码连接 TensorFlow js实现鸢尾花种类预测 机器学习文档类资源 CSDN下载 一 加载IRIS数据集 创建index html入口文件 跳转到script主文件 在script js文件夹中利用预先准备好的脚本生成鸢尾花数据集
  • 无公网IP通过旁路由openwrt的Zerotier实现和在家一样访问家里每个设备

    现在的IP地址精贵 很多人拉的线路都没有公网IP了 早期时候有公网IP可以干很多事情 例如架个Web FTP 游戏等各种服务 再通过动态域名 在公司或者朋友可以直接访问 只要映射端口就可以了 如果没有公网IP 其实还有其他办法 例如frp反
  • BGP双平面实验

    实验要求 1 合理IP地址 2 AS 1 2 3 内部使用OSPF 协议 AS 1 AS 2内部建立全互联的IBGP邻居 AS之间建立全部的EBGP邻居 3 PC 1 3 5 属于电信的路由 通信时必须使用电信AS 1 PC 2 4 6 属
  • Linux安装Oracle Database 19c RAC

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net networken article details 120788623 Linux安装
  • 14. Bayesian Networks With Examples in R的学习笔记(贝叶斯网络 bic打分相关)

    bnlearn官网推荐书目 Bayesian Networks With Examples in R 下载了英文版pdf学习了一下 书还是比较浅显易懂的 没有读多少 暂时把自己看的部分整理 翻译到这里留存 欢迎大家交流 pdf下载地址 ht
  • sql drop和delete区别

    drop与delete的区别 初学sql语言 难免被drop和delete用法弄混 二者都有删除的意思 那它们又有什么区别呢 drop主要用于删除结构 例如删除数据库 drop database XX 删除表 drop table XX 字
  • SyntaxError: Unexpected end of JSON input解决方法和思路

    最近在写一个前后台交互的需求 前台点击编辑按钮 直接报错 SyntaxError Unexpected end of JSON input 网上查了下基本都是 一般 双引号 单引号 未成对输入时导致报错 但是我这边没法解决 重新检查了Jav
  • 零基础玩转树莓派(三)—通过SSH远程连接树莓派

    在树莓派使用过程中 我们会经常进行一些调试工作 不方便一直将树莓派与显示屏等相连 需要通过SSH来远程连接访问控制树莓派 一 Windows电脑客户端 使用SSH远程服务 需要先在控制电脑上安装一个客户端PUTTY 1 客户端下载 网页搜索
  • Ubuntu 20.04 如何设置永不息屏

    右键进入settings 找到power 将Blank Screen 设置为Never
  • js时间戳转日期

    方式一 方式一 var date new Date parseInt timeStart 1000 toLocaleString replace d 1 2 最后得到的是2019 8 4 上午9 29 格式的数据 方式二 function
  • Windows10 关于系统中断CPU占用过高导致电脑变卡的解决办法

    Windows10 关于系统中断CPU占用过高导致电脑变卡的解决办法 最近一段时间笔记本一直很卡 不管打开几个程序 任务管理器中总会有CPU占用80 以上 这一度让我抓狂 开始网上搜教程 然后开始了我的各种硬件禁用的道路 这个试了好久 为了
  • 洛谷P1010 [NOIP1998 普及组] 幂次方

    文章目录 前言 题目描述 输入格式 输出格式 样例 1 样例输入 1 样例输出 1 数据范围 代码 解析 结尾 前言 在做完洛谷P1010 NOIP1998 普及组 幂次方这道题之后 我对于现在的学习有了些许认识 题目描述 任何一个正整数都
  • 如何处理低概率出现的bug???

    原文链接 一般的低概率bug 不足以导致系统崩溃的bug 方案1 仔细检查是否是自己的执行步骤 或者误操作导致的bug 提交给相关人员 方案2 通过日志相关信息处理 提交相关开发人员 方案3 通过截图方式尽量复现当时的情景 方案4 和相关测
  • Java 中使用 protobuf

    主要参考 Java 中使用 protobuf 入门基础篇 看这篇就够了 https blog csdn net wxw1997a article details 116755542 Java 中使用 protobuf 复杂深入篇 看这篇就够
  • 成都瀚网科技有限公司:抖音怎么绑定抖音小店才好?

    抖音是一款非常流行的短视频应用 为用户提供了一个展示才华 分享生活的平台 在抖音上 用户可以通过绑定抖音商店来销售自己的产品或服务 从而实现商业变现 那么 抖音如何绑定抖音商店呢 1 抖音如何绑定抖音商店 用户绑定抖音商店需要按照以下步骤操
  • PCIe专题学习——3.2(数据链路层Ack/Nak机制解析)

    之前我们讲了对PCIe的一些基础概念作了一个宏观的介绍 了解了PCIe是一种封装分层协议 packet based layered protocol 主要包括事务层 Transaction layer 数据链路层 Data link lay