数据存储技术概述(二)——存储协议(SCSI、SAS、FC、iSCSI、NVMe)

2026年01月23日/ 浏览 6

存储协议连接主机与存储设备,负责主机与存储设备之间的通信及数据交互。目前,计算机存储架构主要采用存储块协议,按照固定数据块大小的倍数对存储设备进行数据访问。典型的存储块协议包括SCSI协议和NVMe协议。根据主机与存储设备的通信链路类型,上述典型存储协议可扩展为基于不同承载链路的专用存储协议。

SCSI协议

SCSI协议是一种实现主机和周边设备连接和数据传输的标准集合,至今已经历了三代的迭代演化,分别命名为SCSI-1、SCSI-2以及SCSI-3。SCSI协议是一种点对点的接口协议,支持多主机、多周边设备的点对点连接。SCSI协议定义了主机和周边设备数据交互所需的指令集、通信协议、电气模型及通信接口等。SCSI协议理论上支持主机与任意设备之间的通信和数据交互,但出于商业考虑,SCSI协议主要应用于存储设备的通信和数据交互。

SCSI服务模型

SCSI的通信服务过程符合传统的C/S(Client/Server)模型。客户端作为启发器(Initiator)向服务器的目标设备(Target)发起请求指令,并等待目标设备反馈响应信息,最终建立“请求/响应”模型。

基于SCSI协议的基础分布式服务模型

SCSI协议支持多主机多设备的点对点通信,因此,SCSI服务模型可进一步扩展为客户端/服务器模型。

SCSI启发器设备提供多个应用客户端,SCSI目标设备提供多个逻辑单元,每个逻辑单元内部包含设备服务器(Device Server)和任务管理器(Task Manager)。具体服务过程如下:

第一步,应用客户端将设备服务请求或任务管理请求封装为过程调用;

第二步,应用客户端向SCSI目标设备的某一逻辑单元发送该设备服务请求或任务管理请求;

第三步,SCSI目标设备的逻辑单元接收请求并实现指令处理或任务管理;

第四步,SCSI目标设备的逻辑单元向应用客户端发送设备服务响应或任务管理响应。

SCSI链路承载协议

SAS协议

SAS协议是一种点对点的串行SCSI技术,采用标准的SCSI指令集并兼容SATA设备。SAS协议通过在两个通信设备之间建立专用链路的方式实现更高效的通信和数据交互,从而避免了传统SCSI协议并行总线链路导致的通信链路状态判断过程,进而提高数据在专有通路上的传输带宽。

和传统SCSI比起来,SAS在接口速度上得到显著提升,而且由于使用串行线缆,可以实现更长的连接距离,提高抗干扰能力。

FC协议

在介绍FC协议之前,我们需要先了解SAN(Storage Area Network,存储局域网络)。

SAN是一种以网络为中心的数据存储架构,通过网络实现外接存储设备与服务器的互连,从而构建一个网络化存储系统。早期的SAN主要采用FC作为连接载体,因此,基于FC的SCSI承载协议出现了,即FC协议。

FC协议应用于网络存储,目前FC网络支持3种拓扑结构,分别是点对点(Point to Point)网络、仲裁环(Arbitrated Loop)网络、交换式光纤(Switched Fabric)网络。

FC网络拓扑

iSCSI协议

SCSI除了可以在FC上进行映射之外,还可以实现基于TCP/IP网络的映射。

iSCSI协议是基于TCP/IP网络传输的SCSI协议,通过以太网实现设备互连。iSCSI协议采用C/S架构,客户端是iSCSI启发器,通常部署在主机侧,服务器是iSCSI目标设备,通常部署在存储设备侧。

基于iSCSI协议的通信过程如下:启发器在接收到SCSI客户端的SCSI指令后,将其封装成iSCSI报文并通过以太网发送给iSCSI目标设备;然后,iSCSI目标设备收到iSCSI报文,解析出SCSI指令后执行,并把执行结果封装成iSCSI报文返回给iSCSI启发器,iSCSI启发器再把执行结果提交给SCSI客户端。

iSCSI协议层次结构

由于iSCSI协议的承载链路是以太网,iSCSI的PDU(Protocol Data Unit,协议数据单元)被封装为TCP报文的数据部分,从而通过TCP/IP实现报文收发。

目前,iSCSI协议已被各大存储厂商和服务器操作系统所支持,其主要原因在于,一方面,以太网良好的兼容性和组网能力为iSCSI协议提供了基础链路保障;另一方面,TCP/IP的高度可扩展性使得iSCSI协议可快速应用于传输网络,从而以较低的成本实现数据远程传输。

NVMe协议

