
iSCSI既然要利用TCPIP来传输SCSI协议指令和数据,那么就必须将自己作为调用TCPIP这个传输管道的一个应用来看待。大家都知道,浏览器中输入http://1.1.1.1或者“hhtp:/1.1.1.1:80”,就表示让浏览器对IP地址位1.1.1.1的这台服务器上的TCPIP传输管道的80号端口发起http请求,也就是浏览网页,同样,如果是telnet这个应用,那就要连接对方的23端口。所谓“端口”,就是被TCPIP协议用来区分每个从管道中传出去或者收进来的数据包,到底是哪个上层应用的,哪个应用在“监听”某个端口,那么TCPIP就将对应的数据包(数据包中含有端口号信息)发送到这个应用对应的缓冲区,正因为TCPIP是个公用传输通道,谁都可以利用它来可靠传输数据到网络另一端,所以才会用“端口号”来区分不同的发起数据传输的应用。
同样,iSCSI也要监听3326这个端口号。SCSI指令和数据,作为“客人”,需要被TCPIP这架“飞机”运载到目的地,SCSI本身并不关心也不想去关心诸如从哪个登机口(端口号)登机、行李托运、安检、海关交涉等一系列问题,于是需要有一个代理或者说引导者来完成这些动作,这个角色就是iSCSI Initiator和iSCSI Target。
早期的SCSI协议体系其实从物理层到应用层都有定义的,网络层也有定义,比如一条总线最大16个节点,每个节点有Target模式和Initiator模式。但是后期SCSI体系的下四层被其他协议取代,iSCSI+TCPIP+以太网相当于取代了下四层,所以SCSI上三层不需要自己去发现网络里的节点和Target了,这些都由iSCSI这个代理去完成。
首先iSCSI Target端运行在存储系统一侧或者说想要把自己的磁盘空间让别人访问的那一侧,其作用是接收iSCSI Initiator端传输过来的SCSI协议指令和数据,并将这些指令和数据转交给自己这一侧的SCSI协议栈(其实是Class Driver或者SCSI Middle Layer)处理;iSCSI Initiator端运行在想要获得存储空间,也就是主机一侧,其目的是向iSCSI Target端发起连接,并传输SCSI指令和数据。在iSCSI Initiator端程序中需要配置所需要连接的iSCSI Target端的IP地址(或者使用一种叫做iSNS的服务来动态自动无需手工配置来发现iSCSI Target),iSCSI Initiator会主动向这些IP地址的3326端口号发起iSCSI Login过程(注意这个动作不是SCSI协议定义的,完全是iSCSI这个代理程序自己定义和发起的动作),Login过程所交互的细节此处不做细表,iSCSI Target端响应Login之后,双方在iSCSI层就连通了。iSCSI连通之后,Initiator会主动向Target发起一个SCSI Report Lun指令,Target变向Initiator报告所有的Lun信息,拿到Lun列表之后,Initiator端主动发起SCSI Inquery Lun指令查询每个Lun的属性,比如设备类型(磁盘?磁带?光驱?打印机?等等)和厂商之类,然后Initiator端便向OS内核注册这些Lun。(这里要注意一下,这两条SCSI指令是Initiator写死的,不需要经过其上层的SCSI层)。 OS内核便针对每个Lun加载其各自的驱动(Windows下就是Class Driver,Linux下就是Block Driver/Tape Driver等),便在对应的/dev/下生成各自的设备。所以,iSCSI Initiator其实是一个虚拟的Port Driver,其通过调用TCPIP,TCPIP再继续调用底层网卡Port Driver实现数据发送。
FC也是一个网络,也是替代了传统SCSI协议栈的下四层,FC也不是为了专门承载SCSI协议才被发明的,那么利用FC网络发送SCSI协议的那个应用程序或者说角色是什么?就是俗称“FCP”的一个协议,相当于FC体系下的一个应用,也就类似TCPIP体系下的FTP、Telnet等一样。FTP要发起连接传文件,首先要向对方的TCP端口号21发起连接,同样,利用FC传输SCSI指令的FCP,同样也需要向对方FC Target端某个特定端口号发起连接,FC Target端的某个程序正在监听这个端口的一切动作。那为何主机端不需要安装FCP Initiator程序呢?其实FCP的Initiator程序就是集成在了FC适配卡的驱动里了,因为FC的HBA卡目前来讲专门给存储用,所以直接集成到驱动里,不需要额外安装,而以太网则不同,厂商不可能自带iSCSI Initiator或者Target程序,所以一般都是独立开发独立安装。另外,FC协议也像TCPIP协议一样有类似“端口号”的概念,只不过没有像TCPIP这样被广为人知罢了,所以用FC承载任何上层应用都是可以的,当然,需要你自己去开发了。同样,SAS网络里也是这样一套运作流程,利用SAS网络承载SCSI协议,需要SSP发起端和目标端,同样,也被集成到了驱动里。

本文介绍了iSCSI如何利用TCP/IP协议进行SCSI指令和数据的传输。iSCSI作为应用层协议,监听3326端口,充当SCSI协议与TCP/IP之间的代理。在iSCSI Initiator和Target之间,Initiator负责发起连接,Target接收并处理指令。通过iSCSI Login建立连接后,Initiator通过发送SCSI Report Lun和Inquiry Lun指令获取并注册Lun信息。FCP在FC网络中起到类似作用,但通常集成在FC适配卡驱动中。
2375

被折叠的 条评论
为什么被折叠?



