问题描述
为了使响应者可以区分重复项 来自乱序数据包的数据包,给定的发送队列应具有 在任何给定时间不超过8,388,608的PSN系列。 因此,在任何给定时间,发送队列的未完成数据包不得超过8,608个。这包括所有SEND请求的总和 数据包加上所有RDMA WRITE请求数据包加上所有ATOMIC操作 请求数据包以及所有预期的RDMA READ响应数据包。 因此,PSN空间(由16,777,216个PSN组成)被划分 分为两个区域,每个区域占用8,608个PSN,称为 有效区域和无效区域。
正如我从IBTA规范中引用的那样,如果有效区域大于2 ^ 24大小的PSN区域大小的一半,为什么不能将重复数据包与乱序数据包区分开?
解决方法
想象一下,为简化示例,假设0..3
的总PSN范围较小。如果遵循规范的精神,有效区域将是2个数据包,其中包括预期的PSN和1个先前的重复PSN,但可以说我们将其增加到3个数据包。
看看下面两种情况:
乱序情况
Sender sends | Receiver sends
Send 0 | Ack 0
Send 1 (lost) |
Send 2 (lost) |
Send 3 | ?
接收器接收到Send 0后,预期的PSN为1。当接收器获得第4个数据包时,它是乱序数据包,比预期的PSN高2。响应者应将其视为一个序列错误。
场景重复
Sender sends | Receiver receives | Receiver sends
Send 3 | Send 3 | Ack 3 (lost)
Send 3 (delayed) | |
Send 0 | Send 0 | Ack 0
| Send 3 (delayed) | ?
此处,发送方在等待丢失的ack超时后重新发送Send 3。重传在网络中被延迟,并且接收方只有在接收到发送0之后才能看到它。接收方上预期的PSN为1,并且它正在接收有效区域内的数据包(后面有2个数据包),因此应对其进行处理作为重复的数据包。
摘要
如您所见,在两种情况下,接收器状态(预期的PSN)是相同的,并且接收的数据包具有相同的PSN,因此有效区域为3时,将无法区分这两种情况场景。如果我们将有效区域限制为2,则第一种情况将是不可能的,因为发送方在发送PSN 3之前必须等待对PSN 1的确认。