news 2026/5/11 15:37:38

从零读懂RDMA UD send:硬件视角下的“无连接”数据报

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零读懂RDMA UD send:硬件视角下的“无连接”数据报

今天我们接着聊RDMA UD send,你可能会被不可靠”“无连接”这几个字吓到,会说这不就是UDP嘛,RDMA为什么要做一个这样的东西。但是事实上,UD在RDMA里占据着不可替代的位置,控制消息、多播同步、IPoIB的广播,都靠它。

在开始详细描述之前,我们首先需要解释一下UD的“无连接”问题,例如RC QP在发送数据之前,必须经历REQ/REP/RTU三次握手,双方交换QPN、起始PSN、MTU等参数,QP状态机从Reset走到RTS,这才算“建链成功”。这个过程由硬件参与,状态机固化在QP上下文里。

而UD完全没有这个流程,那他的信息是如何交换获取的呢?常见的有一下几种方式:

  1. Socket/CM交换:双方先通过一个TCP连接(或RDMA CM)互相告知自己的UD QPN和地址,然后各自用这些信息去发UD消息;
  2. 静态配置:在集群配置文件中写死对方QPN和地址,程序启动时读取;
  3. 多播/广播发现:发送端往一个已知的多播组发送“我是谁,我的QPN是多少”的广播包,感兴趣的对端收到后记录下来并直接回复

所以,UD的“无连接”仅仅是指硬件QP没有RC那种显式的连接建立状态机,而不是说软件不需要知道对方是谁。这个区别必须一开始就讲清楚,否则后面的所有内容都会让人困惑。

一、硬件眼中的UD:极简的QP上下文

对于UD的QP上下文来说,硬件只需要记住以下信息:

  1. 本端QPN;
  2. 接收Q_Key;
  3. 一些标志位;

不需要维护PSN,没有窗口,没有重传计时器,没有对端状态。硬件看到这样的“小身板”就知道:这个QP可以开很多个。

二、发送:硬件从WQE里拿到一切

应用程序要发UD消息,必须先拿到对端的QPN和地址,然后将全部的信息在WR里填好,而驱动把WR转换成WQE,写入SQ,敲门。网卡硬件从SQ里取出WQE,然后按顺序执行下面的步骤:

  1. DMA取数据:拿着WQE里的本地数据指针,通过PCIe DMA把数据从主机内存搬到网卡内部的包缓冲区。因为UD不能拆包,如果数据长度超过路径MTU,硬件会直接报错,CQE里的状态码告诉你是长度超限。
  2. 获取头部信息:通过QP和WQE获取目的/源IP地址、目的/源MAC地址、UDP端口(RoCEv2固定4791)、目的LID/GID等。
  3. 构造IB传输头(BTH + DETH):

BTH:OpCode = UD Send Only,Dest QP = WQE中的remote_qpn,PSN = 0(占位)。

DETH:8字节,包含Q_Key(32位)和Source QPN(24位)。

  1. 构造RoCEv2封装并计算ICRC。
  2. 发送:将完整数据包通过物理端口发出。
  3. 立即产生CQE:不等待任何ACK,发完后直接在CQ中生成完成条目,无重传、无计时器、无PSN跟踪。

三、接收:Q_Key是门禁,多播是复制

接收端网卡从线缆上抓到包,解完LRH/GRH,看到OpCode是UD Send Only,就知道这是一个UD包。接下来要决定:这个包应该交给哪个QP,这个流程主要分为以下几步:

  1. 从DETH里取出Q_Key和Source QPN。
  2. 看BTH里的DST QPN:此时有两种情况,如果DST QPN是一个具体数值,那么直接用这个数值去QP Table里找对应的UD QP。找到且类型匹配就继续;找不到或类型不对,则直接丢弃报文。如果是特殊值0xFFFFFF,那么说明这是一个多播包,此时要去多播组成员关系表,找到所有加入该多播组的本地QP,然后每个QP都复制一份。
  3. Q_Key校验:找到目标QP后,检查包里的Q_Key是否等于该QP预设的接收Q_Key。
  4. DMA写内存:从目标QP的RQ里取出一个预先post好的Receive WQE,拿到接收缓冲区地址。硬件把包的有效载荷(去掉所有头部)通过DMA写入主机内存。
  5. 产生CQE,如果一张网卡上有3个QP都加入了同一个多播组,硬件收到一个多播包时,会在网卡内部把数据包复制3份,分别DMA到3个接收缓冲区,然后出3个CQE。

四、总结

UD的“无连接”三个字,经常被误解为“不需要知道对方是谁就能发消息”。经过这篇文章,你应该明白:硬件确实不需要握手,但软件必须在发送前通过某种方式拿到对方的QPN和地址,然后显式地填进WQE。硬件只负责执行,不负责发现。

这种设计是RDMA追求极致性能的一个缩影:把复杂的事情交给软件(发现、协商、错误恢复),让硬件专注于最核心的数据搬移。理解了这个分工,你就真正看懂了UD。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/11 15:36:58

std::string查找替换字符全攻略

在C的std::string类中查找并替换指定字符&#xff0c;主要通过其成员函数find、rfind、replace以及算法库<algorithm>中的std::replace来实现。具体操作取决于你是要替换所有匹配字符&#xff0c;还是只替换第一个或最后一个匹配字符&#xff0c;亦或是替换指定位置范围内…

作者头像 李华
网站建设 2026/5/11 15:36:44

事件相机与RGB融合的高帧率语义分割技术

1. 事件相机与RGB融合的高帧率语义分割技术解析 在自动驾驶和机器人导航等实时感知系统中&#xff0c;准确理解动态场景的语义信息至关重要。传统基于RGB相机的语义分割方法面临一个根本性限制&#xff1a;受限于标准相机的低帧率&#xff08;通常20-30Hz&#xff09;&#xff…

作者头像 李华
网站建设 2026/5/11 15:35:34

三分钟学会免费B站视频解析:bilibili-parse终极使用指南

三分钟学会免费B站视频解析&#xff1a;bilibili-parse终极使用指南 【免费下载链接】bilibili-parse bilibili Video API 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse 你是否曾经遇到过这样的烦恼&#xff1f;看到B站上精彩的视频内容想要保存下来&am…

作者头像 李华
网站建设 2026/5/11 15:33:50

英雄联盟终极自动化工具:3步打造你的专属游戏助手

英雄联盟终极自动化工具&#xff1a;3步打造你的专属游戏助手 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit LeagueAkari是一款专为《英雄联盟…

作者头像 李华
网站建设 2026/5/11 15:33:45

如何在Mac上实现NTFS磁盘读写:Nigate开源工具3分钟部署方案

如何在Mac上实现NTFS磁盘读写&#xff1a;Nigate开源工具3分钟部署方案 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and manageme…

作者头像 李华