..一、基本概念SCSI,小型计算机系统接口,基于client-server模型,client(initiator)将命令发送给server(target),server处理命令后回传结果给client。由于要传送命令必然要用到相应的传输协议,iSCSI就是其中的一种传输协议,除此之外还有FC等。iSCSI也就是SCSIoverIP,使用TCP/IP协议来传递SCSI命令与响应,其借用现有的互连网来实现SCSI通讯,成本低,管理、使用方便。iSCSI也有initiator和target,分别对应于SCSI的initiator和target,iSCSIinitiator与target使用TCP进行通信从而实现了SCSI的initiator与target之间的通信。如何使用iSCSI来传递SCSI命令与响应呢?首先要明白SCSItarget中包含许多LU(逻辑单元),每一个SCSI命令都有其目标LU,这些LU负责对针对其的SCSI命令进行处理与响应。iSCSI有自己的PDU,在iSCSIinitiator端,其包含SCSIinitiator下发给其的LUN(逻辑单元号码)及SCSI命令(CDB),在被作为TCP的数据部分传递到iSCSItarget端后由SCSItarget根据LUN将SCSI命令投放到目标LU中,LU在处理命令后把响应结果递交给SCSItarget,SCSItarget再将其递交给iSCSItarget,iSCSItarget把结果封装成iSCSIPDU,再使用TCP回传给iSCSIinitiator,iSCSIinitiator再将结果递交给上层SCSIinitiator,如图1所示:SCSI启动器(包含虚拟的LU)©SCSI目标器(包含实际的LU)iSCSI启动器iSCSI目标器TCP/IPTCP/IPscsi命令、响应、数据TCP/IP包iSCSIPDU上层应用如文件系统等各种存储设备如磁盘等块设备的读写等操作iSCSI协议图1.iSCSI协议层次iSCSIDevice:利用iSCSI传递服务子系统进行传递的SCSI设备。iSCSINode:iSCSI节点表示一个iSCSI启动器或者iSCSI目标器。在一个网络..实体里,可能有一或者多个iSCSI节点。可以通过一个或者多个网络端口访问iSCSI节点。iSCSI节点的标识是iSCSI名称。把iSCSI名称和地址分开来后,允许多个iSCSI节点使用同一个地址,或者一个iSCSI节点使用多个地址。NetworkEntity:网络实体。它表示一个可以通过IP网络访问的设备或者网关。一个网络实体必须有一或者多个网络端口,包含在该网络实体内的iSCSI节点可以用这些端口来访问IP网络。NetworkPortal:网络端口。网络实体的一个组成部分,它有一个TCP/IP地址。网络端口在initiator用IP地址标识,在target用IP地址+侦听的TCP端口标识。Session:连接initiator和target的一组TCP连接构成一个session(可以简单理解为I_Tnexus)。可以向session添加TCP连接,也可以把TCP连接从session删除。通过一个session的所有连接,initiator只看到同一个target。Connection:一个TCP连接。Initiator和target之间使用一或者多个TCP连接通信。CID(ConnectionID):一个session里的每个connection用CID进行标识,该标识在session范围内是唯一。CID由initiator产生,在login请求和使用logout关闭连接时传递给target。PortalGroups:网络端口组。iSCSIsession支持多连接,一些实现能把通过多个端口建立的多个连接捆绑到一个session。一个iSCSI网络实体的多个网络端口被定义为一个网络端口组,把该组和一个session联系起来,该session就可以捆绑通过该组内多个端口建立的多个连接,再使它们一起协同工作以达到..捆绑的目的。每一个该组的session并不需要包括该组的所有网络端口。一个iSCSI节点可能有一或者多个网络端口组,但是每一个iSCSI使用的网络端口只能属于iSCSI节点的一个组。PortalGroupTag:网络端口组标识。使用16比特的数标识一个网络端口组。在一个iSCSI节点里,所有具有同样组标志的端口构成一个网络端口组。iSCSITask:一个iSCSI任务是指一个需要响应的iSCSI请求。I_Tnexus:I_Tnexus是指一个SCSIinitiator的端口和一个SCSItarget端口之间的关系。对于iSCSI,这个关系对应一个session,它指session的initiator端和iSCSItarget网络端口组之间的关系。I_Tnexus的标识是一对端口名称(iSCSIinitiator名称+i+ISID,iSCSItarget名称+t+网络端口组标识)。PDU(ProtocolDataUnit):initiator和target之间通信时把信息分割为消息。这些消息称为iSCSIPDU。SSID(SessionID):iSCSIinitiator和iSCSItarget之间的session用SSID进行标识,该标识由initiator部分的ISID和target部分的TPGT构成。ISID由initiator在session建立的时候明确给出,TPGT隐含的由建立连接时选择的网络端口确定。当TargetName给定后,建立连接的过程中,target必须把TPGT关键字当作确认信息发送出去。TSIH(TargetSessionIdentifyingHandle):Target分配给与特定名称initiator建立的session的标识。但是0被保留着用于initiator告知target这是一个新session。在为一个session添加一个connect时,TSIH已经隐含指明。..二、SCSI与iSCSI的映射关系在SCSI中,一个Device(SCSIinitiator或者SCSItarget)可以包含多个ports,一个SCSIinitiatorport和一个SCSItargetport之间的联结就是一个I_Tnexus,一个SCSIinitiatorport和一个SCSItargetport之间只允许建立一个I_Tnexus。I_Tnexus对应与iSCSI中的一个session(normal),SCSItargetport对应于iSCSItarget中的一个portalgroup(具有相同tag的一组ports,iSCSItarget在这些ports上进行监听等待iSCSIinitiator的连接登陆,所有这些ports一起支撑一个I_Tnexus),SCSIinitiatorport对应于iSCSIinitiator中的session(normal)的端点。SCSItgt0Aapplication0application1iSCSIini0iSCSItgt0LULUportgourp0portgourp1portgourp0scsiport0scsiport1scsiport2scsiport0scsiport1scsiport0mapofscsiandiscsiSCSIini0SCSIhostSCSItargetSCSItargetportSCSIhostportiSCSIhost/initiatoriSCSItargetiSCSItargetPortalGroup(Tag)iSCSIhost/initiatorsessionend(ISID)I_TnexusnormalsessioniSCSItgt1SCSItgt1normalsession2normalsession0normalsession1SSIDI_TnexusID图2.SCSI与iSCSI的映射一个iSCSI节点只能有且只有一个SCSI设备;只能通过正常运行的iSCSIsession访问SCSI设备;SCSI名称也就是iSCSI节点的名称。..SCSIInitiatorPort:SCSIinitiator端口。它被映射到一定正常运行的iSCSIsession的一端。在login过程中,一个iSCSIinitiator节点和一个iSCSItarget节点协商建立一个正常运行的session;当session成功建立后,一个隶属于iSCSIinitiator设备的SCSIinitiator端口被创建。SCSIinitiator端口的名称和标识被定义为:iSCSIinitiatorname+‘i’+ISID标识,对于iSCSI,SCSIinitiator端口和SCSItarget端口的定义是不一样的。SCSItarget端口,映射为iSCSItarget的一个网络端口组。SCSItarget端口名称和标识:都被定义为:iSCSItargetname+‘t’+iSCSItargetPGT三、iSCSI中的一些命名及标识每个iSCSIinitiator或者iSCSItarget都有一个全球唯一的名称,对于iSCSIinitiator称为initiatorname,对于iSCSItarget称为targetname。iSCSItarget中的portgroup使用portgrouptag来标识;session在iSCSIinitiator端使用ISID(initiatorsessionidentifier)标识,在iSCSItarget端使用TSIH(targetsessionidentifierhandle)标识。四、session和connection的状态划分及登陆登出对于connection,有两种状态,即loginphase(登陆状态)和fullfunctionphase(全功能状态),登陆状态即iSCSIinitiator与iSCSItarget正处于登陆协商过程;全功能状态即登陆过程已经完成,该connection已经能为上层SCSI提供服务。Session与connection一样也有loginphase和fullfunctionphase,当session中仅有的一个connection处于登陆状态时,session处于登陆状态,当session至少有一个connection处于全功能状态时session处于全功能状态。iSCSIinitiator登陆到iSCSItarget的过程分三个过程:1)首先是iSCSIinitiator往iSCSItarget发送initiallogin请求,请求中包括iSCSIinitiator支持的协议版本、iSCSIinitiatorname和iSCSItargetname、ISID和TSIH及CID;..2)其次是安全协商,也就是chap认证之类,用于iSCSIinitiator和iSCSItarget互相之间的授权认证;3)最后是操作参数协商,用于协商在全功能时期的一些通讯参数。有两种登出方式,一种是iSCSIinitiator主动发出logout请求,在收到iSCSItarget的logout响应后完成登出;另一种就是iSCSItarget发送包含“requestlogout”的Async协议数据包,启动器再发送logout请求。connectionphase启动器目标器firstloginreqtsih=0/非零目标器判断tsih,如果为0则认为是一个新的session,如果不为0则认为是原session的一个新connection......security参数协商(可选)......操作参数协商(可选)loginphase......各种SCSI命令,响应,数据fullfunctionphase......finalloginrsp图3.iSCSI登陆及状态划分..五、iSCSIPDUPDU格式iSCSIPDU包含:a