举一个实际的ACK NAK的例子,这个例子来源于《PCI EXPRESS系统体系结构标准教材.》一书,英文书名叫《PCI Express System Architecture》。话说这本书当年是我学习PCIe的葵花宝典,目前市面已经绝迹了。(注:我有中文和英文的电子版,有需要的后台反馈留言)顺便说一下,王齐的那本《PCI Express体系结构导读》写的很好,讨论了很多PCIe的内部实现细节。
 

1、 发送端A发送序列号为4094、4095、0、1、2的TLP报文。(计数到4095翻转到0开始计数)


2、 接收端B接收序列号为4094、4095、0的TLP报文,NEXT_RCV_SEQ计数增加,下一个待收取的TLP报文序列号是1。当ACK TIMER超时时,发送ACK报文给1、 发送端A,对应序列号0,我们称之为ACK 0。代表之前的4094、4095、0这三个报文我已经接收成功了。


3、 不幸的是,这个回复给发送端的ACK 0报文,在链路上由于某种原因丢失了。发送端并没有收到这个ACK,序列号为4094、4095、0的TLP报文仍然保存在发送端A的Replay buffer里面。


4、 随后,发送端A发送的序列号为1、2的报文TLP 1、TLP 2到达了接收端B。TLP 1校验完全正确,NEXT_RCV_SEQ计数增加,下一个待收取的TLP报文序列号是2。


5、 雪上加霜的是TLP 2由于某种原因损坏,校验不通过,接收端B不接收,NEXT_RCV_SEQ计数不变,仍为2。


6、 由于TLP 2不成功,接收端B需要回复一个NAK给发送端A,其中的序列号为1。


7、 NAK 1报文顺利的到达了发送端A。


8、 发送端A收到NAK 1,表示前面发送的TLP 2有错,但是TLP 4094、TLP 4095、TLP 0、TLP 1都已经被接收端正确接收了。因此,清除Replay buffer里面的序列号为4094、4095、0、1的报文。


9、 发送端尝试重新发送TLP 2。


10、 TLP 2这次成功的被接收端接收,NEXT_RCV_SEQ计数增加,下一个待收取的TLP报文序列号是3。

4 对 “ACK & NAK Sample”的想法;

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注