searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

RDMA中的NAK机制设计揭秘

2026-04-07 16:49:33
2
0

RDMA中的NAK机制设计揭秘

第一章 概述

RDMARemote Direct Memory Access,远程直接内存访问)技术中,NAK (Negative Acknowledgement,否定确认) 是一种关键的传输层控制报文。

它的核心作用是:接收端(Responder)告诉发送端(Requester)之前的数据传输出现了错误或异常,要求发送端采取特定措施(通常是重传或暂停)。

NAK 机制是 RDMA 实现可靠传输(Reliable Connection, RC)的核心组成部分,它允许硬件在不依赖 CPU 干预的情况下快速检测错误并恢复。

NAK报文是Acknowledge报文(以下简称ACK报文)的一种。ACK报文包含扩展头AETH头,AETH头中的syndrome域段可用于区分NAK类型。若bit[6:5]b11,则报文为NAK报文,若bit[6:5]b01,则报文为RNR NAK 报文。NAK报文使用syndromebit[4:0]对异常情况进行了进一步划分,划分情况如下

NAK code

Bit[4:0]

定义

00000

PSN顺序错误

00001

无效请求

00010

远程访问错误

00011

远程操作错误

00100

无效RD请求

其他

保留

RNR NAK报文的syndrome bit[4:0]则为流控时间。

 

第二章 生成NAK的情况

根据上表可知,生成NAK的情况有六种。

下面根据这六种NAK进行说明。

二.1. PSN顺序错误

当接收端检测到请求数据包超出PSN序列范围时,即检测到的PSN值既不等于预期PSN值,也不处于有效重复数据包范围内时,即发生序列错误,回复一个NAK报文,NAK报文的PSN为当前预期PSN值。

对端接收到这个NAK报文时,应将队列回滚到PSN乱序前的某个报文,从该位置重新发送请求数据包。

 

二.2. 远程访问错误

远程访问错误主要是指报文中的R_Key错误。R_Key错误由以下任一或全部条件导致,涉及 RDMA readRDMA writeatomic操作:

RETH头中的R_Key域段无效

指定的虚拟地址及访问长度或类型超出了与R_Key关联的本地定义限制范围

检测到RD非法

发现上述错误,回复一个NAK报文,该NAK报文的PSN为当前发生错误请求的报文的PSN值。

 

二.3. 无效请求错误

请求端发起的操作超出了传输服务的规定使用范围,即响应端不支持的OpCode,或请求长度超出可用接收缓冲区空间。例如,向不支持UD传输的响应端发送 UD报文将导致无效请求错误。

发现上述错误,回复一个NAK报文,该NAK报文的PSN为当前请求报文的PSN

 

二.4. 远程操作错误

当响应遇到导致接收队列无法完成当前请求的情况时,就会发生远程操作错误。发生这种错误时,回复一个NAK报文,该NAK报文的PSN为当前请求报文的PSN

 

二.5. 无效RD请求错误

有几种情况导致这种错误

当响应RD模式下检测到Q_KeyRDD 违规时,

或目标QP未配置RD服务,

或目标QP处于无法接收入站数据包的状态,

XRC 服务检测到远程 XRC / XRCETH 违规时

发现上述问题时,回复一个NAK报文

二.6. RNR NAK

在某些情况下,接收队列可能暂时无法处理传入请求消息。例如,当前接收队列中可能未发布有效的接收 WQE 。此时应答器会返回RNR NAK的响应。注意:响应端可对各类请求类型返回RNR NAK响应(如发送请求、 RDMA 读取请求、 RDMA 写入请求等)。收到RNR NAK响应后,请求端需等待至少响应包中指定的时间间隔,方可重试相同请求。“相同请求”特指与应答器RNR NAK响应中报告的PSN包完全一致的原始请求消息。

 

第三章 总结

RDMA 中,NAK 是保障数据可靠性和系统稳定性的刹车纠错信号。

如果是 RNR NAK,它在说:慢点,我忙不过来,等会儿再发。(流量控制)

如果是 Error NAK,它在说:出错了(丢包或权限不对),请重传或停止操作。(错误恢复)

理解 NAK 对于调试 RDMA 性能问题(如频繁的 RNR 导致吞吐量下降)和连接稳定性问题至关重要。

0条评论
作者已关闭评论
乱序不丢包
4文章数
0粉丝数
乱序不丢包
4 文章 | 0 粉丝
原创

