TCP/IP介绍

1.定义:TCP/IP(Transmission Control Protocol/Internet Protocol)是一套用于互联网及局域网的分层网络通信协议簇,包含 TCP(传输层协议)和 IP(网络层协议),以及链路层、应用层等配套协议,是当前互联网的基础通信标准。

2.核心特点

3.优缺点

4.应用场景: 适用于对通用性和可靠性要求高于极致性能的场景,例如互联网网页访问、远程登录(SSH)、文件传输(FTP)

RDMA介绍

1.定义:RDMA(Remote Direct Memory Access,远程直接内存访问)是一种高性能网络通信技术,允许一台主机的应用程序直接访问另一台主机的内存,无需经过操作系统内核和 CPU 中转,从而实现超低延迟、高吞吐量的通信。

2.核心特点

3.优缺点:

4.应用场景:适用于对延迟和吞吐量有极致要求的高性能计算和数据中心场景,例如分布式存储、高性能计算、AI训练集群

通信流程案例

我们以A 主机应用程序向 B 主机内存写入数据为例,分别拆解 TCP/IP 和 RDMA 的完整通信流程,清晰呈现二者的核心差异

TCP/IP通信流程

TCP/IP 通信中,A 无法直接访问 B 的内存,需通过 “应用层数据交互 + 内核 / 用户态拷贝” 间接实现,整体流程分为连接建立、数据传输、连接断开三个阶段,涉及多层协议栈和多次内存拷贝。

step1.前期准备
A主机:应用程序在用户态分配发送缓冲区,写入待传输数据,调用 socket() 接口创建 TCP 套接字,绑定端口并调用 connect() 发起连接请求

B主机:应用程序在用户态分配接收缓冲区,用于存储最终数据,调用 socket() 创建套接字,绑定端口后调用 listen() 监听连接,再调用 accept() 等待客户端连接

step2.建立连接:(TCP三次握手)
A 向 B 发送SYN 报文,请求建立连接、B 收到后回复SYN+ACK 报文,确认同步并同步自身序列号、A 再回复ACK 报文,TCP 连接正式建立。此阶段全程由内核协议栈处理,不涉及用户应用程序

step3.数据传输
A 主机用户态→内核态拷贝:A 应用调用 send() 系统调用,将用户态发送缓冲区的数据拷贝到内核态的 TCP 发送缓冲区,触发用户态 / 内核态切换。

A 主机内核协议栈处理:内核对数据进行 TCP 分段、添加 TCP/IP 协议头、计算校验和,再将数据包传递到数据链路层,封装成以太网帧后通过网卡发送。

B 主机接收与协议栈处理:B 网卡收到以太网帧后,先传递到内核链路层,逐层剥离协议头(以太网→IP→TCP),校验通过后将数据存入内核态的 TCP 接收缓冲区

B 主机内核态→用户态拷贝:B 应用调用 recv() 系统调用,触发用户态 / 内核态切换,内核将接收缓冲区的数据拷贝到应用的用户态接收缓冲区,完成数据写入。

step4.连接断开
A 调用 close() 发送FIN 报文,请求断开连接、B 回复ACK 报文确认,同时自身若无数据发送则发送FIN 报文、1. A 回复ACK 报文,连接正式断开。

RDMA通信流程

RDMA 支持 A 应用绕过内核直接读写 B 的内存,以可靠连接(RC)模式为例,流程分为资源初始化、内存注册与授权、数据传输三个阶段,无内核中转和多余拷贝。

step1.前期准备
A/B主机通用步骤:1. 初始化 RDMA 环境,加载 Verbs 驱动,获取 RDMA 网卡(RNIC)的设备上下文、2.创建保护域(PD):隔离不同应用的 RDMA 资源,避免冲突、3.创建队列对(QP):每个 QP 包含发送队列(SQ)和接收队列(RQ),用于收发 RDMA 指令 4.创建完成队列(CQ):用于通知应用程序 RDMA 操作的完成状态

step2.内存注册与地址授权
B主机:在用户态分配目标内存区域(MR)、调用 ibv_reg_mr() 注册该内存,RNIC 会锁定此内存区域(防止被系统换出),并生成内存键(rkey)内存句柄(lkey) 、通过带外通道(如 TCP/IP 或共享配置),将该内存的远程地址(VA)内存长度rkey发送给 A 主机(rkey 是 A 访问该内存的权限凭证)、调用 ibv_modify_qp() 将 QP 状态切换为 “可连接”,等待 A 建立 RDMA 连接

A主机:接收 B 发送的内存地址、长度和 rkey,保存到本地、调用 ibv_modify_qp() 向 B 发起 QP 连接请求,双方完成 RDMA 连接建立(类似 TCP 握手,但由硬件完成)

step3.数据传输

  1. A 主机构造 RDMA 写指令:A 应用在用户态构造RDMA_WRITE 请求,指定参数:本地待发送数据的内存地址和长度、B 主机的目标内存地址、rkey;将该请求提交到本地 QP 的发送队列(SQ)
  2. RNIC 硬件执行传输:A 的 RNIC 直接读取本地用户态内存的数据,通过 RDMA 网络发送到 B 的 RNIC,全程无用户态 / 内核态切换,无主机 CPU 参与
  3. B 主机 RNIC 写入内存:B 的 RNIC 收到数据后,通过 rkey 验证访问权限,直接将数据写入已注册的目标内存区域,无需 B 的 CPU 和内核介入
  4. 完成通知:B 的 RNIC 向 CQ 发送完成事件,B 应用通过轮询或中断感知到内存写入完成,可直接访问该内存数据

step4.后续清理
通信结束后,双方调用接口释放 QP、PD、MR 等资源,断开 RDMA 连接

总体比较

image.png