NVMe over Fabrics 协议Discovery服务交互过程跟踪

Discovery服务过程跟踪

对于NVMe over Fabrics的subsystem,有两种类型:Discovery子系统和NVM子系统。这里介绍与Discovery子系统相关的交互内容(即:在Linux系统上使用nvme discover命令后的交互过程)。

Discovery子系统无Namespace存储空间,只响应相关的Fabric命令和Admin命令。这也就意味着主机与Discovery子系统只需要NVMe协议规格说明书中定义的Admin Submission Queue,而不需要IO Submission Queue。(之后描述Submission Queue简写SQ,描述Completion Queue简写CQ)。

参考NVMe over Fabrics协议规格说明书1.5.3 Capsules and Data Transfer章节中定义,交互内容格式如下边截图:

SQ请求使用的格式为:(其中前64字节为NVMe Command)

CQ回复使用的格式为:(其中前16字节为Completion内容)

Discovery子系统可以处理的命令包括Fabric命令和一部分Admin命令:

接下来按交互过程顺序来介绍。

1. 连接connect命令

此命令归属Fabric命令。

主机initiator端与target端Discovery子系统交互(注意:此connect命令前,需要已经存在Fabric链路作为SQ和CQ),由主机端发起connect命令。

参考下边抓包信息可以看到,connect命令包含了如下关键数值:

opcode为0x7f、命令ID为0、Fabric Command Type为0x01、QueueID为0、Queue最大值31、Keep Alive Timeout为0(不超时)。

在此交互的Capsule的数据内容大小占用1024字节,包含了主机标识、Controller ID、被请求的NQN、主机NQN,这4个主要内容。

本例子中,Controller ID填写了0xFFFF(65535),表示不指定controller。

允许连接的情况,回复如下内容:

其中Value: 1表示建立连接的controller的ID号为1。


备注:连接两种NVM子系统的过程是一样的,只是连接Discovery子系统时,请求的NQN是固定的nqn.2014-08.org.nvmexpres.

2. 获取property属性(CAP)

此命令归属Fabric命令。

查询property属性(此属性对应PCIe场景下的register map for the controller),opcode用0x7f,Fabric命令类型为0x04(即表示property Get),如下示例中的查询property属性,Attribute为1表示读取8个字节,offset为0表示从property空间的偏移0开始读取。

从propert属性定义可以看出,此命令请求目的是获取CAP(Controller Capabilities):

补充说明:对于Discovery子系统的控制器来说,只支持如下属性,其他的被Reserved:

对应的回应如下,此Response回应对应的是命令ID 14,查询出来的内容是CAP属性,值为十六进制ff 03 00 0f 20 00 00 00。

从NVMe规格说明书中查询CAP的8字节(64 bit)中各bit位表示的意思如下:

对照可以得出:

15:00对应的值ff 03,表示MQES队列深度可以支持1023(0x03ff=1023)。

23:16对应的值是00,表示CQR不是物理连续的,AMS仲裁机制支持也为0不支持。

31:24对应的值是0f,表示TO,从CC.EN使能到等待CSTS.RDY就绪的最坏超时时间。

37bit设置了1,表示CSS命令集支持,1表示支持NVM command Set。

3. 设置property属性(CC.EN)

此命令归属Fabric命令。

下边截图中,Attributes值为0表示设置4字节,offset是0x14,从前边截图Figure 30 Discovery Controller -properties可以得出是在设置CC(Controller Configuration)。

参照NVMe规格说明书,Controller Configuration对应bit位的意思,如下边截图Figure 78: Offset 14h: CC - Controller Configuration

本例子中的设置property属性目的是Enable使能controller。

回应的response如下:

4. 查询property属性(CSTS.RDY)

本次查询property属性时填写的offset偏移量0x1c,Attribute为0即读取4个字节,参照property属性表可知,本次查询的是CSTS(Controller STATUS)。

接下来,看回应response的内容:

对应查询命令ID 23的回复值是Value为1。

参照CSTS对应bit位的意思,可知,本次查询的CSTS.RDY为1,表示Controller已经ready。

5. 查询property属性(VS)

