iSCSI技术白皮书

来源:互联网 发布:淘宝禁售兴奋剂有哪些 编辑:程序博客网 时间:2024/05/27 00:26


第1章 背景技术

1.1 iSCSI概述

2003211IETFInternet Engineering Task Force,互联网工程任务组)通过了iSCSIInternet SCSI)标准,这项由IBMCisco共同发起的技术标准,经过三年20个版本的不断完善,终于得到了IETF认可。这吸引了很多的厂商参与到相关产品的开发中来,也推动了更多的用户采用iSCSI的解决方案。

iSCSI,全称:Internet Small Computer System Interface,它是通过TCP/IP网络传输SCSI指令的协议。iSCSI协议参照SAM-3SCSI Architecture Model 3)制订。在SAM-3的体系结构,iSCSI属于传输层协议,在TCP/IP模型中属于应用层协议。

1.2 SCSI技术

要了解iSCSI协议,首先需要了解SCSISCSI全称是Small Computer System Interface,小型计算机接口。SCSI1979年由美国的施加特(Shugart)公司(希捷的前身)研发并制订,由美国国家标准协会(ANSI)公布的接口标准。

SCSI Architecture ModelSAM-3)用一种较松散的方式定义了SCSI的体系架构。

 

图1-1SCSI体系结构分解图

SCSI Architecture Model-3,是SCSI体系模型的标准规范;

它自底向上分为4个层次:

l        物理连接层(Physical Interconnects——Fibre Channel Arbitrated LoopFibre Channel Physical Interfaces

l        SCSI传输协议层(SCSI Transport Protocols——SCSI Fibre Channel ProtocolSerial Bus ProtocolInternet SCSI

l        共享指令集(SCSI Primary Command),适用于所有设备类型;设备类型

l        专用指令集(Device-Type Specific Command Sets——如块设备指令集SBCSCSI Block Commands);流设备指令集SSCSCSI Stream Commands);多媒体指令集MMCSCSI-3 Multimedia Command Set

 

简单地说,SCSI定义了一系列规则提供给I/O设备,用以请求相互之间的服务用。每个I/O设备称为“逻辑单元”(LU),每个逻辑单元都有一个唯一的地址来区分它们,这个地址称为“逻辑单元号”(LUN)。

SCSI模型采用客户端/服务器(C/SClient/Server)模式,客户端称为initiator,服务器称为target,数据传输时,initiatortarget发送requesttarget回应response,在iSCSI协议中也沿用了这套思路。

图1-2SCSI设备服务和任务请求交互模型

 

第2章 iSCSI协议

2.1 iSCSI协议栈描述

iSCSI是集成了SCSI协议和TCP/IP协议的新的协议。它是在SCSI基础上扩展了网络功能,也就是可以让SCSI命令通过网络传送到远程SCSI设备上,而SCSI协议只能访问本地的SCSI设备。

iSCSI是传输层之上的协议,使用TCP连接建立会话。在initiator端的TCP端口号随机选取,target的端口号默认是3260

iSCSI使用客户/服务器模型。客户端称为initiator,服务器端称为target

Initiator:通常指用户主机系统,用户产生SCSI请求,并将SCSI命令和数据封装到TCP/IP包中发送到IP网络中。

Target:通常存在于存储设备上,用于转换TCP/IP包中的SCSI命令和数据。

             

图2-1iSCSI协议栈

2.2 iSCSI通信模型

iSCSI结构模型见下图,从图中可以看出,在iSCSI结构模型中的网络实体可以包含多个iSCSI节点(Initiator或者Target),而网络实体之间又通过网络入口(Network Portal)连接。

 

2.3 iSCSI名字规范

iSCSI协议中,initiatortarget是通过名字进行通信的,因此,每一个iSCSI点(即initiator)必须拥有一个iSCSI名字。

iSCSI协议定义了3类名称结构:

1iqniSCSI Qualified Name

         格式是:“iqn+“年月”+.+“域名的颠倒”+:+“设备的具体名称”,之所以颠倒域名是为了避免可能的冲突。

         举例: iqn.2008-07.com.h3c.rd:test

2euiExtend Unique Identifier

         eui来源与IEEE中的EUI,格式是:eui+64bits的唯一标识(16个字母)”。64bits中,前24bits6个字母)是公司的唯一标识,后面40bits10个字母)是设备的标识。

         举例:eui.acde48234667abcd

3naaNetwork Address Authority

         由于SAS协议和FC协议都支持naaiSCSI协议定义也支持这种名字结构。

         naa的格式:naa+64bits16个字母)或者128bits32个字母)的唯一标识”。

         举例:naa. 52004567BA64678D

                  naa. 62004567BA64678D0123456789ABCDEF

       在实际使用过程中,iSCSI节点名称可以不这么复杂。

