lacp学习笔记
1 LACP协议的作用
LACP的作用是根据系统本地信息以及与对端系统动态交换的信息,自动形成链路的汇聚或解汇聚,并控制链路的报文收发状态。
没有运行LACP的聚合,称之为手工聚合,由管理员指定聚合成员,并根据端口的up/down状态来确定是否聚合。但是链路两端缺少交互,因此这种聚合可能会引起问题,例如,如果用户错误地将物理链路连接到不同的设备上或者同一设备的不能形成聚合的端口上,则系统无法发现。
聚合控制包括以下活动:
1) 检查候选链路是否能真正被聚合
2) 控制聚合组链路的增加,甚至是聚合组的创建
3) 监测链路状态,保证聚合的可用性
4) 聚合成员不可用时删除相应的聚合组链路 ,如果没有任何成员了则删除聚合组。
2 术语
只有速率和双工属性相同、端口基本配置相同、连接到同一个设备、并且对端端口也满足以上条件时,才能被动态聚合在一起。因此LACP的计算需要如下参数:
l 系统标识
参与聚合的每个系统有全局唯一标识,其值为:
系统优先级(高2字节)+MAC地址(低6字节)
l 聚合组标识
聚合组有一个全局的MAC标识,一般为聚合组中某个端口的MAC。聚合组也有一个唯一的整数标识,用来识别系统内的聚合组
l 端口标识
LAC使用的端口标识由端口优先级和端口号组成。高两位是端口优化级,低两位是端口号
l 能力集标识
标识端口和聚合组能力集(速率、双工等)。一个端口的聚合能力集由一个整数表示,也就是Key. 这有利于设备聚合能力的通信和比较,其值取决于以下几个因素:
a) 端口物理特征,如速率、双工、点对点或共享介质。
b) 网络管理员设置的配置约束
c) 高层协议使能的端口号(如网络层分配的)
d) 端口自己的特征或约束
每个端口有一个运行Key和管理key。运行key是当前活动聚合的参数组成的key,管理key是管理员配置的key值。
系统需要可以指定某条链路不能和其它链路聚合,称之为独立链路(individual link)。
聚合组同样也有管理key和运行key。key组的成员都必须有同样的运行key值。
所有的key都是16bit。非0值都为有效值
初始化时有两种可选方案
1. 所有端口都分配不同的key,这样默认都是独立的链路
2. 所有端口都分配相同的key,随时准备聚合
3 端口聚合过程
3.1 选择聚合组
端口对聚合组的选择有两种,一是由管理员指定,二是由端口自动选择。选择算法可自行实现。一般是根据端口的运行key来选择,具体算法在后面的Selection Logic中描述。
3.2 两端达成一致
本地和对端系统都同意加入聚合组后才可开始数据帧的转发。
3.3 添加到聚合组
对可以聚合的端口下发到硬件
3.4 使能收发
在双方准备好聚合之前,端口都是不转发数据报文的。端口从一个聚合组切到另一个聚合组时,需要确定之前的聚合组上没有数据发送。在新的聚合组上发送数据之前也需要通知对端。只在双方都协商好后,才开始收发数据报文。
3.5 聚合成员监测
实时监测每条链路以确保每个链路的两端仍然对链路的聚合达成一致。
3.6 解汇聚
链路事件等原因引起的端口运行key变化可能引起一个端需要从聚合组中删除。这时,先要disable数据报文的收发,然后通知对端系统,再重新选择聚合组。
4 LACP帧格式
开 启LACP协议的端口会定期发送LACPDU。发送端称为Actor, 接收端称为Partner。支持主从模式(Active/Passive),处于Active的一端可主动发送LACPDU, Passive只在对端为Active时才发送。
发送周期分为快发送和慢发送,可由管理配置。
除了周期发送,可会由事件触发发送, 如定时器超时、端口状态变化、管理员下发配置、协议报文收发等。
LACP帧格式如下:
Octets |
|
Destination Address |
6 |
Source Address |
6 |
Length/Type |
2 |
Subtype = LACP |
1 |
Version Number |
1 |
TLV_type = Actor Information |
1 |
Actor_Information_Length = 20 |
1 |
Actor_System_Priority |
2 |
Actor_System |
6 |
Actor_Key |
2 |
Actor_Port_Priority |
2 |
Actor_Port |
2 |
Actor_State |
1 |
3 Reserved |
3 |
TLV_type = Partner Information |
1 |
Partner_Information_Length = 20 |
1 |
Partner_System_Priority |
2 |
Partner_System |
6 |
Partner_Key |
2 |
Partner_Port_Priority |
2 |
Partner_Port |
2 |
Partner_State |
1 |
3 Reserved |
3 |
TLV_type = Collector Information |
1 |
Collector_Information_Length = 16 |
1 |
CollectorMaxDelay |
2 |
Reserved |
12 |
TLV_type = Terminator |
1 |
Terminator_Length = 0 |
1 |
Reserved |
50 |
FCS |
4 |
a) Destination Address(DA): 使用的是慢协议组播地址01:80:c2:00:00:02
b) Source Address(SA): 发送LACP协议报文的端口MAC地址
c) Length/Type: 慢协议类型值0x8809
d) Subtype: LACP协议子类型为0x01
e) Version Number: 标识LACP协议的版本号,目前为0x01
f) TLV_Type = Actor Information. 值为0x01
g) Actor_Information_Length: Actor的信息TLV长度,固定为0x14
h) Actor_System_Priority: Actor管理员配置的系统优化级
i) Actor_System: Actor的系统MAC地址
j) Actor_Key: Actor的运行key
k) Actor_Port_Priority: 发出此PDU的端口优先级
l) Actor_Port: 发出此PDU的端口编号
m) Actor_State: Actor的端口状态,为8bit的bit位图,编码见Figure 4.1
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
LACP_Activity |
LACP_Timeout |
Aggregation |
Synchronization |
Collecting |
Distributing |
Expired |
Defaulted |
Figure 4.1 Actor_State和Partner_State字段的比特编码
1) LACP_Activity: 端口在链路控制中的主从状态,0表示Passive, 1表示Active。
2) LACP_Timeout: 超时时间,0表示长超时,1表示短超时
3) Aggregation: 表示端口的聚合能力。 TRUE(1)表示链路是可聚合的,FALSE(0)表示链路是独立链路,不可聚合
4) Synchronization: 表示端口当前聚合是否完成。TRUE(1)表示发送的链路处于IN_SYNC状态,即端口已被分配到正确的聚合组中, FALSE(0)表示链路为OUT_OF_SYNC状态,即端口还没有选择正确的聚合组
5) Collecting: TRUE(1)表示当前链路收包enable, 否则为FALSE(0)
6) Distributing: TRUE(1)表示当前链路发包enable, 否则为FALSE(0)
7) Defaulted: TRUE(1)表示Actor使用的Partner信息来自管理员配置的默认值。FALSE(0)表示Actor使用的Partner信息来自接收的LACPDU
8) Expired: TRUE(1)表示Actor RX状态机处于超时状态,否则不在超时状态。
说明: Defaulted和Expired是作调试用.
n) Reserved: 保留
o) TLV_Type = Partner Information. 值为0x02
p) Partner _Information_Length: Partner的信息TLV长度,固定为0x14
q) Partner _System_Priority: Partner管理员配置的系统优化级
r) Partner _System: Partner的系统MAC地址
s) Partner _Key: Partner的运行key
t) Partner _Port_Priority: Partner的端口优先级
u) Partner _Port: Partner的端口编号
v) Partner _State: Actor认为的Partner状态,编码见Figure 4.1
w) Reserved: 保留
x) TLV_Type = Collector Information. 值为0x03
y) Collector_Information_Length: 端口Collector信息TLV长度,固定为0x10
z) CollectorMaxDelay: 发送端的帧从聚合解析层到MAC客户端的发送延迟,单位为10ms
aa) Reserved: 保留
bb) TLV_Type = Terminator. end of message值为0x00
cc) Terminator_Length: 使用固定值0x00
dd) Reserved: 保留
ee) FCS: 帧校验序列
5 LACP状态机
LACP由6个状态机组成,包括Receive machine, Periodic Transmission machine, Selection Logic, Mux machine, Transmit machine, Actor Churn Detection. 这6个状态机都是基于端口的,维护各个端口及其对端端口的信息,计算每个端口的聚合状态,与其它交换机交换LACP协议报文,调用聚合接口进行聚合组以及聚合成员管理。
状态机由事件驱动进行状态迁移,事件包括定时器超时、端口事件、报文收发、用户下发配置等。
状态机简要描述如下:
a) Receive machine:处理接收到的LACP协议报文,解析报文,记录对端的聚合相关信息,如果本端的状态有改变,则触发TX发送LACPDU.如果对端状态有改变则置端口为UNSELECT状态.如果接收超时,则启用默认Partner配置。
b) Periodic Transmission machine:周期发送LACPDU。根据LACP_Activity、LACP_Enable、port_enable几个值决定是否周期发送,如果双方的LACP_Activity都为FALSE则不需要发送,如果有一方的LACP_Enable或者port_enable为FALSE则不需要发送,其它情况需要发送。发送时间取决于对端的LACP_Timeout,分快速发送和慢速发送两个定时器,当Parterner要求长时间超时时,就进入慢发送状态,反之,进入快发送状态。
c) Selection Logic:作用是将处于DETACHED状态的端口选择加入一个聚合组。
d) MUX machine:根据本端端口和对端端口的SELECT状态将端口绑定或剥离聚合组(下底层驱动),根据双方的同步状态控制端口接收和发送数据功能的开启和关闭(设置端口的STP状态为Forward/Block)。
e) Transmit machine:根据其它状态机的要求,周期地处理LACPDU的发送,当LACP enable且NTT为TRUE时才发送报文,发送次数不大于3次。每次LACPDU发送完毕后,状态变量NTT应该置为FALSE
f) Actor Churn Detection:抖动检测状态机,若链路在抖动检测时间内仍不能同步则认为出现抖动。这种情况可能是设备故障或设备不支持配置。
Figure 5.1 状态机之间的关系
5.1 Receive machine
5.1.1CURRENT状态
收到LACP报文后进行CURRENT状态。
update_Selected函数判断接收的LACP报文里的以下字段(Actor_Port, Actor_Port_Priority, Actor_System, Actor_System_Priority, Actor_Key, Actor_State.Aggregation), 如果与本端口的(Partner_Oper_Port_Number, Partner_Oper_Port_Priority,Partner_Oper_System, Partner_Oper_System_Priority, Partner_Oper_Key, Partner_Oper_State.Aggregation)值不一致,则认为对端信息发生了变化,就会设置本端口为UNSELECT状态。否则,SELECT状态不变。Receive machine只能设置端口选择状态为UNSELECTED,只有Selection Logic才可以设置端口选择状态为SELECTED和STANDBY.
updateNTT函数判断是否需要发送协议报文, 根据LACP报文里的以下字段(Partner_Port, Partner _Port_Priority, Partner _System, Partner _System_Priority, Partner _Key, Partner _State.LACP_Activity, Partner_State.LACP_Timeout, Partner_State.Synchronization, Partner_State.Aggregation), 如果与本端口的(Actor_Port_Number, Actor_Port_Priority, Actor_System, Actor_System_Priority, Actor_Oper_Key, Actor_Oper_State.LACP_Activity, Actor_Oper_State.LACP_Timeout, Actor_Oper_State..Synchronization, Actor_Oper_State.Aggregation)值不一致,则认为对端所知信息已过时,需要重新告知对方,置NTT为TRUE。否则NTT值不变。
recordPDU函数记录LACPDU中的信息到本端口的Partner信息。将报文中的Actor信息(Actor_Port, Actor_Port_Priority, Actor_System, Actor_System_Priority, Actor_Key, Actor_State)作为当前的Partner运行信息(Partner_Oper_Port_Number, Partner_Oper_Port_Priority,Partner_Oper_System, Partner_Oper_System_Priority, Partner_Oper_Key, Partner_Oper_State), 除了Synchronization字段, Partner_Oper_State. Synchronization的值计算需要判断报文中的Partner信息与本地的Actor信息是否一致,即比较LACP报文里的以下字段(Partner_Port, Partner _Port_Priority, Partner _System, Partner _System_Priority, Partner _Key, Partner _State.LACP_Activity, Partner_State.LACP_Timeout, Partner_State.Synchronization, Partner_State.Aggregation), 与本端口的(Actor_Port_Number, Actor_Port_Priority, Actor_System, Actor_System_Priority, Actor_Oper_Key, Actor_Oper_State.LACP_Activity, Actor_Oper_State.LACP_Timeout, Actor_Oper_State..Synchronization, Actor_Oper_State.Aggregation)值比较,如果全部匹配且报文中的Actor_State.Synchronization为True且任何一方的LACP_Activity为True,则置Partner_Oper_State. Synchronization为TRUE, 否则置为False。对方是独立链路时(即报文中Actor_State.Aggregation为False)时认为其两者信息一致. 记录这些信息后将Actor_oper_Port_State.Defaulted置为False, 表示本端口所得的Partner信息来自协议报文,而不是管理配置的。.
启动current_while_timer定时器,超时时间取决于本端Actor_Oper_State.LACP_Timeout的值, 其为0表示长超时,超时时间为Long_Timeout_Time, 默认为20s.其值为1表示短超时,超时时间为Short_Timeout_Time,默认为1s, 此值管理员可配。
5.1.2EXPIRED状态
如果current_while_timer时间内没有收到LACPDU, 则状态机迁至EXPIRED状态。
超时后与对端同步状态置为不同步(Partner_Oper_Port_State.Synchronization=FALSE)。
为了快速地与对端取得联系,因此设置超时为短时间,即快发送(Partner_State.LACP_Timeout=Short_Timeout_Time)。
启动current_while_timer定时器,超时时间为Short_Timeout_Time。
5.1.3DEFAULTED状态
如果current_while_timer超时后仍没有收到LACPDU则进入DEFAULTED状态。
update_Default_Selected函数判断默认的Partner参数与当前Partner运行参数是否一致,不一致则设置端口为UNSELECTED。
recordDefault函数用配置管理下发的数据作为当前Partner的运行参数。这保证了即使没有协议对端存在时,聚合仍可继续运行。
由于Partner运行参数使用了管理值,因此不存在与对端不一致的情况,所以置Partner同步状态置为同步(Partner_Oper_Port_State.Synchronization=TRUE)
5.1.4PORT_DISABLED状态
如果端口的管理状态为DISABLE且BEGIN事件没有发生过,则进入PORT_DISABLED状态。
置Partner同步状态置为不同步(Partner_Oper_Port_State.Synchronization=FALSE)。
设置这个状态的原因是,当端口的物理连接不变,但操作状态变可ENABLE时,当前的选择状态保持不变,高层也不用重新计算。
如果从另外一个端口收到了同样的Actor系统ID和端口ID, 则表示物理连接发生了改变,此时要进入INITIALIZE状态。
5.1.5INITIALIZE状态
BEGIN事件发生或PORT_DISABLED状态时检查到端口物理连接发生改变,则进入INITIALIZE状态。
置端口选择状态为UNSELECTED,这样MUX状态机就会将此端口从聚合组中删除。
recordDefault函数用默认的Partner管理参数作为当前Partner运行参数。
port_moved置为FALSE。这样端口可以快速地进入PORT_DISABLE状态。
5.1.6LACP_DISABLE状态
如果端口在半双工状态下,则LACP为关闭状态,状态机迁移至LACP_DISABLE状态。此时端口为作一个独立链路参与LACP运行。
5.2 Periodic Transmission machine
5.2.1 NO_PERIODIC
初始化时,周期性发送是disabled的。当双方的LACP_Activity为Passive时,进入此状态。
5.2.2FAST_PERIODIC
快发送状态
5.2.3SLOW_PERIODIC
慢发送状态
5.2.4PERIODIC_TX
暂态。置NTT为TRUE,然后根据Partner的LACP_Timeout(Partner_Oper_Port_State.LACP_Timeout), 决定迁移至FAST_PERIODIC或者SLOW_PERIODIC。
5.3 Selection Logic
选择逻辑可以自行实现。目前应用较多的是管理员手工添加端口到聚合组。
标准推荐了一种端口自动选择聚合组的算法:
初始化时,每个端口对应一个聚合组,这样系统中的聚合组数与端口数相等。如果端口是独立链路,则端口总是选择自己的聚合器,否则,端口从可以选择的所有聚合组中选择优先级最高的,优先级最高意味着以下值最小
1) Actor的系统ID
2) Actor的操作key
3) Partner的系统ID
4) Partner的操作key
5) 链路能力集支持可聚合
然后置端口状态为SELECTED或者STANDBY。
5.4 Mux machine
以收发绑定的系统为例。
5.4.1 DETACHED状态
初始化时为此状态,此时端口不属于任何聚合组(有必要的话将其所在的端口组删除),端口收发处于禁止状态。
5.4.2 WAITING状态
如果Selection Logic设置端口状态为SELECTED或者STANDBY,则从DETACHEd状态迁移至WAITING状态。在此状态会启动wait_while_timer定时器。
WAITING状态存在的意义:
1) 如果选择状态为SELECTED, wait_while_timer会强制延时一会,以以其它端口的重配置同时进行。wait_while_timer超时且其它汇聚到此聚合组的所有端口都超时后,端口汇聚到此聚合组的处理就可以开始进行了。状态机迁移到ATTACHED状态.
2) 如果选择状态为STANDBY, 则端口在端口选择参数变化时,会保持在WAITING状态一段时间,以使端口选择状态重新评估。如果选择状态变成了UNSELECTED,则端口重新进入DETACHED状态。如果端口状态变成了SELECTED,则执行1)描述的操作。这样做的好处是可以让端口选择状态变成SELECTED时经过最小的延迟。
5.4.3ATTACHED状态
将端口加到聚合组中,完成此操作后,置Actor同步状态为TRUE,此时仍禁止端口收发数据报文。
5.4.4COLLECTING_DISTRIBUTING状态
在ATTACHED状态时,如果Partner的Sync也为TRUE,则会进入到COLLECTING_DISTRIBUTING状态,此状态端口收发数据报文变为enable。
在此状态期间,如果端口选择状态变为UNSELECTED或者STANDBY,或者Partner的Sync变为FALSE,则选择至ATTACHED状态。
5.5 Transmit machine
当LACP_Enable为TRUE, 且NTT为TRUE时Transmit状态机构造正确的LACPDU并且发送出去。发送后NTT置为FALSE。一个快发送周期内发送的报文数不能超过3.如果超过了,则要等到此限制被解除的时候再发送,且发送时的报文是根据实时状态来构造的,而不是首次置NTT时候的状态。也就是说,非队列式的发送,而是根据发送时机的发送。
LACP_Enable为FALSE时,不发送协议报文。
5.6 Churn Detection machine
此状态机是作为诊断功能用的。当两端长时间达不到一致时,意味着设置故障或设备未按照标准协议运行或配置错误。还有可能是系统一端或两端的聚合限制导致的,Churn Detection machine就是用来检测这种情况的,用来提示管理员用来诊断和纠正错误。
posted on 2013-11-12 15:12 jianglili 阅读(4725) 评论(1) 编辑 收藏 举报