FC擁有自己的獨立層次結構,FC-0到FC-4對應OSI模型的1-5層,但也並非一一對應,完整協議內容請大家自行查閱標准文檔。其中FC-2定義了數據通信的內容,是與網絡方面息息相關的,下面介紹的內容也都是以FC-2為主。
在FC網絡中一共有三種主要的接口角色,NPort,FPort和EPort,其中N是服務器或存儲等終端節點連接FC網絡的的接口,F是FC交換機設備連接服務器或存儲等終端節點的接口,E是FC交換機互聯接口。
FC設備都擁有2個重要標識:
WWN(World Wide Name):64bit,節點和每個接口都有各自固定的WWN且所有的WWN均是唯一的,WWN的作用是為了身份識別和安全控制,有些類似於MAC,但不做轉發尋址使用。 FC ID:24bit,由8個bit的Domain ID,8bit的Area ID和8bit的Port ID組成,每個Domain ID代表一台FC Switch(由此可以算出每個FC網絡最多支持256個Switch節點,減去部分保留ID,實際能夠支持最多239個Switch)。終端節點的FC ID是基於接口的,每個NPort的FC ID是由直連的FC Switch動態分配。FC ID的主要作用就是供數據報文在FC網絡中尋址轉發。
WWN(World Wide Name):64bit,節點和每個接口都有各自固定的WWN且所有的WWN均是唯一的,WWN的作用是為了身份識別和安全控制,有些類似於MAC,但不做轉發尋址使用。 FC ID:24bit,由8個bit的Domain ID,8bit的Area ID和8bit的Port ID組成,每個Domain ID代表一台FC Switch(由此可以算出每個FC網絡最多支持256個Switch節點,減去部分保留ID,實際能夠支持最多239個Switch)。終端節點的FC ID是基於接口的,每個NPort的FC ID是由直連的FC Switch動態分配。FC ID的主要作用就是供數據報文在FC網絡中尋址轉發。
有了標識的Tag,那么就需要個動態協議供FC Switch互相學習了,FC網絡使用FSPF(Fabric Shortest Path First)進行FC ID的尋址學習,看名字就知道其協議機制和OSPF沒有什么大的區別。
FC技術體系還有最重要的一個關鍵流控技術Buffer to Buffer Credits用來確保無丟包轉發。BB Credits和TCP滑動窗口相似,規則很簡單,兩個相鄰FC節點在連接初始化的時候先協商一個度量收包設備Buffer大小的數值N出來,發包設備每發一個數據報文就做N-1,收包設備每收一個報文就回一個R_RDY報文回來,發包設備每收到一個R_RDY就做N+1,當N=0時,發包設備就停止發包。這樣當突發擁塞時,上游設備們都把報文存在本地緩存中等着,下游有空間時再發,可以最簡單的避免丟包。BB Credits是以報文數目衡量buffer能力,與報文長度無關(FC報文最大長度2112Byte)。
FC設備(一般指服務器,稱為Initiator)在傳輸數據之前需要進行兩步注冊動作,NPort
先通過FLOGI(Fabric Login)注冊到最近的Fabric交換機上,獲取FC ID及其他一些服務參
數並初始化BB Credits。然后再通過PLOGI(Port Login)注冊到遠端的目的設備(一般指存
儲,稱為Target)的NPort上建立連接,並在P2P直連的拓撲下初始化BB Credits。
FC從標准建立伊始就開始被研究跨傳統TCP/IP/Ethernet網絡傳播,目前主要有iSCSI(IP SAN)、FCIP、iFCP和FCoE四條道路。其中FCIP和iFCP應用最少,iSCSI緩慢增長,FCoE后來居上。
SCSI也做過一些研究,后面有專門文章。FCP(Fibre Channel Protocol)是用來協助SCSI進行尋址的協議。iSCSI、FCIP和iFCP都是依靠TCP的可靠連接確保無丟包,但封的報頭多了開銷很大。iSCSI由於需要全新的存儲設備支持,過於激進,目前雖然有發展,但是受傳統存儲設備廠商制約始終很緩慢。FCIP和iFCP都是支持FC網絡跨IP核心網傳輸時用到的網絡協議,由於目前SAN還是本地組網或使用光纖直連方式的遠程組網較多,此場景並不多見,因此也應用很少,其中FCIP已經成為RFC,而iFCP止步於Draft。FCoE相比較來說對上層協議改動較少,開銷較低,且有利於減少服務器網絡接口數量,在傳統交換機廠商的大力鼓吹下當前發展最為迅猛,數據中心網絡畢竟會是交換機的天下。
FCoE基於FC模型而來,仍然使用FSPF和WWN/FC ID等FC的尋址與封裝技術,只是在外層新增加了FCoE報頭和Ethernet報頭封裝和相應的尋址動作,可以理解為類似IP和Ethernet的關系。
看一下FCoE的幀結構:
尋址稍微說一下,FCoE使用FIP(FCoE Initialization Protocol)進行初始化連接,FIP運行於VFPort和VNPort之間或VEPort之間,所謂的V就是前面介紹FC的接口角色中的名稱前面加了個Virtual。
FCoE使用FIP(FCoE Initialization Protocol)進行初始化連接,FIP運行於VFPort和VNPort之間或VEPort之間,所謂的V就是前面介紹FC的接口角色中的名稱前面加了個Virtual。FIP在接口使能后一共做了三件事:
1. FIP VLAN Discovery 過程
FIP VLAN Discovery 過程用於發現 FIP 協議以及后來的 FCoE 中使用的 FCoE VLAN 。
ENode 首先向一個所謂的 All-FCF-MACs 的 MAC 地址發送 FIP VLAN Discovery Request 。本地 VLAN 上的所有的 FCFs (Fibre Channel Forwarder) 都會監聽這個 MAC 地址,並對該地址上的 FIP VLAN Discovery 進行響應, 向 ENode 發送 ENode 可以進行 VN_Port Login 的 FCoE VLAN 。
FIP VLAN Discovery 是一個可選的步驟,它的作用僅僅是告訴 ENode 可用的 VLAN, 但並不會引發 ENode 對 VLAN 進行選擇。
2. FIP FCF Discovery
FIP FCF Discovery 用於發現那些 FCFs 可以接受 ENodes 的 LOGIN。 FCFs 會定時地向 FCoE VLAN 上的 ALL-ENode-MACS 發送 FIP FCF Discovery Advertisement 。 All-ENode-MACs 與前面的 All_FCF-MACs 對應,該地址被所有的 ENodes 監聽。 這些 Advertisement 中包含了 FCF 的 MAC 地址,以及一些建立鏈接所需的其他參數。
FCF 會定時的發送這些 Advertisement,然而對於新添加的 ENodes 來講, 這些 ENodes 一般不願意在啟動之后傻等着“收看廣告”,對此,ENode 可以向 All-FCF-MACs 發送 solicit unicast Advertisement 。FCFs 在接收到這個單播之后,會向發送的 ENode 發送一個 unicast FIP FCF Discovery Advertisement。
ENode 在收集到了足夠的信息之后,就可以決定和哪一個 FCF 建立連接了。
3. FIP FLOGI 以及 FDISC
ENode 在發現了所有的 FCFs 並選了了待 Login 的 FCF 之后, FIP 過程最后的一步就是通知所選擇的 FCF: 我要和你的 VF_Port 建立虛擬連接了! 這個過程中可能會涉及到多個 FIP 數據包,並最終為 N_Port 分配 FC_ID。
FIP 協議交互和虛擬鏈接的建立一般來講,這兩個協議的發起者都是 Initiator, 但某些情況下, FCFs 也可能會主動發送一些廣播信息。圖中,紅色部分采用的是 FIP 協議,而綠色部分,則是建立鏈接以后,使用的是 FCoE 協議。
FIP幀格式:
FCF(Fibre Channel Forwarder)是FCoE里面重要的角色,可以是軟件或者芯片硬件實現,需要占用Domain ID,處理FCoE交換機中所有與FC相關的工作,如封裝解封裝和FLOGI等。
Enode是指網絡中所有以FCoE形式轉發報文的節點設備,可以是服務器CAN網卡、FCoE交換機和支持FCoE的存儲設備。FCoE外層封裝的Ethernet報頭中MAC地址在Enode間是逐跳的,而FC ID才是端到端的。
下圖是一個 ENode 的 VN_Port 與 FCFs 的 VF_Port 的鏈接示意圖:
FCoE VN_Port to VF_Port Example
圖中,藍色的實線表示 Ethernet 連接,綠色的實線表示 Fibre Chanle連接,而紅色的虛線則表示虛擬的 VN_Port 和 VF_Port 的連接。每個 ENode 和 FCF 都有唯一的一條網線接入 Ethernet, 而在這些 Ethernet 連接之上,則可以虛擬出多個 VN_Port 與 VF_Port 的連接。
VE_Port to VE_Port Virtual Links :
圖中線條顏色的含義與前面的圖類似,不過紅色的虛線在這里表示了 VE_Port 和 VE_Port 之間的虛擬鏈接。 從圖中可以看出,每個 FCF 可以擁有多個 VE_Port,通過 Ethernet 連接,實現了多個 VE_Port 的虛擬鏈接。
從前面的兩附圖可以看出:
- 一個 ENode 可以通過一個無損 EtherNet 與多個 FCF 建立虛擬鏈接。
- 一個 FCF 可以通過一個無損 Ethernet 與多個 Enode 建立虛擬鏈接。
- 一個 FCF 可以通過無損 Ethernet 與多個其他的 FCF 建立虛擬鏈接。
ENode 模型如下圖所示:
ENode Model
對於每一個 NIC,都對應惟一的一個 FCoE Controller, Linux 中, 當為指定的網卡創建 FCoE 實例的時候,會自動創建響應的 FCoE Controller 。
FCoE Controller 的主要作用包括:
- 發起 FIP VLAN Discovery 以搜索可用的 VLANs (可選);
- 對 FCF 發起 FIP discovery 以所搜該 FCF 上可用的 VF_Port。
- 向 FCF 發起 FIP FLOGI Exchange , 如果該 FLOGI 成功,則還需要 VN_Port/FCoE_LEP 對。
- 發起 FIP NPIV FDISC Exchange (可選)。
- 當需要顯示的從 FCF 中 Logout 時候,發起 FIP LOGO Exchanges。
- 當 VN_Port 從 FCF 中 logout 后,反實例化 VN_Port/FCoE_LEP (也就是刪除響應的數據結構等等)。
- 收到 FIP Clear Virtual Link 請求的時候,反實例化 VN_Port/FCoE_LEP 。
- 后台發送 FIP Keep Alive 。
- 監視 VN_Port/FCoE_LEP 的狀態;
- 監視 FCF 上的 VF_Port 狀態。
FCoE 網卡需要能夠與多個VF_Port 進行FIP交互,發送FLOGI 和 FDISC 幀。FCoE_LET 的作用就是將FC幀封裝為FCoE幀,將接收到的FCoE 幀 解封裝為FC幀。