linux I/O棧 之 SCSI TARGET (2) iscsi target-<1>協議

      1、iSCSI  概念

    

    我把iscsi target作爲TARGET的第一篇來講,主要因爲很多人知道I/O導出協議,也都是第一個想到iscsi。

    iscsi是什麼。首先,我們來講講它的概念。

    

SCSI,小型計算機系統接口,是基於client-server模型設計的存儲接口,SCSI的client(initiator)將命令發送給server(target),server處理命令後迴應result給client。由於要傳送命令必然要用到相應的傳輸協議保障,iSCSI就是其中的一種傳輸協議,除此之外還有FC和SAS等。

iSCSI是SCSI over IP縮寫,它使用TCP/IP協議來傳遞SCSI命令與響應,其借用現有成熟廉價的以太網來實現SCSI通訊,成本低,管理和使用非常方便。

iSCSI有initiator和target兩個部分,分別對應於SCSI的initiator和target,iSCSI的initiator與target使用TCP進行傳輸協議實現了SCSI的initiator與target之間的數據傳輸。


2、iSCSI 協議基本概念

SCSI target中包含許多LU(邏輯單元),每一個SCSI命令都有其目標LU,這些LU負責對針對其的SCSI命令進行處理與響應。iSCSI的命令單元是PDU,在iSCSI initiator端,PDU包含SCSI initiator下發給其的LUN(邏輯單元號碼)及SCSI命令(CDB),PDU被作爲TCP的playload傳遞到iSCSI target端後由SCSI target core根據LUN將SCSI命令投放到目標LU中,LU在處理命令後把響應結果遞交給SCSI target,SCSI target再將其遞交給iSCSI target,iSCSI target把result封裝成iSCSI PDU,再使用TCP回傳給iSCSI initiator,iSCSI initiator再將結果遞交給上層。

image.png

        3、iSCSI 協議用到的概念

        

iSCSI Device

利用iSCSI協議傳遞服務子系統的SCSI設備,典型的就是IP-SAN了。

iSCSI Node

iSCSI節點表示一個iSCSI啓動器或者iSCSI目標器。在一個網絡實體裏,可能有一或者多個iSCSI節點。可以通過一個或者多個網絡端口訪問iSCSI節點。iSCSI節點的標識是iSCSI名稱。把iSCSI名稱和地址分開來後,允許多個iSCSI節點使用同一個地址,或者一個iSCSI節點使用多個地址,它是組成IP-SAN fabric的基本單元。

Network Entity

     網絡實體。它表示一個可以通過IP網絡訪問的設備或者網關。一個網絡實體必須有一或者多個網絡端口,包含在該網絡實體內的iSCSI節點可以用這些端口來訪問IP網絡。

Network Portal

網絡端口。網絡實體的一個組成部分,它有一個TCP/IP地址。網絡端口在initiator用IP地址標識,在target用IP地址+偵聽的TCP端口標識。

Session

連接initiator和target的一組TCP連接構成一個session(可以簡單理解爲I_T nexus)。可以向session添加TCP連接,也可以把TCP連接從session刪除。通過一個session的所有連接,initiator只看到同一個target。

Connection

    一對TCP連接。Initiator和target之間可以使用一或者多個TCP連接通信。

CID(Connection ID)

一個session裏的每個connection用CID進行標識,該標識在session範圍內是唯一。CID由initiator產生,在login請求和使用logout關閉連接時傳遞給target。

Portal Groups

網絡端口組。iSCSI session支持多連接,一些實現能把通過多個端口建立的多個連接捆綁到一個session。一個iSCSI網絡實體的多個網絡端口被定義爲一個網絡端口組,把該組和一個session聯繫起來,該session就可以捆綁通過該組內多個端口建立的多個連接,再使它們一起協同工作以達到捆綁的目的。每一個該組的session並不需要包括該組的所有網絡端口。一個iSCSI節點可能有一或者多個網絡端口組,但是每一個iSCSI使用的網絡端口只能屬於iSCSI節點的一個組。

Portal Group Tag

