4 基于传输协议的发送算法
上面我们对Linux中的几种实现多网卡发送负载均衡算法进行了分析,针对这些算法的不足,这里提出另外一种发送负载均衡算法。
4.1 算法描述实现
我们知道网络传输协议有TCP和UDP两种,其中UDP是一种无连接、不可靠的传输协议。TCP是一种提供面向连接的、可靠的字节流服务,譬如一个客户机和一个服务器在彼此交换数据前要建立一个连接。一个TCP连接或者一个UDP会话的结构大致如下:
{source,dst,saddr,daddr}
其中source为源端口号,dst为目的端口号,saddr为源ip地址,daddr为目的ip地址。
基于传输协议的发送算法的主要思想是: 由目的主机号、目的主机所在子网的子网号及该会话的TCP或UDP的目的端口号共同决定某个数据包的发送接口号,此算法和MAC地址的异或算法有点类似,因为它也是一种异或计算。
下面我们约定:
(1)host为要发送数据包的目的主机号。
(2)subnet为目的主机的子网的子网号。
(3)port 为UDP或TCP连接的目的端口号。
(4)slave_cnt为绑定的接口数。
不失一般性,这里先考虑slave_cnt为4的情况,在这种情况下由上述几个条件异或并进行求余计算来共同确定发送的接口号,即进行下面的运算:
(host ^ subnet ^ port ) & (0x03) % slave_cnt ①式
上式可能的结果可能为0、1、2、3。即该算法这种情况下最多可以绑定4个网卡接口。
该算法最大程度上将不同连接的数据包从不同的接口发送,下面分几种情况讨论:
(1)对于同一个客户机的两个TCP连接,发送的接口号只与要连接的目的端口号有关。我们假设连接1和连接2的目的端口号分别为port1,port2,当port1(二进制)和port2(二进制)的最后两位不同时,上个算法的计算结果不相等,两个连接的数据流从不同的接口发送出去.
(2)对于同一个子网的不同客户机的两个TCP连接来说, 上述算法式子中的subnet相同,假设连接的目的端口号port相同。但是主机号不同。设目的主机号分别为host1和host2,当host1和host2(都是用二进制表示)的最后两位不相同时,算法公式的计算结果不相等,两个连接的数据流从不同的接口发送出去。
(3)对于不同子网的两个TCP连接来说,假定主机号和连接的目的号port号都相同,子网号不同。设连接1和连接2所在的子网号分别为subnet1和subnet2, 当两者的最后两位不相同时,算法公式的计算结果不相等,此时两个连接的数据流从不同的接口发送出去。
下面考虑有N个网卡接口的情况,在某个时间段内从第i个接口发送的连接数为 (i=1,2,….N),第i个接口发送的第j个连接的数据流为 ,则第i个网卡接口的负载是:
②式
当②式成立时,每个接口的负载绝对均衡,由于①式能够将连接尽量分配到不同的接口,所以一般情况下 = =…… ,即每个接口的连接数相等,但是每个连接的数据流量不一定相等,也就是说②式不一定成立,根据统计原理,当客户机和服务器的连接数足够大并且时间足够长时,②式是成立的。
从上面对基于传输协议的负载均衡算法分析来看,该算法不仅在网络层并且传输层都实现了各个接口的负载均衡,且保证了数据有序到达客户端问题,同时资源的利用率也很高。
5 测试结果进行验证分析
测试软件环境:RedHat9.0(内核2.4.20)
测试硬件配置环境:一台服务器(CPU: P IV 2.8G;内存: 512M;两块支持MII状态字寄存器的百兆网卡,每个有一个接口;一台客户机(配置和服务器一样);两台(一台也可)24口千兆交换机。测试软件为netpipe,利用此软件可以测试TCP 协议性能,用它依次来对轮转算法、MAC地址异或算法以及基于传输协议的发送算法的网络延时和吞吐率。这里服务器用来发送数据,客户机用来接收数据。
服务器发送方执行:
NPtcp –t –s –h 172.19.11.130 –o test.ppt –p
客户机接受方执行:
NPtcp –r –s
测试结果(测试结果为平均值)如表一所示。
从测试结果可以得出结论:由于轮转算法简单,计算量小,网络延迟也相对小,而基于传输协议的发送算法计算量相对较多,网络延时也比较大。由于这里是双机对测,即只有一个客户端,一个服务器端,所有MAC地址异或算法每次计算的结果也就唯一,只有一个接口被使用,吞吐率最小。相对来说,基于传输协议的发送算法吞吐率要大一些。
上面测试需要说明的是:测试中服务器仅配置了两块网卡,并且只有一台客户机访问服务器,当网卡接口和客户机增加时,此文介绍的基于传输协议的发送算法的优势将会很明显。在一个比较大的局域网中多个客户机和服务器建立连接对话时,采用轮转算法的同一个连接的数据包经过不同的链路传送,无序到达客户端的概率就会增加,重发的次数也增加,服务器吞吐率会降低。而基于传输协议的发送算法则不存在这样的问题,此种情况下,服务器的吞吐率相对增加。
6 结束语
Linux的bonding技术将多个网卡接口绑定在一起,使用多个接口发送数据,算法上实现了负载均衡和故障迁移与接管。它是一种不对称得负载均衡技术,目前只是研究了发送算法,接受算法还有待于进一步的研究,目前的链路技术都是将网卡接口绑定在一起来提高服务器的网络性能,但是各种实现算法包括基于传输协议的发送算法并没有考虑接口的速度,这一点有必要进一步改进。