交換晶片二(L2轉發原理)
對於交換晶片來說,L2轉發是一個最基本的功能。L2功能主要包括ingress過濾、MAC學習和老化、根據MAC+VLAN轉發、廣播與洪泛、生成樹控制等基本功能。
L2轉發的具體流程如圖3所示:
從埠進入交換晶片的包首先檢查TAG,對於tagged包,判斷是否是802.1p的包,(802.1p的包vid為0),對於untagged的包和802.1p的包,根據系統配置加上tag(這些配置包括:基於MAC的vlan、基於子網的vlan、基於協議的vlan和基於埠的vlan)。經過這一步以後,到交換晶片內部的包都變成802.1Q的tagged包了(vid為1-4094,4095保留),如果設定了ingress過濾,就會檢查本埠是否在該vid對應的VLAN中,對於本埠不在該vid對應的VLAN中的包就丟棄。對於沒有設定ingress過濾,或者設定ingress過濾但本埠在該vid對應的VLAN中的包進行STP埠狀態檢查,對於BPDU以外的包,只有埠處於forwarding狀態,才允許包進入。然後進行源MAC地址檢查,以原MAC+VID的雜湊為索引查詢L2 TABLE,如果沒有找到,就把這個表項(原MAC+VID)以及對應的埠寫到L2 TABLE中,這個過程稱為MAC地址學習。當然地址學習的方法有很多種,可以是硬體學習,也可以是軟體學習,可以根據PORT表中的CMI欄位的配置來進行。
圖3 L2轉發流程
下一步進行目的MAC地址檢查:目的MAC地址為廣播地址(0xffffffff)的包,在vlan內廣播出去;目的MAC地址為組播地址的包,進行組播流程的處理;對於單播包,查詢L2 TABLE,如果沒有找到,就在vlan內進行洪泛;如果找到,檢查表項中的L3 bit是否設定,如果設定了L3 bit,就進行L3流程的轉發;否則就轉發到L2 TABLE表項中的埠去,在egress方向,也有egress過濾設定(預設是使能的),如果egress埠不在vlan中也是不能轉發的。至此,L2轉發流程完成了。與地址學習相反的過程是地址老化。地址老化的機制是:ASIC內部有個定時器,稱為age timer,命令列可以對這個暫存器進行設定,每次查詢L2 TABLE時(包括原地址查詢和目的地址查詢,可以配置),如果命中,就會設定hit標誌。當老化時間到後,ASIC把hit標誌清除,當下一個老化時間到後,ASIC把hit為0的地址設定為無效,這就是為什麼實際地址老化的時間為1~2倍agingTime的原因。
2.2 L2轉發相關的表項
2.2.1 port表
圖4 port表
Port表是一個非常重要的表,有很多與埠相關的控制都在這裡設定。每個埠對應一個表項,按埠號進行索引。下面介紹一下重要的設定:
1) PVID:設定PORT_VID
2) 預設優先順序:設定PORT_PRI
3) 流分類使能:設定FILTER_ENABLE
4) VLAN轉換使能:設定VT_ENABLE和VT_MISS_DROP
5) Ingress過濾使能:設定EN_IFILTER
6) 信任COS還是信任DSCP:對於IPV4:TRUST_DSCP_V4=0:信任COS;
TRUST_DSCP_V4=1:信任DSCP,對於IPV6:同樣設定TRUST_DSCP_V6。
7) Ingress方向mirror使能:設定MIRROR
8) MAC地址學習方式:設定CML
9) IP組播是否使用VLAN資訊:設定IPMC_DO_VLAN
10) L3轉發使能:設定V4L3_ENABLE和V6L3_ENABLE
11) 是否丟棄BPDU:設定DROP_BPDU
12) 控制是否轉發帶tag和不帶tag的包:設定PORT_DIS_TAG和PORT_DIS_UNTAG
13) Pause幀控制:設定PASS_CONTROL_FRAMES
14) 基於子網的VLAN使能:設定SUBNET_BASED_VID_ENABLE
15) 基於MAC的VLAN使能:設定MAC_BASED_VID_ENABLE
16) 設定堆疊口:HIGIG_PACKET
17) 設定NNI口:NNI_PORT
18) 修改優先順序使能:MAP_TAG_PACKET_PRIORITY
19) 堆疊口modid設定:MY_MODID 【什麼叫堆疊口?】
20) Out tpid設定:OUTER_TPID
21) 基於MAC和基於子網的VLAN優先順序設定:VLAN_PRECEDENCE
22) 是否允許單臂橋功能:PORT_BRIDGE
23) IP組播點陣圖設定:IGNORE_IPMC_L2_BITMAP和IGNORE_IPMC_L3_BITMAP
2.2.2 egress port表
圖5 egress port表
EGR_PORT是一組暫存器,每個埠一個,用於EGRESS方向的控制,有幾個重要設定介紹如下:
1) 設定egress埠型別:PORT_TYPE=0,UNI埠;PORT_TYPE=1,NNI埠
2) 設定egress過濾:EN_EFILTER=1
2.2.3 L2地址表
圖6 L2地址表
56504的L2地址表大小為16K,5630X的L2地址表大小為8K,地址表使用MAC+VID的hash值作為索引查表。實際上56504的L2地址表hash值為4K,每個hash值對應4條地址,這樣最多可以儲存4條hash衝突的地址。地址表中每個表項都儲存了MAC_ADDR和VLAN_ID。MAC學習的時候使用原MAC+VID的hash查表,把表中的MAC+VID與包中的MAC+VID進行比較,如果完全相等,表示找到了。然後看埠(TGID_PORT)是否相等,如果不相等表示地址發生了遷移,對於動態學習的地址需要更新port;如果相等表示命中,更新hit標誌。其他幾個重要的功能介紹如下:
1) 設定靜態地址:STATIC_BIT=1
2) 設定L3轉發標誌:L3=1
3) 設定本地址的包都轉發到CPU去:CPU=1
4) 設定本地址匹配的包丟棄:SRC_DISCARD=1、DST_DISCARD=1
5) 設定本地址匹配的包對某些埠阻塞:MAC_BLOCK_INDEX
6) 設定本地址匹配的包映象:MIRROR=1
7) 設定組播索引:L2MC_PTR
8) 地址有效標誌:VALID=1
2.2.3 VLAN表
Vlan表分為ingress和egress兩個部分,分別對應入口控制和出口控制。
圖7 ingress vlan表
Ingress Vlan表中主要包含了埠列表,用於ingress filter功能。PFM是用於控制組播洪泛的開關。PFM=0,組播在vlan內洪泛;PFM=1,註冊的組播按組播錶轉發,未註冊的組播在vlan內洪泛;PFM=2,註冊的組播按組播錶轉發,未註冊的組播丟棄。STG用於標識本vlan所屬的生成樹組。
圖8 egress vlan表
Egress vlan表中除了PFM和STG外,還包含了出口方向的埠點陣圖,以及哪些埠以untag的方式傳送本vlan的包。