【PCIE体系结构八】数据链路层是如何保证TLP的正确传输的?

news2024/9/28 19:21:46

👉个人主页:highman110

👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容 

参考书籍:《深入浅出SSD:固态存储核心技术、原理与实战》 

目录

前言

ACK/NAK协议基本原理

ACK/NAK DLLP报文组成

ACK/NAK的具体操作


前言

        上篇文章我们提到了数据链路层DLLP有ACK/NAK类、电源管理类、流控类几种,今天讲一下ACK/NAK类DLLP。数据链路层就是依靠ACK/NAK DLLP和重传机制来确保TLP的正确传输。

ACK/NAK协议基本原理

        数据链路层通过ACK/NAK协议来保证每个TLP的正确传输,其基本原理为:TLP发送端的数据链路层为每个TLP加上序列号和LCRC,在该TLP被接收端正确收到之前,它会一直保持在一个叫Replay Buffer的接口里面。TLP接收端的数据链路层接收到该TLP后,做CRC校验和序列号检查,如果没有问题,TLP接收端(可能,为了保证传输效率,通常不会每收到一个TLP就回一个ACK,而是会设置一个阈值,超过了阈值才会回ACK)会生成和发送ACK DLLP,TLP发送方接收到ACK后,知道TLP被正确接收,因此它会把相关的TLP从Replay Buffer中清除;如果TLP接收方检测到TLP有错误,则会生成和发送NAK DLLP,TLP发送方接收到NAK后,知道有TLP传输出错,会重新发送Replay Buffer相关的TLP给对方。TLP传输出错往往是瞬态的,重传基本能保证TLP传输正确。TLP接收方只有收到正确的TLP才会去掉序列号和LCRC,并把TLP交给它的事务层。

ACK/NAK DLLP报文组成

        此类型的DLLP包含如下几个字段:

        1、ACK/NAK类型,用来区分两种DLLP;

        2、ACK/NAK序列号,用来告诉发送端哪个序列号被成功接收或接收错误;

        3、CRC,生成本DLLP的校验码,用于接收端的DLLP校验。

ACK/NAK的具体操作

        前面提到,发送端在收到ACK之前,会把之前已发送的DLLP内容保存在Replay Buffer中,就是为了防止万一某个包接收出错还可以重传。

        假设当前发送端Replay Buffer中有序列号分别为10、11、12、13的4个TLP,即这些TLP发送出去了,但还没有得到响应。假设接收端上一个成功接收到的TLP序列号为11,期望下个接收到的TLP序列号为12。这时,接收端接收到一个TLP,首先,它会对该TLP做LCRC校验:

        (1)校验失败

        TLP接收端会发送一个NAK,其中AckNak_SEQ_NUM设为11。TLP发送端接收到该NAK后,知道11和它之前的TLP(这里是TLP 10)被成功接收,因此TLP 10和TLP 11会从Replay Buffer清掉(不需要重发)。同时,它知道12和后面的TLP(这里是TLP 13)没有被成功接收,因此它们会重发。

        (2)校验成功

        CRC没有问题,接下来就检查TLP的序列号了。这里有三种情况:

        a、TLP接收端发现收到的TLP序列号为12,与预期相符。

        TLP接收端可能需要发一个ACK,也可能不需要发ACK。为什么这么说?为减少数据链路层DLLP的传输,可能设置正确接收到若干个TLP后,才会返回一个ACK,并非每成功接收一个TLP,就返回一个ACK。假设这个时候需要返回ACK,则设AckNak_SEQ_NUM为12。TLP发送端接收到该ACK,知道TLP 12和它之前所有的TLP都被成功接收,因此TLP 10、TLP 11和TLP 12会从Replay Buffer清掉。

        b、TLP接收端发现收到的TLP序列号为13,与预期不符(预期为TLP 12)。

        TLP接收端希望接收到的TLP为12,这个时候收到的却是13,说明TLP 12在半路丢了,发生丢包。这个时候,接收端会发一个NAK,其中AckNak_SEQ_NUM设为11(即上一个成功被接收的TLP序列号)。TLP发送端接收到该DLLP后,知道TLP 11和它之前所有的TLP都被成功接收,因此TLP 10和TLP 11会从Replay Buffer清掉,并重发TLP 12和它后面的TLP(这里是TLP 13)。

        c、TLP接收端发现收到的TLP序列号为10,与预期不符(预期为TLP 12)。

        TLP上次正确接收到的是TLP 11,这次又收到一个序列号比它小的TLP,为什么会这样?原因是在TLP发送端,一个TLP在一定时间内没有收到ACK,它会自动重发所有Hold在Replay Buffer中的TLP。由于发送端的这个超时重发机制,导致一个TLP会被接收端接收到两次或者更多次(如果接收端一直不能及时响应)。TLP接收端如果收到重复的TLP包,它会默默扔掉这些重复的TLP,并发送ACK,其中的AckNak_SEQ_NUM设为11。TLP发送端接收到该DLLP后,知道TLP 11和它之前所有的TLP都被成功接收,因此TLP 10和TLP 11会从Replay Buffer清掉。

        如下是数据链路层内部框图,从中我们可以看到ACK/NAK是怎样实现的:

         

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/503621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kafka3.x详解

