Data Link Layer Packet (DLLP)
数据链路层的报文(DLLP)是由发送端的数据链路层生产,并在接收端被接收端的数据链路层接收,生活的范畴仅在一条链路上。DLLP包括用于Ack/Nak机制、电源管理、流控(Flow Control)以及一些设备厂商自定义的功能。
如上图所示,DLLP在物理层被添加了“Start”和“End”。数据链路层(DLL)生产DLLP,并且在后面添加了CRC以校验这个DLLP是否正确。
前面一篇文章讲过,DLL会给从TL层下来的每个TLP报文都添加两个东西:一是在TLP前面增加序列号(Sequence number),二是在TLP尾部增加LCRC,对端会检测这个LCRC,以确保传输的TLP内容不会损坏。
每一个通过DLL层的TLP都会被加上序列号,序列号从0开始,最大4095,超过4095后回绕到0。例如:第一个TLP序列号为0,第二个TLP序列号为1,。。。第4096个TLP序列号为4095,第4097个TLP序列号回绕为0。
注意,这里有个地方很容易混淆: TLP在DLL层被添加上sequence number和LCRC后,并不是DLLP!上图的两种报文格式,可以简单理解为添加了sequence number和LCRC的TLP是数据transfer_data,而DLLP报文是控制命令transfer_cmd。transfer_cmd确保了transfer_data传输的正确与否。
transfer_data的LCRC错了,有相关transfer_cmd命令(Nak DLLP)回给发送端要求重传。而transfer_cmd的CRC错了,会怎样呢?答案是接收端会丢弃这条命令。依赖超时等机制继续处理事务。