NVMe通过TCP网络传输在2018年的技术提议TP 8000中提出,在2019年成为NVMe-oF 1.1协议标准的一部分。
和RDMA协议相比,使用TCP协议会带来远高于本地PCIe访问的网络延迟,使得NVMe协议低延迟的目标遭到破坏。不过,在NVMe虚拟化实现的前提下,NVMe-oF Target端并不一定需要真实的NVMe设备,可以是由分布式系统虚拟出来的一个虚拟NVMe设备,未必继承物理NVMe设备的高性能的属性。在这一前提下,使用低速的TCP协议也未尝不可。
此外,虽然TCP协议在很大程度上会降低性能,但是TCP也可以使用offloading,或者使用Smart NIC、FPGA。那么潜在的性能损失,可以得到一定的弥补。
在存储协议栈中,NVMe驱动层位于块层以下。NVMe指令通过不同的传输类型发送给不同的目标端,其中可以通过FC/TCP/RDMA,即NVMe-oF,发送给非本机的设备。
在NVMe-oF的协议栈中,NVMe的接口及指令位于最上层,此层是NVMe的通用实现,NVMe/PCI及NVMe-oF均需支持上层的接口实现及指令传输。
NVMe-oF由于需要支持远端传输,因而对传输数据类型的封装及设备发现连接等进行了定义,FC/TCP/RDMA均需支持上述逻辑。
而再往下一层,则体现了FC/TCP/RDMA不同传输类型的实现差异。
NVMe/TCP,就是将NVMe指令及数据通过TCP报文传输。下图中,PDU即NVMe/TCP的一个数据单元:
NVMe/TCP指令及数据即封装在NVMe/TCP PDU中,其中PDU头部记录PDU类型。
NVMe/TCP PDU支持传输以下类型报文,其中NVMe控制指令即使用下表中的CapsuleCmd,数据传输使用H2CData、C2HData。不同类型的报文有有着相同的数据结构,仅个别字段字节大小存在差异:
NVMe控制器将运行一个设备发现服务,并监听一个TCP端口,等待连接。此后,主机便可向控制器发起建立TCP连接。一旦建立了TCP连接,主机就会向控制器发送一个初始化连接请求(ICReq)PDU。 当控制器接收到ICReq PDU时,该控制器以初始化连接响应(ICResp)PDU 进行响应,交换用于建立连接和配置的参数。建立连接后,主机和控制器就可以进行Capsule和Data传输。NVMe/TCP还支持TLS进行加密传输。