深入分析iSCSI协议的应用

深入分析iSCSI协议的应用

1 引言

快速增长的存储容量使得企业需要采用网络存储解决方案。目前网络存储技术采用的连接技术主要有光纤通道和TCP/IP。基于IP的网络存储能解决基于光纤通道的网络存储中存在的兼容性和传输距离问题,而且能提供相对廉价的解决方案。iSCSI协议是IP存储网络协议之一,它将广泛应用的两种工业标准SCSI和TCP/IP结合起来,为存储设备提供面向数据块级的连接服务。

由于iSCSI协议对存储网络的性能有很大的影响,所以如果能够建立iSCSI的模型用于仿真,将能够更清楚的了解iSCSI对存储网络性能的影响,但在OPNET上还没有iSCSI的模型,本文给出了在OPNET上实现iSCSI的方法。

2 iSCSI协议分析

2.1 iSCSI协议模型

iSCSI使用TCP/IP协议在不稳定网络上进行可靠的数据传输。iSCSI层和标准SCSI集在协议栈中的位置如图1所示。iSCSI层包括了已封装的SCSI命令、数据和状态。就是说若Initiator端的操作系统或应用程序需要进行数据写操作,SCSI的CDB(Command Description Block命令描述块)必须被封装以便能够在串行千兆位链接上传输到Target端。

深入分析iSCSI协议的应用

图1 iSCSI协议栈

iSCSI属于端到端的会话层协议,它定义的是SCSI到TCP/IP的映射,即Initiator将SCSI指令和数据封装成iSCSI协议数据单元,向下提交给TCP层,最后封装成IP数据包在IP网络上传输,到达Target后通过解封装还原成SCSI指令和数据,再由存储控制器发送到指定的驱动器,从而实现SCSI命令和数据在IP网络上的透明传输。它整合了现有的存储协议SCSI和网络协议TCP/IP,实现了存储与TCP/IP网络的无缝融合。

iSCSI数据包作为TCP的有效载荷被封装到TCP包中,在经过了整个网络协议栈到达物理层时,数据包封装格式如图2所示

深入分析iSCSI协议的应用

图2 iSCSI协议数据包格式

iSCSI协议监测块数据的传输并完成I/O操作,这些需要在Initiator端和Target端的TCP连接上进行。在实际应用中,IP网内一个Initiator端可以有多个Target端资源,所以同时有多个活动的TCP连接。

2.2 iSCSI会话管理

会话指的是两个节点通过某一应用进行通讯,iSCSI协议会话由一个二元组<<ISID,TSID>标识,它表示Initiator和Target之间的联系,该联系在iSCSI协议中称为I-T Nexus (I-T联结)。在iSCSI Initiator:端向Target端发送iSCSI命令之前,首先必须与Target端建立一个iSCSI会话,iSCSI会话通过一个iSCSI登录进程来启动,登录过程中协商双方的变量参数,并调用一个安全例程来对许可的连接进行认证.iSCSI会话生存期包括登录阶段和全工阶段,登录阶段又可细分为初始化阶段、安全认证阶段和参数协商阶段。

Initiator端在发起每次TCP连接时先向系统注册该连接,在连接能够被用于传输SCSI命令之前,连接的注册阶段必须完成。iSCSI注册是一种在Initiator端和Target端之间建立TCP连接的机制。它将鉴别连接双方,就会话间的各种参数进行磋商,并设置相应的安全关联,还要为属于相应iSCSI会话的连接做上标记。Initiator:端通过连接一个已知的TCP端口开始注册程序,Target端也透过这个端口来监听进入的连接。

一个TCP连接被建立后,可以用来传输SCSI命令、数据和状态信息,完成Initiator端和Target端之间的通信任务。在Initiator:和Target之间可能会产生一个或多个这样的TCP连接。具有相同会话标识的TCP连接就组成了一个会话。这个会话也可以用来鉴别Target端与给定Initiator端的所有连接,TCP连接可以从会话中被添加或删除。

iSCSI协议登录交换使用文本字段来协商Initiator:和Target之间的允许参数,如安全协议、最大数据有效载荷大小、是否支持主动数据、主动数据的长度和超时值等。作为注册程序的一部分,Initiator端和Target端会彼此鉴别对方,并为这个会话设置相应的安全关联。一旦注册程序结束,iSCSI会话将进入全工阶段。此时,Initiator端可以通过已建立的iSCSI会话将SCSI命令和数据打包入iSCSI PDU中,并把它们发送到Target端的不同逻辑单元。

3 iSCSI协议在OPNET中的实现方法

3.1 OPNET仿真工具简介

