通常,对于Swtich来讲,通过它向其他设备传输报文的模式有两种。一种是所谓Store and Forward。另一种是Cut-Through。

  • Store and Forward很好理解,即Switch接收整个报文,然后再处理,没有错误,再继续向目标端口发送。有错误,则按照ACK/NAK协议要求发送端重新发送。这种方式的优点是确保正确的报文才向egress port端口发送,保证了egress port的带宽不浪费。缺点显而易见,增加了报文在Switch中的延时。
  • 为了降低延时,Spec定义了另一种传输方式,称之为Cut-Through。跟以太网中的Cut-Through模式类似,Switch在收到报文头后,并不需要等完整的报文接收完成,就开始向目标端口转发报文。这种模式明显减低了报文在Switch中的延时,不过报文有错的话,会浪了egress port的带宽。总的来说,链路报文错误是少数情况,整体上看这种模式更加优越。    

        那么问题来了,报文在没有完全校验之前就已经从Switch发送出去了,Switch从发送端接收完报文后,校验失败,回复NAK,要求发送端重新发送。由于报文是错误的,Switch并不保存这个报文。而当接收端接收到错误报文的时候,要求Switch重新发送。Switch该怎么办??
         答案是:Spec定义了一种Nullified packet(取消报文,报文无效)的方式来解决这种场景:

 1) 一个错误的TLP报文到达Switch
 2) Switch没有完全收完报文,即开始向外转发
 因为LCRC在报文的尾部,所以Switch并不知道这个报文是否正确,知道报文的尾部完全到达Switch
 3) Switch接收到所有报文,并且发现这个报文有问题。于是回复NAK,通知发送端重发
 4) Switch用EDB(End Bad)代替END,继续发送
 5) 接收端收到EDB,认为这是一个无效的报文,不处理
 6) 注意:接收端并不回复NAK,因此Switch也不需要重发此报文

2 对 “Store & Forward and Cut-Through”的想法;

    1. store-and-forward 和cut-through 本来就不是PCIe新协议的新东西。传统的很多其他协议就有类似的东西。比如以太网。
      所以cut-through也没有什么特别需要讲的。就是为文章里描述的那样,比较简单。

回复 juwenlong 取消回复

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