链路聚合负载分担方式
背景
在使用Eth-Trunk转发数据时,由于聚合组两端设备之间有多条物理链路,可能会产生同一数据流的第一个数据帧在一条物理链路上传输,而第二个数据帧在另外一条物理链路上传输的情况。这样一来同一数据流的第二个数据帧就有可能比第一个数据帧先到达对端设备,从而产生接收数据包乱序的情况。
为了避免这种情况的发生,Eth-Trunk采用逐流负载分担的机制,把数据帧中的地址通过HASH算法生成HASH-KEY值,然后根据这个数值在Eth-Trunk转发表中寻找对应的出接口,不同的MAC或IP地址HASH得出的HASH-KEY值不同,从而出接口也就不同,这样既保证了同一数据流的帧在同一条物理链路转发,又实现了流量在聚合组内各物理链路上的负载分担。逐流负载分担能保证包的顺序,但不能保证带宽利用率。
转发原理
如图3-8所示,Eth-Trunk位于MAC与LLC子层之间,属于数据链路层。
Eth-Trunk模块内部维护一张转发表,这张表由以下两项组成。
HASH-KEY值
HASH-KEY值是根据数据包的MAC地址或IP地址等,经HASH算法计算得出。
接口号
Eth-Trunk转发表表项分布和设备每个Eth-Trunk支持加入的成员接口数量相关,不同的HASH-KEY值对应不同的出接口。
例如,某设备每Eth-Trunk支持最大加入接口数为8个,将接口1、2、3、4捆绑为一个Eth-Trunk接口,此时生成的转发表如图3-9所示。其中HASH-KEY值为0、1、2、3、4、5、6、7,对应的出接口号分别为1、2、3、4、1、2、3、4。
Eth-Trunk模块根据转发表转发数据帧的过程如下:
Eth-Trunk模块从MAC子层接收到一个数据帧后,根据负载分担方式提取数据帧的源MAC地址/IP地址或目的MAC地址/IP地址。
根据HASH算法进行计算,得到HASH-KEY值。
Eth-Trunk模块根据HASH-KEY值在转发表中查找对应的接口,把数据帧从该接口发送出去。
负载分担方式
用户可以根据流量模型设置不同的负载分担方式,流量中某个参数变化越频繁,选择对应负载分担方式的流量就越均衡。例如,在网络中,如果报文的IP地址变化较频繁,那么选择基于目的IP地址、源IP地址或源IP和目的IP地址的负载分担模式更有利于流量在各物理链路间合理的负载分担;如果报文的MAC地址变化较频繁,IP地址比较固定,那么选择基于目的MAC地址、源MAC地址或源MAC和目的MAC地址的负载分担模式更有利于流量在各物理链路间合理的负载分担。
交换机可以基于报文的以下参数进行负载分担:
- 源MAC地址
- 目的MAC地址
- 源MAC地址和目的MAC地址
- 源IP地址
- 目的IP地址
- 源IP地址和目的IP地址
例如,DeviceA的一条TCP报文流的源IP地址为192.168.1.1(MAC地址:a-a-a,源端口号:50),目的IP地址为172.16.1.1(MAC地址:b-b-b,目的端口号:2000),另一条TCP报文流的源IP地址为192.168.1.1(MAC地址:a-a-a,源端口号:60),目的IP地址为10.1.1.1(MAC地址:c-c-c,目的端口号:2000)。如果在DeviceA上配置基于报文的源MAC地址进行负载分担,则报文出接口仅有1个;如果在DeviceA上配置基于报文的目的IP地址进行负载分担,则报文出接口有两个,去往不同目的IP的报文会从不同的出接口转发。
配置负载分担方式时,请注意:
- 负载分担方式只在流量的出接口上生效,如果发现各入接口的流量不均衡,请修改上行出接口的负载分担方式。
- 尽量将数据流通过负载分担在所有活动链路上传输,避免数据流仅在一条链路上传输,造成流量拥堵,影响业务正常运行。
例如,数据报文的目的MAC和IP地址只有一个,则应选择根据报文的源MAC和IP地址进行负载分担,如果选择根据报文的目的MAC和IP地址进行负载分担则会造成流量只在一条链路上传输,造成流量拥堵。