0PNET是一种由一系列事件驱动的能够对大型网络建模的仿真工具。它针对无线和有线网络提供了广泛的仿真场景。0PNET仿真场景主要是由多级结构实现,首先是基本项目场景,它由多个节点构成,下一层是节点模型,节点模型由多个模块构成,在下一层就是最基本的模块模型,它主要是进程模块组成的,进程模型尤其适合有限状态机的仿真,网络主要的功能模块就是在进程中描述的。

3.2 iSCSI协议在OPNET中的具体实现

由于在OPNET中,已经存在基于IP的网络模型,根据iSCSI协议栈,要实现的只是SCSI和iSCSI层,对于iSCSI以下的各层可采用OPNET中现有的模块来实现。由于iSCSI协议本身很复杂,所以本文主要讨论iSCSI层,该层是整个协议的核心。在iSCSI协议中,iSCSI层主要完成的功能是建立iSCSI连接和进行iSCSI会话管理。因此,就要在OPNET中建立这两个功能模块的进程模型。在OPNET中,进程模型是由有限状态机来描述。因此要画出这两个进程模型的状态转移图。

3.2.1 iSCSI连接的实现

启动器和目标器之间的TCP连接以及iSCSI协议赋予该TCP连接的属性合称为iSCSI连接。同一会话中相同启动器IP地址的只能有一个连接。对于每个连接有一个可接收的最大PDU的大小,缺省为8K,该大小指的是PDU中携带数据的大小不包括数据摘要, 头部摘要以及校验部分。这个大小又称最大接收PDU大小。

iSCSI的连接的主要工作是:接收从对方发送的PDU并完成必要的校验工作,如果这个PDU是登录请求PDU,那么首先在iSCSI连接范围内处理最终交会话层;如果是其他PDU,通常直接交会话层处理。每个iSCSI连接维持一个发送PDU的滑动窗口,这个滑动窗口可以实现PDU的选择重传。

在iSCSI协议连接过程中,可以创建两个进程,分别是Initiator-connect和Target-connect。在iSCSI连接建立的过程中,共有8个状态:

⑴ S1 FREE:

对于启动器为iSCSI协议连接初始化的状态或成功关闭后的状态。

对于目标器为iSCSI连接初始化的状态或成功关闭后的状态。

⑵ S2 XPT_WAIT:

对于启动器为己发送连接请求等待目标器返回响应的状态。

对于目标器该状态不存在。

⑶ S3 XPT_UP 等待来自客户的连接请求:

对于启动器该状态不存在。

对于目标器为成功接受连接,等待Login开始的状态。

⑷ S4 IN_LOGIN等待登录客户确认连接的决定。可能需要进行若干PDU的交换:

对于目标器为等待Login过程结束的状态,在该状态下目标器可能与启动器有若干个PDU的交换。