RDMA中的NAK机制设计揭秘

2026-04-07 16:49:33
2
0

RDMA中的NAK机制设计揭秘

第一章 概述

RDMARemote Direct Memory Access,远程直接内存访问)技术中,NAK (Negative Acknowledgement,否定确认) 是一种关键的传输层控制报文。

它的核心作用是:接收端(Responder)告诉发送端(Requester)之前的数据传输出现了错误或异常,要求发送端采取特定措施(通常是重传或暂停)。

NAK 机制是 RDMA 实现可靠传输(Reliable Connection, RC)的核心组成部分,它允许硬件在不依赖 CPU 干预的情况下快速检测错误并恢复。

NAK报文是Acknowledge报文(以下简称ACK报文)的一种。ACK报文包含扩展头AETH头,AETH头中的syndrome域段可用于区分NAK类型。若bit[6:5]b11,则报文为NAK报文,若bit[6:5]b01,则报文为RNR NAK 报文。NAK报文使用syndromebit[4:0]对异常情况进行了进一步划分,划分情况如下

NAK code

Bit[4:0]

定义

00000

PSN顺序错误

00001

无效请求

00010

远程访问错误

00011

远程操作错误

00100

无效RD请求

其他

保留

RNR NAK报文的syndrome bit[4:0]则为流控时间。

 

第二章 生成NAK的情况

根据上表可知,生成NAK的情况有六种。

下面根据这六种NAK进行说明。

二.1. PSN顺序错误

当接收端检测到请求数据包超出PSN序列范围时,即检测到的PSN值既不等于预期PSN值,也不处于有效重复数据包范围内时,即发生序列错误,回复一个NAK报文,NAK报文的PSN为当前预期PSN值。

对端接收到这个NAK报文时,应将队列回滚到PSN乱序前的某个报文,从该位置重新发送请求数据包。

 

二.2. 远程访问错误

远程访问错误主要是指报文中的R_Key错误。R_Key错误由以下任一或全部条件导致,涉及 RDMA readRDMA writeatomic操作:

RETH头中的R_Key域段无效

指定的虚拟地址及访问长度或类型超出了与R_Key关联的本地定义限制范围

检测到RD非法

发现上述错误,回复一个NAK报文,该NAK报文的PSN为当前发生错误请求的报文的PSN值。

 

二.3. 无效请求错误

请求端发起的操作超出了传输服务的规定使用范围,即响应端不支持的OpCode,或请求长度超出可用接收缓冲区空间。例如,向不支持UD传输的响应端发送 UD报文将导致无效请求错误。

发现上述错误,回复一个NAK报文,该NAK报文的PSN为当前请求报文的PSN

 

二.4. 远程操作错误

当响应遇到导致接收队列无法完成当前请求的情况时,就会发生远程操作错误。发生这种错误时,回复一个NAK报文,该NAK报文的PSN为当前请求报文的PSN

 

二.5. 无效RD请求错误

有几种情况导致这种错误

当响应RD模式下检测到Q_KeyRDD 违规时,

或目标QP未配置RD服务,

或目标QP处于无法接收入站数据包的状态,

XRC 服务检测到远程 XRC / XRCETH 违规时

发现上述问题时,回复一个NAK报文

二.6. RNR NAK

在某些情况下,接收队列可能暂时无法处理传入请求消息。例如,当前接收队列中可能未发布有效的接收 WQE 。此时应答器会返回RNR NAK的响应。注意:响应端可对各类请求类型返回RNR NAK响应(如发送请求、 RDMA 读取请求、 RDMA 写入请求等)。收到RNR NAK响应后,请求端需等待至少响应包中指定的时间间隔,方可重试相同请求。“相同请求”特指与应答器RNR NAK响应中报告的PSN包完全一致的原始请求消息。

 

第三章 总结

RDMA 中,NAK 是保障数据可靠性和系统稳定性的刹车纠错信号。

如果是 RNR NAK,它在说:慢点,我忙不过来,等会儿再发。(流量控制)

如果是 Error NAK,它在说:出错了(丢包或权限不对),请重传或停止操作。(错误恢复)

理解 NAK 对于调试 RDMA 性能问题(如频繁的 RNR 导致吞吐量下降)和连接稳定性问题至关重要。

文章来自个人专栏
文章 | 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0