kafka 一、简介1.1、场景选择,与其他mq相比1.2、应用场景1.2.1、流量消峰1.2.2、解耦1.2.3、异步通讯 1.3、消息队列的两种模式1.3.1、点对点模式1.3.2、发布/订阅模式 1.4、Kafka 基础架构 二、安装部署2.1、安装包方式2.2、docker安装方式2.3、docker安装kafka-ma…

RuoYi-Cloud-Plus 登录过程源码

登录界面 ruoyi-ui/src/views/login.vue 点击登录按钮进入handleLogin方法 handleLogin() {//验证数据是否合法this.$refs.loginForm.validate(valid > {if (valid) {this.loading true;//如果记住密码被勾选if (this.loginForm.rememberMe) {//直接在cookie中存入相关信…

面试也要说人话

整理了一些读者的问题。 什么是《面试1v1》? 《面试1v1》是一个以对话形式讲解知识点的文章合集,是由 JavaPub 编写的真人1对1面试对话教程,通过真实案例编写,生动、有趣、干货满满。 为什么要写《面试1v1》这个专题&#xff1…

排序篇:归并排序的递归,非递归以及计数排序的实现(C语言)

目录 一:归并排序 (1)归并排序的基本思想 (2)递归版本 ①实现思路 ②合并 ③递归实现有序 ④最终代码 (3)非递归版本 ①实现思路 ②控制分组 ③最终代码 (4)时间,空间复杂度分析 (5)小结 二:计数排序 (1)计数排序的基本思想 …

asp.net+sqlserver体育器材租赁借还系统

本器材借还系统分为管理员和用户两部分,具体功能如下 管理员部分功能 1.管理员管理,管理系统内所有的管理员信息 2.器材信息管理,对器材的基本信息进行管理,方便用户的租借 3.申请审核管理,当用户申请了器材的使用只&a…

跨境卖家必看系列:沃尔玛美国站入驻教程

沃尔玛自从2020年开始重点发展线上商店以来,销售额一直都很可观。前段时间,沃尔玛美国电商还开了个全球招商战略发布会。所以今天龙哥就根据会议官方发布的步骤,给大家总结一下想要入驻沃尔玛美国站的话需要怎么操作。 沃尔玛的入驻渠道 1.…

35-40的技术人员为什么会被“不友好”,请你们自身反思-拒做职场的“嗯嗯”怪

35-40真的是IT人员的一道坎吗? IT技术做不到35-40,可是我身边有大量35-40事业发达、职业发展更好的朋友。同时,我身边也有大量35-40被“毕业”的人更多。 本人经过7年来先后带队过3个大型研发团队,最少的也有60-70号人。最多的达到…

谈谈MySQL的InnoDB存储引擎

大家好,我是易安! 今天我们谈一谈MySQL中InnoDB存储引擎。InnoDB存储引擎作为我们最常用到的存储引擎之一,充分熟悉它的的实现和运行原理,有助于我们更好地创建和维护数据库表。 InnoDB体系架构 InnoDB主要包括了内存池、后台线程…

【深入浅出 Yarn 架构与实现】6-3 NodeManager 分布式缓存

不要跳过这部分知识,对了解 NodeManager 本地目录结构,和熟悉 Container 启动流程有帮助。 一、分布式缓存介绍 主要作用就是将用户应用程序执行时,所需的外部文件资源下载缓存到各个节点。 YARN 分布式缓存工作流程如下: 客户端将应用程序…

电脑——如何配置一台电脑

一、需要买那些东西 主板:显卡、电源、CPU、内存条、硬盘、显示器、鼠标、键盘、音响 怎么开始? 知乎黑虾 首先确定CPU型号再选择与该CPU兼容的主板(不同的CPU对应的主板插槽类型是不同的) 如何选择CPU型号: 主要…

HttpClient入门介绍

介绍 介绍 HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。 作用: 发送HTTP请求 接收响应数据 应用场景: …

Unreal Engine11:触发器和计时器的使用

写在前面 主要是介绍一下触发器和计时器的使用; 一、在Actor中使用触发器 1. 新建一个C类 创建的C类也是放在Source文件夹中的Public和Private文件夹中;选择Actor作为继承的父类;头文件包括一个触发器和两个静态网格,它们共同…

基于SpringBoot,vue的家政服务平台的设计与实现

背景 以往的家政服务管理平台的管理,一般都是纸质文件来管理家政服务信息,传统的管理方式已经无法满足现代人们的需求;使用家政服务管理平台, 首先可以大幅提高家政服务信息检索,只需输入家政服务相关信息就能在数秒内反馈想要的…

真题详解(哈希冲突)-软件设计(七十)

真题详解(3FN)-软件设计(六十九)https://blog.csdn.net/ke1ying/article/details/130548812 在以阶段划分的编译器,____阶段的主要作用是分析构成程序的字符及由字符构造规则构成的符号是否复合程序语言的规定。 词法分析 B.语法分析 C.语义分析 D.代码…

Linux 文件系统原理 / 虚拟文件系统VFS

Linux 文件系统原理 / 虚拟文件系统VFS 虚拟文件系统 VFSVFS 定义VFS 的对象演绎超级块 super_block索引节点 inode目录项 dentry文件 file 打开文件流程参考文献 虚拟文件系统 VFS VFS 定义 VFS是一个抽象层,其向上提供了统一的文件访问接口,而向下则…

深度学习笔记之卷积神经网络(二)图像卷积操作与卷积神经网络

深度学习笔记之卷积神经网络——图像卷积操作与卷积神经网络 引言回顾:图像卷积操作补充:卷积核不是卷积函数 卷积神经网络卷积如何实现特征描述/提取卷积神经网络中的卷积核的反向传播过程场景构建与前馈计算卷积层关于卷积核的反向传播过程卷积层关于输…

《花雕学AI》新版必应 Bing 登场:轻松注册,一站式搜索、聊天与绘画应有尽有

引言: 你是否曾经在网上搜索信息时感到困惑或沮丧?你是否曾经想要在网上创造一些有趣或有用的内容,却不知道从何开始?你是否曾经想要用文字描述一个图像,却无法找到合适的图片?如果你的答案是肯定的&#x…

ChatGPT将抢占谁的工作,未来如何应对

“AI人工智能领域里程碑式应用” ChatGPT影响力已经越来越大,激起大家强烈好奇心的同时,也让一些人发出了“感觉自己快要失业了”的焦虑,今天先说一下哪些人的工作会受到 ChatGPT等AI人工智能影响 从工业时代到数字时代这100多年的发展历程来…

【华为机试】——HJ4 字符串分隔

【华为机试】——HJ5 进制转换😎 前言🙌HJ4 字符串分隔方法一:巧用scanf的输入格式方法二:循环分解思想 总结撒花💞 😎博客昵称:博客小梦 😊最喜欢的座右铭:全神贯注的上…

泛型的特点和深浅拷贝的区别以及不相等对象的hashcode值的问题

永远都不为自己选择的道路而后悔,人生如同坐火车,风景再美也会后退,流逝的时间和邂逅的人终会渐行渐远,前行的始终是自己 泛型常用特点 泛型是JavaSE1.5之后的特性,《Java核心技术》中对泛型的定义是: “…