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帧。