本来这章应该对3层协议详细介绍,但那种烂大街的介绍多如牛毛,也就不详细说了,想了解的可以去看协议,看书,或者搜网上那个扫盲贴,写的也比较详细,因此本章就零零散散写一些自己认为有必要的。
数据链路层:
上章说了,数据链路层是为了保证两个设备TLP数据的可靠性,而且数据封包是从上往下的,所有传输层封装完成后,到数据链路层又封装了一个数据链路层的header,而且还计算了一个CRC,这个LCRC放到报文尾部。这是最常见的一个可靠性措施。提到这个LCRC,就顺便说一下ECRC,按理说一个数据包有一个CRC就足够了,为什么还会有一个ECRC,这个ECRC是TLP计算的,LCRC是DLLP计算的,当数据请求者和接收者直接连接,LCRC就已经足够了,但假设请求者和接收者直接有switch转接呢,switch入口接收到请求者的数据后,会把DLLP层解封了,然后内部转发TLP到switch出口,这个时候会重新计算LCRC封装报文转发出去。所以可以说LCRC是数据链路层的CRC,ECRC是传输层的CRC。
两个PCIe设备之间是可以直接数据链路层通信的,就是说只有物理层和数据链路层,协议也定义了很多特定意义的DLLP。一个PCIe设备是否建链成功并不是看物理协商是否协商上,而是看DlActive状态。
保证可靠性还有很多方面,流控也是很关键的一点,如果抓过协商的pcie