简单地分析几个Ack/Nak机制的例子

这一篇文章来简单地分析几个ack/nak机制的例子。
example 1. example of ack
step1 设备a准备依次向设备b发送5个tlp,其对应的序列号分别为3,4,5,6,7;
step2 设备b成功的接收到了tlp3,并将next_rcv_seq从3加到4,但是设备b没有立即向设备a返回ack(此时acknak_latency_timer尚未溢出);
step3 设备b又成功地接收到了tlp4和tlp5;
step4 假设此时acknak_latency_timer溢出了,则设备b会向设备a返回一个带有序列号为5的ack dllp。同时,设备b将acknak_latency_timer复位,但是并未重新启动,直到设备b成功地接收到了tlp6。
step5 设备a接收到了ack5,将replay_timer和replay_num复位,然后将buffer中的序列号5(和5之前)的tlp备份移除;
step6 一旦设备b接收到tlp6,acknak_latency_timer又会被重新启动。
example 2. ack with sequence number rollover
step1 设备a准备依次向设备b发送序列号为4094,4095,0,1,2的tlp,注意第一个发送的是tlp4094,最后一个发送的是tlp2。也就是说序列号rollover了;
step2 设备b成功接收到tlp4094~tlp1后,假设此时acknak_latency_timer溢出了,则设备b向设备a返回ack1 dllp;
step3 设备a接收到ack1,并将buffer中的序列号为1(和之前的,包括tlp4094~tlp1)的tlp备份移除。同时将replay_timer和replay_num复位。
example 3. example of nak
step1 假设设备a准备依次向设备b发送序列号为4094,4095,0,1,2的tlp;
step2 设备b成功地接受了tlp4094,并将next_rcv_seq加1,变为4095;
step3 设备b接收到了tlp4095,但是该tlp并未通过crc校检(即存在错误)。此时无论acknak_latency_timer处于何种状态,设备b都会立即向设备a返回ack4094(注意返回的ack dllp中的序列号为上一次成功接收的tlp的序列号)。同时设备b将acknak_latency_timer停止并复位;
step4 设备b会一直等待设备a向其发送tlp4095,但是设备a却并不知发生了什么,在接收到设备b向其返回的ack/nak之前,会继续发送tlp0~tlp2,只是设备b会直接忽略这些tlp。
step5 当设备a接收到来自设备b的nak4094 dllp时,会将buffer中的tlp4094(和之前的tlp)移除,并从tlp4095从新开始发送。同时,将replay_timer复位。
注:mindshare书中,此处说还会复位replay_num,这是不正确的。
step6 由于设备a接收到的是nak,而不是ack,因此设备a会重新启动replay_timer并将replay_num加一;
step7 一旦设备b成功地接收到tlp4095,设备b便会清除nak_scheduled标志位,并将next_rcv_seq计数器加一,同时重启acknak_latency_timer。
example 4. example of lost tlps
step1 假设设备a准备依次向设备b发送tlp 4094,4095,0,1,2;
step2 设备b成功地接收了tlp4094~tlp0,并向设备a返回ack0,此时设备b的next_rcv_seq为1;
step3 设备a接收到设备b返回的ack0,从buffer中移除相应的tlp备份;
step4 设备b接收到了tlp2(而不是tlp1),也就是说tlp1在传输过程中丢失了。此时,设备b会直接将tlp2丢弃,并将nak_scheduled标志位置位,同时向设备a返回nak0 dllp;
step5 设备a接收到nak0 dllp后,会将buffer中的tlp0(以及之前的,如果有的话)移除。同时,从tlp1开始,重新向设备b发送。
example 5. example of bad nak
step1 设备a准备依次向设备b发送tlp 4094,4095,0,1,2;
step2 设备b成功的接收了tlp4094~tlp0,但是由于acknak_latency_timer尚未溢出,所以设备b没有立即向设备a返回ack dllp;
step3 设备b发现tlp1中存在错误,于是向设备a返回nak0 dllp,并将nak_scheduled标志位置位;
step4 设备a发现其接收到的nak0 dllp中也存在错误(crc校检不通过),于是直接丢弃了nak0;
step5 然而设备b却一直在等待设备a向其发送tlp1,在其成功接收tlp1之前,设备b不会返回任何ack或者nak,不管设备a向其发送什么(除tlp1之外的)。设备b的nak_scheduled标志位也一直保持置位;
step6 尴尬的是,设备a并不知道设备b想要其重发tlp1(由于没有成功接收到nak0)。因此,设备a会继续向设备b发送之后的tlp,但是由于一直没有接收到设备b的ack/nak dllp,设备a的replay_timer会在一段时间后溢出;
step7 当设备a的replay_timer溢出后,设备a会向buffer中的所有tlp都重新发送一遍,并重启replay_timer,同时将replay_num计数器加一;
step8 设备b会再次接收到tlp4094~tlp0,但是这在之前就已经成功接受到过了。因此设备b会直接将其丢弃,且不会像设备a返回任何的ack或者nak
step9 此时,设备b再次接收到了tlp1,并未发现错误(成功接收)。于是,设备b将nak_scheduled标志位清零,并重启acknak_latency_timer,将next_rcv_seq加一。

为特斯拉构思设计一款蓝牙刹车踏板监测器
PoD共识算法的经济模型分析
区块链技术将推动货运和物流行业的发展
Q4财报公布:小鹏汽车首超200亿 蔚来汽车全年交付91429台 理想汽车营收270.1亿元
腾讯发布SaaS生态“千帆计划”,旨在推动国内SaaS市场快速发展
简单地分析几个Ack/Nak机制的例子
高通再次宣布5G终端提前半年,年底推出5G样板手机,是否过于仓促?
怎样比较指纹?
我国部分企业,智能制造领域,只是热炒概念,空有一身壳
NumicroM2354系列支持RT-Tread RTOS用于IoT设备设计
DC2191A对LTC2000的输出进行上变频
真机皇诺基亚8你怕不怕 MWC 2017大会前瞻
采用智能手机的革新设计 为用户带来“全新体验”创造笔记本电脑新市场
中兴通讯正研发5nm工艺5G芯片,有望2021年实现商用
新唐科技ISD15108主板介绍
粗糙度仪如何选型?
使用VHDL实现Flash读写控制器设计
微软Windows 10应用程序更多新图标浮出水面
使用Chiplet的三个优势介绍
宇宙膨胀在加速 没人知道其原因