第3章 iSCSI协议会话交互过程

3.1 背景

3.1.1 会话和连接的概念

1. 会话(Session

InitiatorTarget间的一组TCP连接,逻辑层概念(等价于SCSI规范中的I_T nexus

2. 连接(Connection

InitiatorTarget间的一个TCP连接,实体层概念(源地址:源端口号+目的地址:目的端口号唯一确定了一个TCP连接)

iSCSI报文交互是在由连接构成的会话上进行的。

iSCSI协议在设计的时候,为了提高性能,允许在1个会话包含多个连接,在会话建立过程中,第一个连接建立成功的同时会话也成功建立。

3. 连接忠贞(Connection Allegiance

iSCSI协议中,有连接忠贞的概念:如果一个iSCSI请求是通过某个TCP连接(称为A)发送的,那么相应的应答以及其他相关的PDU必须在该连接(A)上发送。

因此,虽然一个会话可以有多个连接,如果一个SCSI命令通过连接A送出去,那么必须在连接A上得到回应。

 

3.1.2 会话类型和会话阶段

iSCSI协议包括2种会话类型,每种会话类型又分为3个阶段。

1. 两种会话类型

l        发现会话(Discovery Session——用于发现指定的iSCSI网关上可用的Target,该会话建立后仅允许发送Text Command/ResponseLogout Request/Response PDU,其他类型报文PDU一律拒绝,SessionType =Discovery这种会话类型主要用在4.11中的第2种方法:“发现会话”。如果initiator只有target网关的地址,而没有target的名字,就需要使用Discovery类型的会话,发起会话建立请求。

l        正常操作会话(Normal Operational Session——没有任何限制的会话类型,SessionType =NormalInitiatortarget会话建立成功后,使用的会话类型就是Normal类型。

2. 每种会话类型又分三种会话阶段

l        Security Negotiation Phase —— 安全协商阶段0x00

l        Login Operational Negotiation Phase —— 操作协商阶段0x01

l        Full Feature Phase —— 全功能阶段0x03

安全协商阶段和操作协商阶段统称为登录阶段。

Initiatortarget只有到达全功能阶段后,才能进行数据读写操作。

 

3.2 发现会话(Discovery

Discovery会话主要用于initiator通过target portal发现所有的target,为接下来initiatortarget连接作准备。

3.2.1 过程概述

 

Discovery会话建立的过程主要分为以下几步:

1)、建立TCP连接

2)、进行安全协商

3)、进行操作协商

4)、获得可用资源

5)、关闭会话

6)、关闭TCP连接

 

3.3 正常操作会话

3.3.1 发现会话和正常操作会话的不同作用

l        实际的数据传输都是通过正常操作会话来进行,所以它和SCSI层的关系更为紧密,所有的PDU都可以在正常操作会话中传输

l        在发现会话建立初始化时,照例要进行login request/response(这点和发现会话的登录过程相似)

l        发现会话进入全功能阶段时,仅能传输Text CommandLogout Command,其他类型的报文会reject;而正常操作会话进入全功能阶段后,则开始包含SCSI指令的数据进行传输

 

发现会话只是为了获得Target网关上可用的Target列表,其他什么事情也不干;而正常操作会话的建立才是为了实际的数据读写操作!

发现会话是为正常会话服务的,通过发现会话,initiator可以获得target的名称和IP地址,从而与target建立正常会话。

正常会话的建立过程与发现会话类似,下面着重介绍正常会话建立完毕后,SCSI读写过程。

 

3.3.2 SCSI读写过程

1. 数据读写准备过程

数据读写之前,需要有一个读写准备的过程,这个过程中,initiatortarget端的动作

包括:

l        Initiator->Target: 读写前的设备状态、大小查询

u      Report LUNS

u      Inquiry

u      SCSI Read Capacity

u      SCSI Mode Sense

l        Target>Initiator:

u      SCSI Response

u      SCSI Data In

 

Report LUNS用于从I_T连接中获取逻辑单元的目录。

INQUIRY命令用于请求逻辑单元和SCSI目标设备发送信息给申请用户。

Read Capacity命令属于SCSI块命令(SBC),该命令请求设备服务器向输入缓冲区传输8字节的参数数据,用于描述直接存取块设备的存储介质的格式和容量。

Mode sense命令用于申请用户指定存储介质、逻辑单元或外围设备参数给设备服务器

Initiatortarget发送上述信息后,target对这些信息进行回应。

 

下面是以上命令的大致流程,它们之间并没有明确的顺序关系,所以下图实际上是4

个流程的大致组合:

 

 

2. SCSI读过程

l        Initiator->Target:    SCSI Read10)(ExpectedDataSegmentLength

l        Target->Initiator:    SCSI Data In Solicted data

l        Target->Initiator:    SCSI Response   (or included in the final Data In PDU)

 

Initiator首先向target发送读请求,其中包含了需要读的数据长度;target收到请求后,向initiator发送Solicted data,最后target发出response报文(或者该response报文包含在最后一个Data-IN报文中)。

 

3. SCSI写过程

数据写有2种情况,一种是target需要确认状态;另外一种是target端不需要确认状态。

一、需要确认状态的情况

 

l        Initiator->Target:    读写前的设备状态查询和设置

l        Initiator->Target:    SCSI Write10

u      ExpectedDataLength

u      Immediate Data

l        Target->Initiator:    R2T

l        Initiator->Target:    SCSI Data Out

u      Solicited Data

l        Target>Initiator:      SCSI Response

 

 

 

二、不需要确认状态的情况

        

l        Initiator->Target:    读写前的设备状态查询和设置

l        Initiator->Target:    SCSI Write10

u      ExpectedDataLength

u      Unsolicited Data

l        Target>Initiator:      SCSI Response

 

 

 

 

3.4 iSCSI错误恢复机制

3.4.1 可能的错误

iSCSI协议中,将可能发生的错误归为3类:

l        协议错误;可能由程序引起,需要SCSI层重启会话来恢复

l        CRC校验出错;这一错误可能发生在头校验位或数据校验位;重新发送PDU可能修复该错误;

l        TCP/IP或链路连接错误;这一错误可以通过重启连接或将会话从失败的连接上移开来恢复

3.4.2 三种错误恢复级别

 根据3种可能发生的错误,有3种错误恢复级别

l        ErrorRecoveryLevel=0 (又称会话恢复级)不论出现什么样的连接错误,都会重启会话;CRC校验出错时,Initiator会中止会话并向SCSI层返回错误码;SCSI层将负责恢复错误

l        ErrorRecoveryLevel=1(又称校验恢复级),如果需要,可以转向Level0;当initiatortarget收到一个头部校验出错的PDU,它们通常可以恢复该错误的PDUInitiator可以发送SNACK PDU来获得丢失的PDUsInitiator/Target可以发现丢失的命令并重新发送

l        ErrorRecoveryLevel=2(又称连接恢复级),连接错误时可以将连接忠贞从失败的连接上转移到完好的连接上;TCP/IP的连接错误可以通过重新建立新的TCP/IP连接并将连接忠贞转移到新的连接上来恢复;如果需要,可以转向Level0

3.4.3 各种恢复级别的关系

l        错误恢复级别由高到低的顺序为210

l        如果一些错误无法由高级别的错误方法恢复,则转向低级别的恢复方法

l        在一些简单的实现中,大多仅支持到错误恢复级别0

3.4.4 ErrorRecoveryLevel=0

l        必须实现的错误恢复级别

l        可以通过较简单的软件设计来实现

l        当错误发生时,InitiatorTarget会放弃正在执行或在队列中的任务,关闭TCP连接;当所有的状态清除后重新建立会话;该会话的所有连接会重新建立。

3.4.5 ErrorRecoveryLevel=1

l        除了0级所支持的会话恢复方式外,错误恢复级别1还能恢复大多数由CRC校验监测出的错误

l        如果头部校验值出错了,则PDU会悄悄丢弃掉,InitiatorTarget通过序列号中的“Hole”来发现丢失了某个PDU

l        如果数据校验值出错了,则可以这样处理

l        Initiator发起一个SNACK PDU

l        TargetR2T报文后发送一个Reject PDU

l        InitiatorTarget均悄悄丢弃它,同头部校验值出错的处理方式

3.4.6 ErrorRecoveryLevel=2

l        错误恢复级别2主要关注对连接和任务的恢复

l        假设Initiator发现一个TCP连接失败了,或它收到了一个异步消息来终止某个连接,它会将失败的连接上的任务重新分配连接忠贞,转移到完好的连接上,一切任务重新分配的工作完成后,再重启该失败的连接

l        为了实现它,Initiator会发送多个Task Management Request PDU,每一个都包含了其原先的连接忠贞,以及需要迁移往的连接号

l        连接忠贞的概念(Command Allegiance),指某个连接上的请求(由Initiator Task Tag来标识),它的回复也必须在该连接上回复

l        如果以上方式失败,最终会转向重启会话的方式来恢复

0 0
原创粉丝点击