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就是用來檢測這種情況的,用來提示管理員用來診斷和糾正錯誤。