ECRC vs LCRC
TL层的TLP报文有个ECRC,而DLL层对TLP会加上序列号和LCRC。两个CRC有何不同呢?
LCRC :
- LCRC是Link CRC,是用来检测在两个设备之间的链路(Link)上发生的错误,这些错误大多是由于物理层的信号质量问题引起的。
- 因为仅是针对Link和互联的两个设备,LCRC换个说法也可以叫Local CRC。
- 当TLP报文通过Switch时,在入口(ingress port)被DLL层校验LCRC。而在Switch的出口(egress port)会重新生成LCRC。
- 当接收端检测到TLP报文的LCRC不正确时,将会发送一个NAK报文给发送端,要求重传此TLP。因此,LCRC错误是可修正错误,因为可以通过重传来修正。
- 重传的过程并不需要软件参与。
ECRC:
- ECRC是End-to-End CRC,是检测TLP报文的内容是否在Requester和Completer之间的路径上是否损坏。例如switch在转发TLP报文时由于某些bug发生了数据不一致。
- ECRC是requester/initiaor的TL层生成的。如果Completer检测到ECRC错误,会上报通知系统处理。并没有重传机制,因此是不可修正错误。
- 当TLP报文进入Switch时,Switch并不会修改ECRC,并完整把TLP报文发出去。换言之,TLP经过路径上的Switch内容不会发生任何改变,甚至ECRC是错误的,Switch也视而不见继续发出去。
- TLP的错误,需要软件参与,由上层软件决定是否重发。
下表列出了两者的差异:
LCRC | ECRC | |
含义 | Link CRC | End-to-End CRC |
长度 | 32-bit | |
源/目的 | 两个连接的设备之间 | Requeseter和Completer之间 |
通过Switch时 | 在出口重新计算生产 | Switch 不会修改 |
Switch收到错误报文时 | 要求对端重发 | 记录错误,继续转发 |
完成者收到错误报文 | 要求对端重发 | 发出一个不可修正错误消息通知系统处理 |
是否可修正 | 可修正 | 不可修正 |