從二層轉發層面對比下openflow和傳統交換機
二層轉發和Vlan陷阱
通常來說,物理層的一串比特位到數據鏈路層后,會被組成幀,并做檢驗和校驗——只有校驗和通過的幀才被轉發。轉發的概念對于交換機來講就是基于MAC地址的轉發,最初的二層轉發設備是僅僅基于MAC地址的,用于局域網(LAN),后來由于廣播泛濫和通信安全性的考慮,采用vlan對不同的通信域進行隔離。Vlan(虛擬局網,Virtual Local Area Network)是不是網絡上第一個網絡虛擬化的技術我不清楚,但是是我接觸到的第一個網絡虛擬化技術。
MAC地址就是每個網絡設備上的物理地址,
Vlan技術是通過對原來的報文在MAC地址頭后加入4byte的數據來識別和標志vlan,具體如下:
其中TYPE ID(簡稱TPID)例子中是0×8100,其實這個不是必須的,稍微高級點的交換芯片都支持配置,這個功能稱為Q-IN-Q;因為處于二層隧道或者vlan id不夠用的用途,可以給一個報文打上兩個vlan tag,并且兩個vlan tag的TPID可以不同,也可以相同。而對于報文能靈活刪添或修改vlan tag的功能稱之為靈活Q-IN-Q。
后面的3bit user priority用于一般稱之為COS值,用于二層QOS功能,再后面的1bit就是前面文章說的CFI(Canonical Format Indicator),為0表示該幀格式為用于802.3或EthII封裝,常用于以太網類網絡和令牌環類網絡之間,如果在以太網端口接收的幀具有CFI,那么設置為1,表示該幀不進行轉發
自從vlan技術出現后,二層轉發在交換機中便不再是僅僅基于MAC地址的學習和轉發,而是基于mac vlan的學習和轉發,下面結合BCM和MVL等芯片廠商的處理過程介紹下大致流程如下:
其實轉發的過程比較簡單,需要說明的是以下幾點:
1. 對于SMAC=DMAC的攻擊報文高級的交換芯片可配置直接丟棄;
2. Vlan tag的識別和獲取過程很復雜,后續詳細介紹;
3. SMAC Vid的查找通常可以的,但是某些芯片內部一個沒有tag的報文怎么處理?這個不同芯片處理方式不同,即使是同一個廠商的,有的是丟棄,有的是廣播,有的是可配;
4. DMAC 為0x0180c2開頭的報文主要用于一些二層協議報文,包括流控,LLDP,LACP等;
5. 交換機芯片通常進行報文單播和廣播,默認不開啟組播功能,但是從數學角度講,單播和廣播都可以看做是組播的兩個邊界值;這和物理學的很多定理類似,理論學習時推廣到通常的公式很難,但是實際上經常發生的情形卻是理論上極為簡單的幾種特殊情況;另外,如果DMAC VID 查找不到相應的表項,默認動作是廣播到除源端口外的所有端口,通常交換芯片也可以配置為丟棄、上CPU等動作。
6. 二層組播的協議主要有IGMP等,原理有很多地方可以參考,現在主要有三個版本,二層組播和三層組播的MAC和IP對應關系為:
7. 二層里報文沒有防止成環的字段,這就導致一旦鏈路有環,將會發生極其災難的事故,隨之提出STP協議來解決這個問題,但是STP協議隨著網絡規模的擴大,到100臺網絡設備的規模的時候,一旦網絡拓撲發生變化,其響應適應網絡變化的能力就會被體現的體無完膚;雖然后來提出了RSTP、MSTP等改進,但是依然跑脫不了對鏈路帶寬的浪費等缺陷,直至提出了復雜的trill協議;所以三層報文IP頭部設計的時候就考慮了TTL這個防環的字段;
8. 每個端口都有自己的MTU,當CPU通過端口發包時,在協議棧是可以對報文分片的,這個時候分片的依據是該vlan內的所有端口的最小MTU值;
9. 為了實現不同vlan的端口能相互通信,引入了端口的trunk屬性的概念,可以實現一個端口屬于多個vlan,從而實現多個vlan間的通信;這個概念是將端口分為三類:Access,trunk,hybrid;交換機所有端口默認是access口,此口出入只轉發vlan id和端口 native vlan相同的報文;trunk口時能出入轉發所有vlan id的報文,這里的所有是指交換機上已經創建的vlan,但是出去的時候如果vlan id和native id相同則刪掉TAG將報文轉出去,否則帶tag轉發出去;hybrid則是可以任意單獨配置端口所允許進入的各個vlan ID報文,以及轉出報文是否帶TAG;這個功能從數學上來講和組播類似,可以將access和trunk看成hybrid的兩個邊界值;
10. 所有端口默認所屬的vlan 是vlan1,交換機支持對端口的所屬vlan進行更改;同樣的對于二層QoS字段,對于沒有tag的報文打tag的時候賦予什么樣的COS值也是可以通過命令行來配置;
11.高級的交換芯片為了實現VLAN內部用戶的隔離,提出了私有vlan的概念,即PVALN,并將端口設置為不同的屬性,交換機端口有三種類型:Isolated port,Community port, Promiscuous port;它們分別對應不同的VLAN類型:Isolated port屬于Isolated PVLAN,Community port屬于Community PVLAN,而代表一個Private VLAN整體的是Primary VLAN,前面兩類VLAN需要和它綁定在一起,同時它還包括Promiscuous port。在Isolated PVLAN中,Isolated port只能和Promiscuous port通信,彼此不能交換流量;在Community PVLAN中,Community port不僅可以和Promiscuous port通信,而且彼此也可以交換流量。
12.同Q-IN-Q一樣,MAC地址也有MAC-IN-MAC的用途,又稱PBB-TE,技術標準是IEEE802.1Qay,主要用于運營商骨干網,關閉組播后用來解決運營商骨干鏈路維護MAC表過大、對用戶流量進行二次封裝和隔離、并能防止成環和負載不均衡的情況出現;
13.MAC學習到硬件中需要通過中斷的方式通知到CPU,這樣軟件中便可以有硬件MAC表的副本,便于顯示和查詢,以及通過ARP的概念將MAC和IP進行關聯,決定路由是否下發硬件;
14.MAC都有一個老化的過程,即一段時間內即么有SMAC為這個MAC的報文也沒有DMAC為這個MAC的報文,那么這個地址會在硬件表項中被刪除(+微信關注網絡世界),并通知上層軟件;老化時間默認300秒,這個值是可以配置的,且根據芯片支持程度而不同,一般支持范圍為60~1800秒;#p#
Vlan tag的識別和獲取是一個復雜的過程,因為涉及很多功能。下面是一個簡單的流程圖:
上面的流程中需要注意:
1. BCM和MVL的芯片處理流程少有不同,對各種vlan功能的支持程度也不太一樣;
2. 靈活Q-IN-Q是通常基于TCAM來實現,匹配內層或外層的VID,設置動作是刪除、添加或修改tag字段;
3. 二層表項的查找大部分表項是hash方式,少部分是tcam表項;
4. MAC表項的學習可以基于硬件,也可以是軟學習;硬件學習成熟的芯片是可以完全線速的,某些通過并購來研發自己芯片的廠商在這方面支持度則略顯不足;軟學習可以更靈活和安全,因為每次的學習都要經過CPU的控制,但是速率要變慢的多;
5. MAC表項的大小不同芯片也不一樣;
6. 當一個端口收到一個報文的SMAC VID已經有表項存在其他端口時,這個時候交換芯片需要根據配置判斷是否將這個地址學習到新端口上,稱之為MAC地址飄逸;這個是否飄逸的判斷也是基于一些寄存器的設置來做的;
對于二層轉發,Openflow標準中所有的表項均可以來做,匹配內容為DMAC 外層tag中的vlan ID,設置的動作為指定出端口;但是對于基于SMAC VID 的學習來說倒是不必支持的。例如一臺openflow交換機連接了十幾臺服務器,服務器需要通過二層轉發進行通信,那么所有服務器的第一個報文需要上controller,然后controller可以把報文中的SMAC VID 解析出來下發一條DMAC為該報文SMAC VID的表項,設置動作是所有該類型的報文均轉發到該端口。
Openflow標準中對于vlan tag的動作和靈活Q-IN-Q是基本類似的,也支持對MAC-IN-MAC頭部的處理:
對于靈活Q-IN-Q功能中對vlan tag的修改openflow規則可以用setfield動作來執行,并且openflow中還有strip vlan的動作來支持對vlan tag的刪除動作。
用傳統商業芯片來實現openflow來實現二層功能可以明顯看出openflow支持的動作更多些,實現也更靈活 ;但是反過來,如果用傳統的商業芯片去實現openflow的標準,可以很肯定的說,是無法完全支持最新的openflow標準的,具體的支持程度需要看各個廠家所用芯片和開發的力度。Openflow標準1.0版本就提出了對外VLAN tag處理和Q-IN-Q的支持,到1。2則豐富了對報文內外TAG的處理支持。Openflow的組播和廣播是用類型為ALL的group的概念來實現的。
隨著網絡規模的擴大和網絡虛擬化的發展,VLAN的個數成為了限制,大二層的出現,可以說是vlan有多大,虛擬機就能遷移多遠;為了解決VLAN個數不足提出了大量技術,除了原來的Q-IN-Q等,為解決云計算中等相關的需求還提出了包括VXLAN、NVGRE等新興技術,這些在后面再提及。可以說VLAN技術的出現解決了大量實際應用中的問題,并和其他網絡技術有著千絲萬縷的關聯,但是在云計算的今天為了解決VLAN個數不足的問題需要引入大量新技術來解決,這些不僅對網絡設備提出了更高的要求,而且從新技術來看都采用了封裝,這也會導致數據傳輸效率的降低,也可能隨之帶來網絡安全方面的問題。