NVMe协议是一种为SSD定义的存储访问和传输的协议。随着SSD介质的发展,介质访问延迟大大降低,传统SATA协议、SAS协议在链路、协议栈和软件栈上的开销占比更高,NVMe协议的出现正是为了解决传统协议不适用于高速存储介质这一问题。

NVMe协议使用PCI-e总线访问SSD。一方面,存储中的数据通过高速总线与CPU直连,有效降低控制器和软件接口的延迟;另一方面,不同于传统的单个指令队列机制,PCI-e总线支持数以万计的并行指令队列。NVMe协议定义了一套高效的指令交互机制,并适应以中断或轮询模式运行的操作系统设备驱动程序,以实现更高的性能。

随着市场大量的应用,NVMe over PCI-e接口协议被NVMe标准组织进行了标准化,以满足各制造厂商的兼容诉求。NVMe协议利用了各种计算环境中的非易失性存储器。

NVMe协议规范

在NVMe协议标准的多项技术中,多队列技术是提升NVMe性能的一个核心方法。通过多队列技术,NVMe可以按照任务、调度优先级及CPU核负载等管理和分配不同的队列,实现存储系统的高性能访问。

一个NVMe控制器支持一个Admin队列和65535个I/O队列,每个队列最大支持65535个指令(称为队列深度,或未完成指令的数量)。而在SATA和SAS中,单个队列分别支持32个和256个指令。NVMe队列深度的设计,增加了计算机与存储设备的通路,从而大幅提升SSD的IOPS能力。

NVMe over PCIe

NVMe over PCI-e指令交互过程,包括8个步骤。

①主机软件(即驱动软件)提交一个或多个指令到SQ尾部指针指向的SQ条目中。

②主机软件将更新后的SQ尾部指针写入该SQ对应的Doorbell寄存器,通知NVMe控制器新I/O的产生。

③NVMe控制器从SQ头部位置取走若干指令进行执行,可以通过多种算法实现取指令,例如Round Robin算法、带优先级权重的Round Robin算法等。

④执行指令。读写数据一般使用PCI-e设备上的DMA(Direct Memory Access,直接内存访问)引擎。

⑤NVMe控制器将指令完成结果写入对应的CQ尾部指针指向的CQ条目中。

⑥NVMe控制器产生MSI/MSI-X中断通知主机软件。

⑦主机软件从CQ头部位置取走指令完成结果。

⑧将更新后的CQ头部写入CQ对应的Doorbell寄存器,通知NVMe控制器释放CQ条目。

可以看出,对于主机而言,只需要提交指令到SQ,并处理CQ中的指令完成结果,其他由NVMe控制器自动完成,主机软件可以非常简单地实现上述功能。

NVMe over PCIe指令交互过程

在Linux内核中,NVMe驱动可以直接对接块层,省去SCSI层的软件开销。同时,由于NVMe协议支持多队列,可以更好地利用CPU多核,减少I/O路径上的资源竞争,极大提升IOPS和降低延迟。

NVMe over Fabrics

随着SSD介质的发展,本地NVMe SSD性能得到极大提升,但是传统基于SCSI的SAN网络仍然使用SCSI体系的FC、iSCSI协议。这意味着主机侧仍然在使用SCSI协议,无法充分利用NVMe并发高、命令精简的优势。因此存储业界在2016年发展出了NVMe over Fabrics(NVMe-oF)协议,将NVMe承载到网络中,拉远并完全兼容NVMe体系结构,不需要NVMe到SCSI的转换,以此大幅提升存储访问性能。

NVMe over Fabrics支持多种传输协议,包括RDMA、FC、TCP网络。

NVMe over RDMA包括RoCE、IB和iWARP。NVMe over RoCE基于融合以太网的RDMA技术承载NVMe协议。NVMe over RDMA协议比较简单,直接把NVMe的I/O队列映射到RDMA QP(Queue-Pair,队列对)连接,通过RDMA SEND、RDMA WRITE、RDMA READ三个语义实现I/O交互。NVMe over FC协议标准为FC-NVMe,FC-NVMe和FC-SCSI同样都基于FCP, I/O交互基于Exchange。FC-NVMe能最大化继承传统的FC网络,复用网络基础设施,基于FC物理网络发挥NVMe新协议的优势。NVMe over TCP基于现有的IP网络,采用TCP传输NVMe,实现在网络基础设施不变情况下的端到端NVMe。支持TCP之后意味着NVMe体系已经与SCSI完全对等,适应几乎所有网络。NVMe over TCP支持Linux系统原生的标准TCP网络协议栈,无须对系统的硬件设施和软件做任何修改。

picture loss