網絡端口組標識。使用16比特的數標識一個網絡端口組。在一個iSCSI節點裏,所有具有同樣組標誌的端口構成一個網絡端口組。


 I_T nexus

I_T nexus是指一個SCSI initiator的端口和一個SCSI target端口之間的關係。對於iSCSI,這個關係對應一個session,它指session的initiator端和iSCSI target網絡端口組之間的關係。I_T nexus的標識是一對端口名稱(iSCSI initiator名稱+i+ISID,iSCSI target名稱+t+網絡端口組標識)。

PDU (Protocol Data Unit): initiator和target之間通信時把信息分割爲消息。這些消息稱爲iSCSI PDU。

SSID (Session ID)

iSCSI initiator和iSCSI target之間的session用SSID進行標識,該標識由initiator部分的ISID和target部分的TPGT構成。ISID由initiator在session建立的時候明確給出,TPGT隱含的由建立連接時選擇的網絡端口確定。當TargetName給定後,建立連接的過程中,target必須把TPGT關鍵字當作確認信息發送出去。

TSIH (Target Session Identifying Handle): Target分配給與特定名稱initiator建立的session的標識。但是0被保留着用於initiator告知target這是一個新session。在爲一個session添加一個connect時,TSIH已經隱含指明。


        4、iscsi網絡映射關係

在SCSI arch中,一個Device(SCSI initiator或者SCSI target)可以包含多個ports,一個SCSI initiator port和一個SCSI target port之間的聯結就是一個I_T nexus,一個SCSI initiator port和一個SCSI target port之間只允許建立一個I_T nexus。

I_T nexus對應與iSCSI中的一個session(normal),SCSI target port對應於iSCSI target中的一個portal group(具有相同tag的一組ports,iSCSI target在這些ports上進行監聽等待iSCSI initiator的連接登陸login,所有這些ports一起支撐一個I_T nexus),SCSI initiator port對應於iSCSI initiator中的session(normal)的端口,如下圖所示。

image.png

一個iSCSI節點只能有且只有一個SCSI設備;只能通過正常運行的iSCSI session訪問SCSI設備;SCSI名稱也就是iSCSI節點的名稱。

SCSI initiator端口,它被映射到一定正常運行的iSCSI session的一端。在login過程中,一個iSCSI initiator節點和一個iSCSI target節點協商建立一個正常運行的session;當session成功建立後,一個隸屬於iSCSI initiator設備的SCSI initiator端口被創建(虛擬出一個port)。SCSI initiator端口的名稱和標識被定義爲: iSCSI initiator name + i+ ISID標識。

對於iSCSI,SCSI initiator端口和SCSI target端口的定義是不一樣的。iSCSI target端口,映射爲iSCSI target的一個網絡端口組中。

iSCSI target端口名稱和標識:都被定義爲:iSCSI target name + t + iSCSI target PGT(port group tag)。


       5、iSCSI協議中的命名及標識和登錄過程

每個iSCSI initiator或者iSCSI target都有一個全球唯一的名稱,對於iSCSI initiator稱爲initiator name,對於iSCSI target稱爲target name。

iSCSI target中的port group使用port group tag來標識;

session在iSCSI initiator端使用ISID(initiator session identifier)標識,在iSCSI target端使用TSIH(target session identifier handle)標識。

四、session和connection的狀態劃分及登陸登出。對於connection,有兩種狀態,即login phase(登陸狀態)和full function phase(全功能狀態),登陸狀態即iSCSI initiator與iSCSI target正處於登陸協商過程;全功能狀態即登陸過程已經完成,該connection已經能爲上層SCSI提供服務。Session與connection一樣也有login phase和full function phase,當session中僅有的一個connection處於登陸狀態時,session處於登陸狀態,當session至少有一個connection處於全功能狀態時session處於全功能狀態。

iSCSI initiator登陸到iSCSI target的過程分三個過程:

1)  首先是iSCSI initiator往iSCSI target發送initial login請求,請求中包括iSCSI initiator支持的協議版本、iSCSI initiator name和iSCSI target name、ISID和TSIH及CID;