此命令归属Fabric命令,查询property属性中的offset偏移0x08位置,参照Figue 30即可得知查询的是version版本号。

回应此命令24的response内容为:

参照property属性表解释,可得知,Controller使用的NVMe协议版本是1.3.0。

附加说明:

对于主机端,查询此版本号,可以区分1.1.0版本及以后的版本,CAP中有NSSRC功能,此bit位的意思如下:

在linux系统中,主机就用查询版本号判断是不是1.1.0版本及以后的版本,来区分是否支持CAP.NSSRC功能。其他的当前还未看到主机端用版本区分功能的地方。

6. 获取property属性(CAP)

获取CAP,本次查询到的信息与使能前查询的到的信息一样。

这里出现了重复查询。本例子是使用的NVMe over TCP方式抓包的,是Linux系统下的操作,相关代码:

nvme_tcp_configure_admin_queue()

--> ctrl->ops->reg_read64(ctrl, NVME_REG_CAP, &ctrl->cap); //读一次

--> nvme_enable_ctrl(ctrl, ctrl->cap);

--> nvme_init_identify(ctrl);

--> ctrl->ops->reg_read32(ctrl, NVME_REG_VS, &ctrl->vs);

--> ctrl->ops->reg_read64(ctrl, NVME_REG_CAP, &cap); //又读一次

回应如下:

以上完成了主机与target端Discovery服务的Fabric连接过程。

接下来开始进行Admin Command处理分析。

7. Identify查询命令id-ctrl(Admin Command)

此命令归属Admin Command。

执行nvme id-ctrl命令的结果。

这里Identify查询命令,opcode为0x06,CNS字段填充0x01,表示查询controller Identify,注意:Discovery只定义了CNS为0x01的处理,其他情况未定义。

结合上边Figure 33: DiscoveryController - Identify Controller Data Structure回应内容解析,可知回应的内容大小为3072字节。

本例子操作时获取到的回应数据为:

Completion Queue Entry对应的16字节内容为:

接下来数据参照Figure 33分析:

Firmware Revision (FR): 5.0.7

Maximum Data Transfer Size (MDTS): 0 //固定填写0

Controller ID (CNTLID): 1

Version (VER): 1.3.0

Log Page Attributes (LPA): 0x04

Error Log Page Attributes (ELPE): 0x00

Maximum Outstanding Commands (MAXCMD): 0x00000000

SGL Support (SGLS): 0x00000000

NVM Subsystem NVMe Qualified Name (SUBNQN): 固定字符串

备注:

测试时使用了NVMe over TCP,分析截图使用了wirshark,需要wirshark 3.0.3之后的版本。

原文地址:https://www.cnblogs.com/JamesLi/p/11498305.html

时间: 2024-10-16 07:24:23

NVMe over Fabrics 协议Discovery服务交互过程跟踪的相关文章

HTTPS协议,SSL协议及完整交互过程

文章转自 https://blog.csdn.net/dfsaggsd/article/details/50910999 SSL 1.        安全套接字(Secure Socket Layer,SSL)协议是Web浏览器与Web服务器之间安全交换信息的协议. 2.    SSL协议的三个特性 ?  保密:在握手协议中定义了会话密钥后,所有的消息都被加密. ?  鉴别:可选的客户端认证,和强制的服务器端认证. ?  完整性:传送的消息包括消息完整性检查(使用MAC). 3.    SSL的

NVMe over Fabrics又让RDMA技术火了一把

RDMA是个什么鬼?相信大部分不关心高性能网络的童鞋都不太了解.但是NVMe over Fabrics的出现让搞存储的不得不抽出时间来看看这个东西,这篇文章就来介绍下我所了解的RDMA. RDMA(Remote Direct Memory Access)意为在远端直接访问主机的内存,而不需要主机参与.如下图,当主机和Client端都配备RDMA NIC的时候,数据通过NIC的DMA引擎直接在两端内存之间转移,而不需要经过OS的网络协议栈.这种技术对于局域网高带宽的存储系统非常有吸引力. 网络技术

NVMe over Fabrics:概念、应用和实现

