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个网卡接口的负载是:
②式
当②式成立时,每个接口的负载绝对均衡,由于①式能够将连接尽量分配到不同的接口,所以一般情况下 = =…… ,即每个接口的连接数相等,但是每个连接的数据流量不一定相等,也就是说②式不一定成立,根据统计原理,当客户机和服务器的连接数足够大并且时间足够长时,②式是成立的。
从上面对基于传输协议的负载均衡算法分析来看,该算法不仅在网络层并且传输层都实现了各个接口的负载均衡,且保证了数据有序到达客户端问题,同时资源的利用率也很高。