ACK & NAK Sample
举一个实际的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。
大神,受益匪浅,希望能看到更多大作。那个葵花宝典麻烦发我一份,不胜感激。
链接:https://pan.baidu.com/s/1oXv3LfE3ucLr7VrLTudB8Q
提取码:6l52
是I不是1
感谢。
有英文版本么?
中文的看着好别扭。。