如何使用rdmacm通过TCP接口初始化连接,用不同接口执行RDMA传输?
用rdmacm分离控制面(TCP/IP接口)与数据面(独立RDMA接口)的实现方案
完全可以实现这种控制面和数据面分离的场景,rdmacm原生支持通过不同接口处理连接初始化和RDMA数据传输,具体操作如下:
核心配置步骤
绑定控制面到TCP/IP接口
创建rdmacm ID后,通过bind()将其绑定到本地TCP/IP接口的IP地址,确保连接建立的控制报文走TCP/IP链路:struct sockaddr_in ctrl_addr; memset(&ctrl_addr, 0, sizeof(ctrl_addr)); ctrl_addr.sin_family = AF_INET; ctrl_addr.sin_addr.s_addr = inet_addr("你的TCP/IP接口IP"); ctrl_addr.sin_port = htons(你的监听端口); rdma_bind_addr(cm_id, (struct sockaddr*)&ctrl_addr);指定数据面为独立RDMA接口
在发起或接受连接前,需要明确指定RDMA数据传输使用的本地源地址为RDMA接口的IP。可以在调用rdma_connect()时,通过rdma_conn_param关联的地址信息设置,或者提前通过rdma_resolve_addr()解析远端RDMA接口的地址,确保数据面流量路由到RDMA网卡。配置路由隔离流量
为避免控制面和数据面流量混淆,需要在两台主机上添加静态路由,让远端RDMA接口的IP流量仅走本地RDMA网卡:# 本地主机执行 ip route add 远端RDMA接口IP/32 dev 本地RDMA网卡名
关键注意点
- 远端主机需对称配置:控制面绑定自身TCP/IP接口,数据面指定自身RDMA接口地址。
- 确认RDMA网卡驱动和硬件支持独立数据面传输,RoCE环境下可能需要配置VLAN或QoS来隔离流量。
- 调试时可通过
tcpdump分别监控两个接口,验证控制报文走TCP/IP接口,RDMA数据报文走独立RDMA接口。
内容的提问来源于stack exchange,提问作者rafoo
相关产品推荐
相关产品推荐

