从零学习 InfiniBand-network架构(九) —— IB协议中子网本地地址
🔈声明:
😃博主主页:王_嘻嘻的CSDN主页
🔑未经作者允许,禁止转载
🚩本专题部分内容源于《InfiniBand-network architecture》,侵权必删
本章介绍了IBA子网中报文从源端口路由到目的端口时使用的地址,解释了在CA、交换机和路由器上的端口如何编号。解释了Local ID (LID)地址空间、LID地址的用途以及SM为每个端口分配的唯一LID;最后介绍了SM路径数据库的概念。
端口号
在解释后续的Local ID等概念前,需要先介绍一下端口的概念:我理解的端口是除设备本体外,数据传输的最高层,数据的目标就是在端口间的传输。
而在IB架构中,三类设备CA、路由器(router)和交换机(switcher)的端口实现数量和功能略有区别:
- CA:端口数在1—255之间;
CA的每个端口,必须在SM启动阶段就分配完16-bits的LID地址;
每个端口在子网下必须有唯一的LID。 - 路由器:端口数在2—255之间,如果只有1个端口,那么路由器将变成‘死路‘,具体路由器规则可参照第一章:从零学习 InfiniBand-network架构(一) —— IB协议中常用术语及定义;
LID规则与CA一致; - 交换机:端口数在3—255之间,port0是管理端口;
Port0将分配唯一的LID,而不能分配LID范围。
LID地址空间
Local ID是在同一个子网下,对设备的端口进行编号的一个结果。
分配给端口的LID是由SM分配的16位值。这意味着有64K个LID可分配给子网端口,LID整体地址范围细分如下:
- 0000h不能被使用;
- 0001h—BFFFh(48K)作为单播地址,单播包不会运往多个Port;
- C000h—FFFEh(16K)作为多播地址,多播包会前往多个目的地;
- FFFFh作为permissive LID PLID,有特殊用途;
使用LID的目的
数据需要使用LID标记的根本原因在于:包在路由过程中需要通过LID来辨认目的地方向。
在实际应用中DLID(destination LID)和SLID(source LID)共同组成Local Route Header(LRH),DLID表示目标端口的LID,SLID表示源端口的LID,如下图所示。
以下是一个报文从HCA出发,并一路通过LID搜索目标端口的过程:
- 源端TCA将报文传入链路中;
- 在到达目的端口的路径中,数据包到达第一个交换机的端口;
- 交换机的链路层会检查包的DLID内容,确定是单播包还是多播包,并根据内部的查找表确定,包接下去该前往的端口;
- 到达目标TCA端口后,端口的链路层解码数据包的DLID字段并确定它是目标端口,之后,数据包被传递到网络层进行处理。
DLID解析
当端口接收到Packet后,在链路层会检查Packet的DLID项的值是否落在PortInfo所设置的DLID范围内,如果DLID正确,代表packet抵达正确目的地,Port会将包向更高层传输并处理。
此外,当SQ(RC UC UD时)或者EEC(RD)发送Packet时,需要提供给链路层一个选择器,为了选择哪个LID插入到Packet中的LRH:SLID项中。
选择器实际上在规范的描述中被称为Source Path Bits,可以通过一列Verb修改该选择器:
- Modify QP verb
- Modify EEC verb
- Create Address Handle verb
SM路径库
需要注意的是,子网中任意两个CA和/或路由器端口之间通常存在多条路径。在配置阶段,SM会将CA和路由器端口之间所有可能的path都进行记录,构建一个路径库。
当软件后续需要在QP间构建连接时,通过查询该路径库来确定路径,并由LID或GID指定。
搜索关注我的公众号【IC墨鱼仔】,获取我的更多IC干货分享!