引言 iSCSI是由Cisco和IBM共同发起的,并于2003年2月(2)
2013-06-28 01:00
导读:-使用NOP-IN探测启动器的序列信息。 -可以使用R2T要求启动启动器重传数据。 -支持SNACK功能。 -可以要求启动器对自己发送的Data序列予以确认。 -支持命令忠
-使用NOP-IN探测启动器的序列信息。
-可以使用R2T要求启动启动器重传数据。
-支持SNACK功能。
-可以要求启动器对自己发送的Data序列予以确认。
-支持命令忠贞的再分配。
-终结session。
iSCSI错误恢复机制从高到低依次是0级(会话恢复), 1级(冗余恢复),2级(连接恢复)三层。一般的实现是1级或2级,本文实验使用的是0级,使得数据可靠性更高。由于iSCSI有以上2种机制,即使采用UDP包进行数据传输也会保证数据正确可靠的传输,再参照可看出,TCP层和iSCSI层在数据可靠性保证方面从语义上来说是重复的,而且TCP能保证命令顺利完成,否则会要求重发命令或重新建立连接,所以本改进协议使用UDP也能保证数据可靠。
2 高性能 iSCSI 读写处理设计
启动设备通过登录建立与目标设备的会话(session),登录成功后目标设备赋予启动设备会话号(sessionID)。其中登录过程中在建立TCP连接的时候,给每个连接一个CID(connection ID),对于每个TCP连接我们配套添加UDP套接字接口来进行数据的传输,一旦一个连接出错(如TCP连接错误,传输异常等),为了保证命令的连接忠贞,可以为该命令分配一个新的连接及相应的UDP套接字接口。连接成功后,双方再通过协商确定各种参数,然后会话进入iSCSI全功能阶段,可以发命令对设备进行读写操作了,下面来分析新iSCSI的读写过程设计。
2.1 iSCSI 读处理
内进数据的读处理设计过程如,此图是启动器协议栈执行SCSI读操作所处理内进数据PDU(数据从目标器流向启动器为内进数据,否则为外出数据)的过程。一个iSCSI PDU的默认大8Kb,可能被包含在多个UDP包中,当NIC收到这些包时,通过DMA(Direct MemoryAccess)把它们放到NIC(Network Interface Control)缓冲区然后中断CUP,设备驱动栈使用Rx接收线程和UDP控制块来执行UDP/IP处理,即去掉Eth/UDP/IP头部。前5步就是处理UDP/IP及其下层。第6-10步处理相关的iSCSI层,首先iSCSI层从套接字读iSCSI头部到内部临时缓冲区。iSCSI头部是由48字节的基本头部,CRC校验和,以及一些可选的附加头部组成。第7步计算CRC,然后与附加在头部上的CRC进行比较,如果相符,则iSCSI层去掉头部并把内进的iSCSI PDU作为数据PDU处理。第8步,在头部中包含一个标识值,根据它能把数据PDU放在SCSI缓冲中正确的位置;基于PDU的长度以及相对偏移,iSCSI层创建一个指向SCSI缓冲区的聚集链表。然后iSCSI层把聚集链表传给套接字接口(从UDP包复制iSCSI PDU负载到SCSI缓冲区),第10步验证整个PDU数据负载CRC校验和。
(科教作文网http://zw.ΝsΕAc.Com编辑整理)
2.2 iSCSI 写处理
显示的是启动器对目标器执行SCSI写外出数据PDU的处理流程。启动器端的iSCSI层必须在一个SCSI缓冲区中保留指向下一次写到目标端的数据PDU的指针。一旦收到从目标端传来的流控制(如R2T)PDU,iSCSI层立即传输数据PDU。首先构造iSCSI头部并计算头部的CRC值,把CRC值附加在头部上(1)。然后iSCSI层创建聚集链表来描述这个头部、头部的的CRC以及iSCSI PDU负载,接着计算负载数据的CRC值并把它添加到聚集链表中(2)。最后数据通过内核接口到UDP/IP栈再传到目标器。对于UDP/IP栈的实现问题,数据要么直接从SCSI缓冲区到NIC要么经过复制到一个临时套接字缓冲区(3,4,5)。UDP/IP栈加上自己的链接头部和负载描述符来分别指向包头和UDP负载(6,7)。最后协议栈发送信号给NIC,通过DMA把数据发送出去(8)。
3 实验结果分析
本实验是由2台主机构建iSCSI启动器和目标器模块,启动端是自主开发的支持UDP数据传输的iSCSI模块加载到windows XP内核中所构成,目标端是修改的linux下的HNU的修改版(支持UDP数据),再在中间加上千兆以太网交换机连接构成实验环境。首先启动两模块,把目标端的磁盘映射成启动端的虚拟磁盘。然后启动器端机器随机读写不同大小的数据块。