RDMA中的NAK机制设计揭秘
第一章 概述
在 RDMA(Remote 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报文使用syndrome的bit[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 read、 RDMA write或atomic操作:
l RETH头中的R_Key域段无效
l 指定的虚拟地址及访问长度或类型超出了与R_Key关联的本地定义限制范围
l 检测到RD非法
发现上述错误,回复一个NAK报文,该NAK报文的PSN为当前发生错误请求的报文的PSN值。
二.3. 无效请求错误
请求端发起的操作超出了传输服务的规定使用范围,即响应端不支持的OpCode,或请求长度超出可用接收缓冲区空间。例如,向不支持UD传输的响应端发送 UD报文将导致无效请求错误。
发现上述错误,回复一个NAK报文,该NAK报文的PSN为当前请求报文的PSN。
二.4. 远程操作错误
当响应端遇到导致接收队列无法完成当前请求的情况时,就会发生远程操作错误。发生这种错误时,回复一个NAK报文,该NAK报文的PSN为当前请求报文的PSN。
二.5. 无效RD请求错误
有几种情况导致这种错误
当响应端在RD模式下检测到Q_Key或 RDD 违规时,
或目标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 导致吞吐量下降)和连接稳定性问题至关重要。