对于大部分人来说,NVMe over Fabrics(简称NVMf)还是个新东西,因为其第一个正式版本的协议在今年6月份才发布.但是这并不影响人们对NVMf的关注,因为这项依托于NVMe的技术很可能继续改变存储市场格局. NVMf的贡献在于提供除PCIe外访问NVM的另一个途径-Fabrics,并且将fabrics链路在latency上增加的overhead维持在10us以内.来自NVMf spec的一张图清晰的展示了它的野心,围绕着NVMe的战场再一次扩大了. 提供fabrics途径后,可以在

SSH基本简介及连接交互过程

简介: SSH(Secure+SHell):是一种网络协议,顾名思义,就是非常安全的shell,主要用于计算机间的加密传输. SSH服务基于非对称加密(public-key cryptograthy,也称公开密钥加密)技术实现数据加密传输.该技术会生成一对密钥,一个对数据进行加密,而且只能用于加密,而另一个只能用于解密.使用加密密钥加密后的数据,只能用对应的解密密钥才能解密.而且只知道其中一个密钥,无法计算出另一个.因此,如果公开了一对密钥中的一个,并不会危害到另一个密钥.通常把公开的密钥称为公

转:简单的RTSP消息交互过程

简单的RTSP消息交互过程 C表示RTSP客户端,S表示RTSP服务端 1.   第一步:查询服务器端可用方法 1.C->S:OPTION request       //询问S有哪些方法可用 1.S->C:OPTION response    //S回应信息的public头字段中包括提供的所有可用方法 2.   第二步:得到媒体描述信息 2.C->S:DESCRIBE request      //要求得到S提供的媒体描述信息 2.S->C:DESCRIBE response  

ASP.NET运行机制原理 ---浏览器与IIS的交互过程 自己学习 网上查了下别人写的总结的很好 就转过来了 和自己写的还好里嘻嘻

一.浏览器和服务器的交互原理 (一).浏览器和服务器交互的简单描述: 1.通俗描述:我们平时通过浏览器来访问网站,其实就相当于你通过浏览器去访问一台电脑上访问文件一样,只不过浏览器的访问请求是由被访问的电脑上的一个 WEB服务器软件来接收处理,它会分析接收到的请求信息,从而按照请求信息来找到服务器电脑上的文件,经过处理,最终将生成的内容发回到浏览器. 简单的说就是:由浏览器生成一条“命令”,通过互联网发给另一台电脑的某个软件(服务器软件):服务器软件接收到“命令”,就分析理解这个“命令”,然后按

Dubbo中暴露服务的过程解析

dubbo暴露服务有两种情况,一种是设置了延迟暴露(比如delay="5000"),另外一种是没有设置延迟暴露或者延迟设置为-1(delay="-1"): 设置了延迟暴露,dubbo在Spring实例化bean(initializeBean)的时候会对实现了InitializingBean的类进行回调,回调方法是afterPropertySet(),如果设置了延迟暴露,dubbo在这个方法中进行服务的发布. 没有设置延迟或者延迟为-1,dubbo会在Spring实例

fastdfs分布式文件系统文件上传、下载、删除交互过程讲解

在讲解fastdfs的上传.下载和删除流程之前,我们先介绍fastdfs中的工程流程:首先客户端client 调用fastdfs的api,获取可用的tracker server , 再调用tracker server 获取可用的组,tracker server 通过负载均衡返回一个最优的storage server,这样客户端与client就建立了连接,client就可 以调用storage server对文件进行上传.删除和追加的操作. 下面我们将结合时序图的方式给大家详细讲解fastdfs的

SOFA 源码分析 —— 服务引用过程

前言 在前面的 SOFA 源码分析 -- 服务发布过程 文章中,我们分析了 SOFA 的服务发布过程,一个完整的 RPC 除了发布服务,当然还需要引用服务. So,今天就一起来看看 SOFA 是如何引用服务的.实际上,基础逻辑和我们之前用 Netty 写的 RPC 小 demo 类似.有兴趣可以看看这个 demo-- 自己用 Netty 实现一个简单的 RPC. 示例代码 ConsumerConfig<HelloService> consumerConfig = new ConsumerCon