目录
- 编程杂记
- 什么是P_Key
- 建链
- 基于Socket API的建链
- 基于CM API的建链
编程杂记
什么是P_Key
P_Key(Partition Key)用于提供InfiniBand网络的隔离机制,只有在一个分区内的节点可以互相通信。
P_Key是一个16位的值,有两部分
- msb位:membership bit,0表示limitied membership,1表示full membership
- 低15位是定义分区的key
只有具有同样key的QP才可以通信,而且至少一个QP是这个分区的full member。
P_Key在所有通信类型中都存在,不论RC,UD
建链
基于Socket API的建链
- 通过Socket连接交换信息,例如在RC Send中,需要交换GID、QPN信息
- 调用ibv_modify_qp函数改变QP状态,将SQ改为RTS状态,将RQ改为RTR状态。在更改状态时,把GID、QPN信息写入QPC(RC)
基于CM API的建链
介绍RC QP的CM建链流程:
- 首先Client端要发起一个REQ(Request)消息,表示一个连接请求,消息的报文中携带有连接参数,比如本端要连接的QP的QPN、起始PSN、重传次数上限等等。
- Server端在Client端发起连接请求前就一直处于监听状态,当它监听到连接请求后,CM层会对连接参数进行校验和记录。校验通过后,Server端会发送REP(Reply)消息,表示接受之前的连接请求,并且在消息报文中携带自己的连接参数(QPN、起始PSN等)。
- Client端收到REP消息后,将对其中的内容进行校验和记录,然后发送一个RTU(Ready To Use)消息,表示同意你的参数,可以利用双方约定好的QP进行数据交互了。