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的错误,需要软件参与,由上层软件决定是否重发。

下表列出了两者的差异:

LCRCECRC
含义Link  CRCEnd-to-End CRC
长度32-bit
源/目的两个连接的设备之间Requeseter和Completer之间
通过Switch时在出口重新计算生产Switch  不会修改
Switch收到错误报文时要求对端重发记录错误,继续转发
完成者收到错误报文要求对端重发发出一个不可修正错误消息通知系统处理
是否可修正可修正不可修正

发表回复

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