将有效区域设置为PSN范围大小的一半背后的逻辑是什么? 乱序情况场景重复摘要

问题描述

为了使响应者可以区分重复项 来自乱序数据包的数据包,给定的发送队列应具有 在任何给定时间不超过8,388,608的PSN系列。 因此,在任何给定时间,发送队列的未完成数据包不得超过8,608个。这包括所有SEND请求的总和 数据包加上所有RDMA WRITE请求数据包加上所有ATOMIC操作 请求数据包以及所有预期的RDMA READ响应数据包。 因此,PSN空间(由16,777,216个PSN组成)被划分 分为两个区域,每个区域占用8,608个PSN,称为 有效区域和无效区域。

正如我从IBTA规范中引用的那样,如果有效区域大于2 ^ 24大小的PSN区域大小的一半,为什么不能将重复数据包与乱序数据包区分开?

enter image description here

解决方法

想象一下,为简化示例,假设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的确认。