IPoIB(Internet Protocol over InfiniBand)是指利用IB物理网络设备(包括IB网卡、IB线缆、IB交换机等),完美支持基于TCP/IP协议编写的应用程序无需作出任何修改可以在IB链路上直接进行数据通信。
IPoIB支持如下功能:
- IPv4,IPv6
- DHCP
- IP 多播
IPoIB体系结构
IPoIB的体系架构如图1所示。在Linux操作系统中,IPoIB协议是作为标准Linux网络驱动程序的一部分实现的,任何基于 TCP/IP 协议栈的应用程序或内核驱动程序无需修改即可使用InfiniBand 传输。
使用IPoIB网络接口发送数据,需要经过内核的网络协议栈,无法从InfiniBand 设备的内核旁路、零拷贝等功能中受益,因此IPoIB性能比RDMA通信方式性能要低。
图1 IPoIB体系结构
IPoIB硬件地址
IPoIB硬件地址其作用类似于以太网中网卡设备的mac地址,IPoIB硬件地址无法通过ifconfig指令查看,需要使用ip addr指令查询IPoIB的硬件地址,IPoIB设备硬件地址由20
个字节构成,以下部分组成:
- 前 4 个字节是保留位和QP序号
-
接下来的 8 个字节是子网前缀
opensm配置文件默认子网前缀为
0xfe:80:00:00:00:00:00:00
。当设备接入到IB子网后,SM会根据opensm配置文件定义的子网前缀下发到IB网络设备。 - 最后 8 个字节是厂商为IPoIB 设备设置的端口的GUID(全球唯一)。
IPoIB数据包格式
IPoIB数据包将TCP/IP协议栈数据包封装在IB帧payload部分,从而使得TCP/IP数据包可以在IB数据链路进行数据传输。IB帧payload部分由4字节的封装头作为前缀,剩余部分为 IP 或 ARP 数据部分。4字节的封装头的前2个字节为type字段剩余2个字节是保留字段,type字段与协议类型关系见表1。
图2 IPoIB 数据包格式
表1 type字段与协议类型关系
Type字段 | 协议类型 |
0x800 | IPv4 |
0x806 | ARP |
0x8035 | RARP |
0x86DD | IPv6 |
- IPoIB工作在Datagram模式,每个消息大小不允许超过infiniband MTU值,根据IB帧paylod构成,IPoIB在封装IP数据包有4字节的封装头,因此IPoIB MTU 比 InfiniBand link-layer MTU 小 4 字节,如IB链路层MTU是2048字节,而工作在Datagram模式的IPoIB设备的MTU值为2044字节。
IPoIB数据包发送工作流程
IPoIB数据通信大致可以划分为以下几个主要步骤: IPoIB设备加入多播组、IP地址解析、Infiniband路径解析、单播包发送。
IPoIB设备加入多播组
为了支持IP多播功能,IPoIB节点首先需要加入多播组。在IPoIB设备初始化过程,将与SA通信请求加入到多播组,加入流程如下:
- 在发送多播包/广播包之前(如:ARP),IPoIB设备加入到InfiniBand多播组
- 主机A向SA(Subnet Administrator)发送带有组MGID的Set(MCMemberRecord)指令
- SA向主机A发送带有组MLID的应答消息
IP地址解析
- 查询主机ARP表是否有主机B的ARP记录,若没有则主机A向多播组发送ARP消息,为了获得请求主机B的地址信息,ARP消息包括:
- 主机B的IP地址
- 主机A的硬件地址:
-
- 端口GID
- 分配到IPoIB会话的QPN
-
- 主机B对应的地址IPoIB硬件地址作为响应报文回复给主机A
- 端口GID
- QPN
Infiniband路径解析和单播包发送
- 主机A向SA请求查询主机B的路径记录,获取所需的 IB 属性
- SA响应主机A,包括主机B的IB属性:
- LID
- SL
- 路径速率
- 等等
- 主机A收到应答消息,封包进行发送
- 添加IPoIB封装头
- 向QP发送WR
- 向目标主机的DLID开始发送数据
-
IPoIB配置方法
Ubuntu配置流程
- 创建和编辑netplan配置文件,如:/etc/netplan/01-netcfg.yaml
- 确定IPoIB接口
ibdev2netdev mlx4_1 port 1 ==> eth1 (Up) mlx4_0 port 1 ==> ib0 (Up) mlx5_0 port 1 ==> ib1 (Up) mlx5_1 port 1 ==> eth2 (Up)
- 在配置文件添加ib0接口和配置IP地址
network: ethernets: eno8304: dhcp4: true eno8303: addresses: - 10.xx.xx.xx/24 gateway4: 10.xx.xx.1 nameservers: addresses: [10.xx.xx.xx] eno8403: dhcp4: true ib0: addresses: [192.168.1.8/24] version: 2
- 重启net plan使用如下指令:
sudo netplan apply
- 运行指令“ip address show ib0"查看接口up和配置生效,与其他节点互ping确认工作正常
Red HAT/CENTOS配置流程
- 创建与编辑IPoIB接口对应的ifcfg配置文件,/etc/sysconfig/network-scripts/ifcfg-ibx
- 确定IPoIB接口
mlx4_1 port 1 ==> eth1 (Up) mlx4_0 port 1 ==> ib0 (Up) mlx5_0 port 1 ==> ib1 (Up) mlx5_1 port 1 ==> eth2 (Up)
- 在配置文件添加ib0接口和配置IP地址
DEVICE=ib0 BOOTPROTO=static IPADDR=192.168.12.2 NETWORK=192.168.12.0 NETMASK=255.255.255.0 BROADCAST=192.168.12.255 ONBOOT=yes
- 重启网络服务,使配置生效
service network restart
- 运行指令“ip address show ib0"查看接口up和配置生效,与其他节点互ping确认工作正常