⑸ S5LOGGED_ IN全功能阶段((Full-Feature phrase):连接的正常工作状态,等待数据输入或协议栈内部产生的事件:

对于启动器该状态为全功能状态,可以接受并处理所有的内部iSCSI协议事件和传输事件。

对于目标器该状态为全功能状态,可以接受并处理所有的内部iSCSI事件和传输事件。

⑹ S6 IN_ LOGOUT等待协议栈内部的LOGOUT结束的信号:

对于启动器为等待Logout Response的状态。

对于目标器为等待内部Logout处理完成的过程。

⑺ S7 LOGOUT处理启动:

对于启动器为等待可以进行Logout处理的内部事件的状态。

对于目标器为通过Async Message发送Logout Request后等待Logout过程启动的状态。

⑻ S8 CLEANUP WAIT等待连接的清理工作:

对于启动器为等待某事件启动当前连接状态机CSM清理资源过程的状态。

对于目标器为等待当前连接状态机CSM开始清理资源的状态。

根据上面的状态,可以在OPNET中实现出启动器和目标器之间的iSCSI协议建立连接的状态图。

在OPNET中具体实现如图3和图4所示。

深入分析iSCSI协议的应用

图3iSCSI协议启动器连接状态图

深入分析iSCSI协议的应用

图4iSCSI协议目标器连接状态图

在建立连接之前,启动器和目标器都处在FREE状态。当启动器发送建立连接请求后,启动器的状态转移到XPT-WAIT状态,等待目标器的响应。此时如果连接超时,仍然没接到目标器的响应,那么目标器将回到FREE状态,等待启动器重新发送请求。目标器接收到该连接请求后,将状态转移到XPT-UP状态,等待login开始。此时如果等待超时,那么目标器状态将回到FREE状态。启动器向目标器发送login的请求后,启动器的状态转移到IN-LOGIN状态,等待目标器的响应。目标器接到login请求后,状态转移到等待IN-LOGIN的状态。login过程完成后发送给目标器一个login完成的响应,伴随着状态转移到LOGGED-IN状态, 启动器接到该响应后,状态转移到LOGGED-IN状态。当数据传输完毕,启动器准备向目标器发送一个logout请求,伴随着状态转移到IN-LOGOUT状态。当目标器接收到该请求后,状态也转移到IN-LOGOUT状态,然后向启动器发送一个响应,伴随着状态转移到LOGOUT状态,启动器接收到该响应后,状态转移到LOGOUT状态,启动LOGOUT操作。该过程完成后,启动器和目标器将进入CLEANUP-WAIT状态,完成连接的清理工作。

3.2.2 iSCSI协议会话管理的实现

在iSCSI会话管理过程中可以创建两个进程,分别是Initiator-session和Target-session。在iSCSI协议会话过程中有以下5个状态:

⑴ Q 1 FREE:

对于启动器为会话尚未建立或成功清除后的状态。

对于目标器为会话尚未建立或成功清除后的状态。

⑵ Q2 ACTIVE:

对于启动器该状态不存在。

对于目标器为会话的第一个iSCSI协议连接正处在IN_LOGIN状态等待Login过程完成。

⑶ Q3 LOGGED_IN:

对于启动器为等待任何一种会话事件的状态。

对于目标器为等待任何一种会话事件的状态。

⑷ Q4 FAILED:

对于启动器为等待会话恢复或会话继续的状态。

对于目标器为等待会话恢复或会话继续的状态。

⑹ Q5 IN-CONTINUE:

对于启动器该状态不存在。

对于目标器为等待会话继续过程完成的状态。

根据以上描述的iSCSI协议会话管理的状态,可以实现iSCSI会话过程的状态转移图,在OPNET中的具体实现如图5所示:

深入分析iSCSI协议的应用

图5iSCSI协议启动器会话状态图

深入分析iSCSI协议的应用

图6iSCSI协议目标器会话状态图

在会话没有建立之前,启动器和目标器都处在FREE状态。对于启动器来说,当至少有一个iSCSI协议连接进入LOGGED-IN状态时,启动器的状态转移到LOGGED-IN状态,如果此时会话失败,那么启动器的状态将转移到FAILED状态,来进行会话恢复,恢复完毕后状态将重新转移到LOGGED-IN,会话操作继续。

对于目标器来说,当第一个iSCSI协议连接进入IN-LOGIN状态时,目标器的状态转移到ACTIVE状态,等待第一个iSCSI连接的login的完成。如果该连接的login失败,那么目标器的状态将返回到FREE状态。当该连接进入到LOGGED-IN时,目标器的状态将转移到LOGGE-IN状态,进行会话操作。如果此时会话失败,那么状态将转移到FAILED状态,来进行会话恢复,当完成恢复过程启动后,将转移到IN-CONTINUE状态,等待会话恢复操作完成,当会话恢复以后,目标器的状态将返回到LOGGED-IN状态,继续完成会话操作。

3.3 iSCSI协议连接和会话管理的联合实现

在连接和会话的实现过程中,Initiator-session设计成Initiator-connect的父进程,Target-session设计成Target-connect的父进程,进程之间的通信机制是共享机制。

当空闲的时候,子进程都没被启动,一旦iSCSI层接受到上层的应用请求,那么父进程将被初始化,Initiator-session进程将调用Initiator-connect子进程来来实现iSCSI协议连接有限状态机,如图3和图4所示,Initiator-connect负责整个事务处理的建立请求,响应,结果和确认。

当Initiator-connect进程完成后,它将停止执行Initiator-connect,并把控制权交给调用进程,也就是Initiator-session,数据到达目标器端被接收后,Target-session将调用Target-connect进程来处理事务。Target-connect在等待Target-session处理后将结果传给启动器。此时Target-connect将控制权交给Target-session。Initiator-session在收到结果后,再次调用Initiator-connect,此时子进程从原来停止的地方继续执行处理结果,将结果相应交给目标器。

当最后一个会话处理完毕,Initiator-session将发送结束命令给Initiator-connect,让其结束和关闭事务处理,随后Initiator-connect将结束自己的执行,将整个会话关闭。在目标器一端,具体的工作流程也是一样的。

4 结束语

本文给出了在OPNET中实现iSCSI协议的方法,尤其着重于该协议的核心iSCSI协议层的实现,该层决定了iSCSI协议的网络的性能。iSCSI不但使现有的许多应用得到了突飞猛进的改变,同时也催生出更多崭新的增值业务。所以能够实际建立一个iSCSI仿真模型,以求获得iSCSI协议对网络影响的关键参数是十分必要的。本文提供了这样一种方法来实现,采用这种模型继续深人仿真后能够获得iSCSI各种参数对网络性能的影响。

上一篇:Java并发大师Brain Goetz和Doug Lea 的中英文博客文章地址


下一篇:c#进度条控件,子线程修改控件数据。