关于InfiniBand的中文资料要么比较片面,要么太过于浅白,以至于无法解决我们的问题,本文将介绍传统的TCP/IP网路关于网络架构及路由转发相关内容及对InfiniBand网络的介绍,并尝试比较它们的异同,列举实际生产环境遇到的问题及解决方案
TCP/IP网络中的结构及路由转发
常见网络结构的粗浅介绍
以太网中的TCP/IP成为事实上的标准,目前我们大多数人能接触到的网络架构基本都是属于TCP/IP的范畴,它的通用性已经得到了很多年的考验和实践,在实际使用中不管多么复杂的网络结构,都有相对固定的拓扑结构
1、局域网,所有主机直接或者通过集线器、二层交换机连接到一起,所有节点拥有相同网段的IP地址,主机之间直接可达,二层交换
2、局域网间,两个局域网之间要通信,使用不同的内部私有地址,局域网间使用路由器进行跨网段转发,路由器通常会进行NAT
3、广域网,就是所谓的公网,他们的IP广为人知,通过路由器可进行多级路由转发到达
关于路由转发
TCP/IP网络中,主机之间要通信,其二层(MAC层)和三层(IP层)都必须是可以通的,也就是在二层上,主机与主机之间可以直接通信,三层,有有效的路由路径实现IP报文的通信,主要场景如下:
1、通信主机双方位于同一个局域网内,此时主机之间通信走二层转发即可
假设主机A要和主机B通信,主机A仅需得到主机B的mac地址,使用arp协议可以得到,在发送的时候,二层报文头部目的mac地址使用对方的mac地址即可,目的ip因为与主机B位于同一个网段,无需使用路由器即可通信
对于主机B来说,收到报文后,首先会检查报文目的mac是不是收到报文的网卡的mac(事实上最先检查vlan标记),如果不是(也会检查是不是广播报文全F地址),则丢弃,如果是,则将报文转到TCP/IP协议栈处理,检查目的ip是不是本地的某个接口的ip,如果不是(也会检查是不是广播报文四个255),也会丢弃
例如主机A 192.168.1.2/24和主机B 192.168.1.3/24同时连接到一个交换机,它们要通信,通过检查路由表,A检测到目的ip是同网段的ip,这里A检查路由表检查到的是直连路由
,每个网络接口在配置ip地址后都会默认生成两条路由,一条是与掩码对应的直连路由
,表示该网络内主机直接可达,另外一条是32位掩码的主机路由
,表示主机本身
主机A首先使用arp协议向局域网内所有主机发送arp广播报文,目的mac地址为FF:FF:FF:FF:FF:FF,交换机收到该报文后,会向除了收到该arp报文的端口外的所有有效端口发送该arp报文,主机B收到后会回复该arp请求,这样的话主机A就可以顺利得到主机B的mac地址,于是使用该mac进行目地mac的填充,然后将报文发送出去
交换机收到主机A发出的报文,假设无vlan,则取出该报文的目的mac,然后检查自己的fdb表,如果查到该mac对应某个接口,则将该报文从对应接口发送出去,如果查找不到,则交换机会向除收到该报文的接口之外的所有接口都发送一份该报文,同时将该报文的源mac和收包端口写入fdb表
主机B收到该报文后,检查该报文的目的mac是不是收到报文的物理接口的地址,如果不是,则会丢弃该报文,如果是,则将该报文交给TCP/IP协议栈处理,TCP/IP协议栈首先判断该报文的目的ip是不是主机本身的ip,也是通过查询路由表,看看该ip能不能匹配到某个主机路由,若不是,则检查路由表,判断该报文是否需要转发,若是,则检查报文的协议和端口号,然后交给对应的进程处理
2、通信主机双方位于不同网络,此时需要借助路由器走三层转发
假设主机A和主机B位于不同网段的网络内,主机A需要将报文先发送到路由器,由路由器进行转发
例如主机A 192.168.1.2/24与主机B 192.168.2.2/24位于不同的网络,它们要通信,就必须要有路由器,主机A要给主机B发送报文,首先会检查目的主机ip地址,发现是不同网段的ip,首先会检查路由表,跨网段通信需要有网关路由,网关路由可以是默认网关,或者是手工配置的静态网关路由
当主机A有网关路由
时,发送前会向网关发送arp请求报文,得到网关的mac地址,然后将该报文发送给网关,网关收到报文后,也是检查目的mac和目的ip,检查目的ip时也是查询路由表,根据路由表的指示,进行转发报文,注意,网关的路由表不一定会指示目的ip在直连状态,下一跳也可能是网关自己的网关,所以报文会在这样的网关之间跳转传送,最终到达主机B的直连网关,直连网关会直接通过局域网内通信将报文转发给主机B
路由表示例:
|
|
0.0.0.0就是所谓默认网关,172.25.52.0和172.25.52.59就是所谓的直连路由,主机路由未必显示
总结:TCP/IP网络的基本结构就是小型局域网,同网段转发使用二层转发直接通信,不同网段使用三层转发借助路由器通信,其中最关键的就是路由表,其转发的优先级是:主机路由
>直连路由
>网关路由
InfiniBand网络的通信
根据维基百科,InfiniBand(直译为“无限带宽”技术,缩写为IB)是一个用于高性能计算的计算机网络通信标准,它具有极高的吞吐量和极低的延迟,用于计算机与计算机之间的数据互连。InfiniBand也用作服务器与存储系统之间的直接或交换互连,以及存储系统之间的互连,截至2014年,它是超级计算机最常用的互连技术。
所谓极高的吞吐量和极低的延迟,到底是怎么样的呢?来看看实际效果
|
|
ping的延迟不到0.04ms,写硬盘的延迟都没那么低吧?再看看带宽
|
|
带宽高达23.5Gb/s而且非常稳定,大部分场景的带宽要求都可以满足了吧,笔者环境中IB卡使用PCI-E x8通道,这种PCI-E卡有两种,一种是单卡单IB接口,另一种是单卡双IB接口,实测发现,单卡极限性能(connected模式)最高为26.6Gb/s,单卡不管是单口双口都只能跑到这个值,双口的话两个接口平均分配,每个口能跑到13.3Gb/s
INFINIBAND网络架构介绍
InfiniBand网络比起TCP/IP网路要简单一些,它的设计就是为了高性能网络,所以在很多地方都进行了简化,首先介绍一下InfiniBand的几个重要概念:
opensm
opensm是IB网络中的管理者,指的是subnet manager,整个IB网络中至少要有一个master状态的opensm,它负责告诉网络中的交换机和IB卡,哪些通信是合法的,哪些是非法的,最典型的就是它规定了哪些接口使用的pkey(稍后介绍)是合法的,凡是不在opensm中定义的pkey都是非法的pkey,使用非法pkey的接口也不能正常up,因为IB卡认为该接口使用的pkey不是合法的,这也就是为什么当两台服务器都没有安装opensm的时候无法使用IB卡直连的原因,因为没有opensm告诉它,它所使用的pkey是合法的,当两个IB卡接到同一个IB交换机后可以通信,是因为交换机中默认起了一个opensm,使得整个网络中有master的opensm,所以两个设备要直连IB卡通信,需要两个服务器上至少一个启动opensm,这里简单介绍一下opensm的配置:
|
|
配置文件显示,默认使用全部的ib报文相关字段,一般不需要修改,然后定义了两个Zone,Zone1使用0x8010这个pkey,使用ipoib方式,它相当于定义了一个subnet,这个subnet内所有的主机使用的pkey都是0x8010,这里必须要以0x80开头,是pkey的特性决定的
pkey
pkey是IB网络中至关重要的一个概念,它与以太网的vlan相对应,但是与vlan有不同,主要在如下方面:
1、vlan有access、trunk、native三种类型,而pkey只有一种,就是pkey本身
2、vlan配置之后,交换机、主机会按照协议处理vlan报文,pkey则需要opensm认可才能正常使用
3、不同pkey之间完全隔离,不存在跨pkey转发,vlan可以使用vlanif口处理后进行转发
相同pkey的一组接口位于相同的子网内,不同的pkey则不能通信,即
1、ip相同网段但是pkey不同,不能通信
2、ip不同网段但是pkey相同,显然不能通信
3、ip相同网段而且pkey相同,可以通信
子接口
设备上的接口除了lo之外,其他在默认情况下都是物理网口,不管是千兆万兆还是ib口,物理口可以进行ip、mtu等配置,而子接口指的是一些虚拟接口,它们与某个物理接口相关联,可以配置自己的ip、mtu和网关等,与普通的物理接口没有什么不同,只是在收发包的时候使用的是父接口物理口,子接口的出现主要是为了解决一些特殊问题,例如服务器物理口是不能直接接收处理带vlan标记的报文的,但是子接口可以
例如设备上有物理口eth0,我们可以配置一个名为eth0.10的子接口,这个子接口比较特别,它收发报文是通过eth0完成的,但是它能处理的报文只有vlan10的报文,其他不带vlan10的报文默认是给物理口eth0自己处理
对于IB网络来说,没有vlan的概念,局域网间只有pkey的概念,所以它的子接口是pkey相关的,下面展示如何创建一个带pkey的子接口
首先,设备上有ib0的物理ib卡
|
|
然后,我们创建一个ib0的子接口,它使用pkey为0x8010进行通信
|
|
ib0.8010就是子接口,ib0是它的父接口,对于带pkey子接口,可以创建设备文件进行管理,与普通的接口并没有什么区别:
|
|
ifup这个接口之后就可以正常使用了,此时该子接口就会使用相应的pkey进行报文通信
INFINIBAND网络中的跨网段通信
难免会有这样的需求,不同的业务使用了不同的ip地址段,在三层实现隔离,同时又希望可以跨网段访问,对于TCP/IP网络环境来说这不是什么问题,两个网段之间使用一个路由器,再在每个设备上配置网关,即可使用路由器进行通信,这样的好处是结构简单,但是缺点很明显,路由器容易出现单点故障,而且路由器的带宽往往会成为瓶颈,在InfiniBand网络中则不存在这个问题
前面是说到,相同的pkey是相同子网的标志,不同pkey的子网是禁止通信的,那真的没有办法实现通信了吗?不是的
InfiniBand网络把跨子网通信设计得很简单,任何要跨子网通信的主机,在接口上配置与目标子网一致大的pkey子接口,使用直连路由通信
真是个简单得不能再简单的想法,但是它能完美解决如下问题:
1、路由效率问题,由于所有的跨网段访问都可以通过子接口走直连路由,路由效率很高
2、路由器带宽瓶颈问题,不需要路由器进行转发,不存在路由器瓶颈
3、路由器单点问题,不需要路由器了自然也就不存在单点,某个设备跪了,其他设备一样照常跨网段,实现了高可用
可见,InfiniBand为了实现高性能,规避了不同子网访问的问题,而如果要从以太网->IB网络的转发呢?这就需要配置Ib交换机的静态路由,它可以将以太网报文路由进去InfiniBand网络,即便流进来的以太报文带有vlan,也可以实现对接,将vlan报文剥离然后加上pkey,实现转发
总结
InfiniBand网络是为高性能网络环境设计,与传统的TCP/IP网络架构和转发机制有相似之处,也有相当的改进,我们在使用中不断总结、优化过程中也得出了不少经验,它最具价值的RDMA方面的应用也在调研路上
本文链接:http://www.strugglesquirrel.com/2018/09/09/浅谈InfiniBand网络与TCP-IP网络异同/