2)  其次是安全協商,也就是chap認證之類,用於iSCSI initiator和iSCSI target互相之間的授權認證;

3)  最後是操作參數協商,用於協商在全功能時期的一些通訊參數。

有兩種登出方式,一種是iSCSI initiator主動發出logout請求,在收到iSCSI target的logout響應後完成登出;另一種就是iSCSI target發送包含“request logout”的Async協議數據包,啓動器再發送logout請求。

       image.png

       5、iSCSI PDU

        

1. 一個Basic Header Segment(BHS,48字節);

2. 可選地n(任意)個Additional Header Segment(AHS,長度不固定,字節數爲4的整數倍(不夠必須填補0),iSCSI target發往iSCSI initiator的PDU中不包含AHS);

3. 可選地一個Header Digest(頭校驗信息,4個字節);

4. 可選地一個Data Segment(數據段,長度不固定,字節數爲4的整數倍(不夠必須填補0));

5. 可選的一個Data Digest(數據校驗信息,4個字節)。

        image.png

        5.1 BHS(Basic Header Segment格式

        image.png

            

1. I bit:1bit,標識本PDU爲需要馬上發送;

2. Opcode操作碼:6bit,標識本PDU的類型;

   (1)由iSCSI initiator發往iSCSI target的請求PDU opcode 

        

        0x00 NOP-Out
        0x01 SCSI Command (encapsulates a SCSI Command Descriptor Block)
        0x02 SCSI Task Management function request
        0x03 Login Request
        0x04 Text Request
        0x05 SCSI Data-Out (for WRITE operations)
        0x06 Logout Request
        0x10 SNACK Request
        0x1c-0x1e Vendor specific codes


(2)由iSCSI target發往iSCSI initiator的相應PDU opcode 

        0x20 NOP-In
        0x21 SCSI Response - contains SCSI status and possibly sense information or other response information.
        0x22 SCSI Task Management function response
        0x23 Login Response
        0x24 Text Response
        0x25 SCSI Data-In - for READ operations.
        0x26 Logout Response
        0x31 Ready To Transfer (R2T) - sent by target when it is ready to receive data.
        0x32 Asynchronous Message - sent by target to indicate certain special conditions.
        0x3c-0x3e Vendor specific codes
        0x3f Reject

3. F bit:1bit,標識本PDU爲一個PDU序列中的最後一個;

4. Total AHS Length:1byte,本PDU中所有AHS的長度,以4字節爲單位,包括可能需要填補的0(padding);

5. Data Segment Length:3byte,本PDU中數據段的長度,以字節爲單位,不包括可能需要填補的0(padding);

6. LUN:如果此(命令/響應/數據)PDU與具體的LU相關聯,則使用LUN(Logical Unit Number)標識該LU;

7. Initial Task Tag(ITT):在一個session中使用ITT標識iSCSI initiator發起的任何iSCSI任務,凡是與某iSCSI 任務相關聯的PDU,不管是由iSCSI initiator發出的還是由iSCSI target發出的,都攜帶該iSCSI 任務相應的ITT,這個ITT就是scsi cmd的命令標識符,它代表一個scsi cmd。

    

    6、pdu的傳輸

  6.1 SCSI read命令

    ① iSINI(iscsi initiator)發送 SCSI cmd pdu(OP=R,F=1)給iSTGT,①pdu seq結束

    ② iSTGT向ISINI發送data pdu和respone pdu。

      data pdu包含三次datain pdu,dataSN(seq number)在遞增,並且在最後一個標記F=1,pdu seq結束。

      response pdu會帶着ExpDataSN,它代表此次iSCSI taget已發送的DATA PDU的個數。

   image.png

        

            6.2   SCSI寫命令

              iscsi 寫命令的流程,包括立即數據和非立即數據的兩種情況。

              ① iSINI 發送scsi cmd pdu(op=w,F=0,I=1(immediate)),包含立即數據。

                 iSINI dataout pdu(DataSN=0,F=1) 值得是當前的dataout seq結束。

              ② 接下來的流程就是r2t(ready to transfer)和dataout的交互。


image.png


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章