LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4110|回复: 8

About iSCSI RFCs

[复制链接]
发表于 2005-1-10 17:06:33 | 显示全部楼层 |阅读模式
My boss ask me to learn every detail in iSCSI.
As I'm reading RFC3720 (iSCSI) these days, I'm wondering if there is a Chinese version of RFC3720?
If the answer is no, may be I could try translate it, just for fun...

No Chinese input system, pls bear my English..
发表于 2005-1-13 22:37:15 | 显示全部楼层
很感兴趣,ipsan很有前途,个人感觉,想学习一些。网上具体技术方面的资料不多,尤其中文的。大都是一些概念、优势、方案之类的。很需要些具体的东西。
 楼主| 发表于 2005-1-15 13:43:57 | 显示全部楼层
Good. I'm going to post my work resently. pls be patient.
Hopfully, This will benifit the both of us.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-27 11:03:00 | 显示全部楼层
因为这个是我为了学习,自己翻译的,我不能担保翻译的准确,如果要学iSCSI的协议,建议还是看英文的RFC。
先传第五章吧。

5. 登录和全功过程中的交涉

iSCSI参数的交涉可以发生在两个过程:可以在会话或连接建立时通过登录请求和响应来交涉;也可以在全功过程中通过文本请求和响应。双方的交涉在这两个过程交换的都是一对iSCSI-text-key=value文本。在本文中,我们把iSCSI-text-key简称为key。

key可以是一个值的声明,也可以是对值的请求交涉值,从它的具体表述隐示可以看出它是这两种中的哪一种。

对于用于声明的key,声明的一方为key设定一个值。该key的使用说明里介绍了哪些key可以为initiator所声明,而哪些可以为target所声明,或者是双方都可以声明。

对于请求交涉的key,请求方在key=value中给出一个key的值,key=value可以在登录或文本请求或响应里的数据部分中给出。另外的一方,决定是否使用该给定的值,或是否使用给定的值的中的一个,并把该值放于登录或文本请求或响应PDU中的key=value中。对于大多数的key来说,initiator和target都可以是交涉请求的发起者。

登录的过程分两个阶段 - 安全交涉阶段和操作参数交涉阶段。这两个阶段都是可选的,但至少有要有一个阶段,用以设置一些必须的参数。

如果有安全交涉阶段,它必须发生在操作参数交涉阶段之前。

从一个阶段进入下一阶段是由登录请求/响应PDU包头里的T(Transition)位来控制的。
initiator通过把T位设为1,表明它希望传输。Target在准备好后同意传输(并选择下一阶段)。在Login PDU包头中的一个字段将表示连接的当前阶段(CSG),另一字段用于表明请求进入的下一阶段(NSG),这一阶段将交由target选择是否进入。

文本交涉过程用于交涉和声明操作参数。交涉过程用PDU中的F (final) 位来控制。在文本交涉过程
中,initiator用F位来标识它已经准备好结束交涉,target以F位来默许交涉的结束。

由于某些key=value可能在单个PDU里装不下,在这种情况下,可以用C (continuation)位来标明还
有后继的PDU。

文本交涉过程中增加了一种机制,用来让target传送更多的数据给initiator。Target Task Tag,由
target发给initiator,并从initiator返回给target,如同一个书签,意为“继续”。如果重置为一个
“neutral value”,则表示“不用管后面的包”。

本章细述了各种key和数值,参数格式的文法规则,以及用于交涉不同类型参数的机制。

5.1. 文本格式

Initiator和target发送的是一系列用UTF-8 Unicode编码的key=value对。所有key都使用在本文档标
识的文本key和文本数值的表示方式,而且是大小写敏感的。

本文档中使用的下列的字符,用于构成文本项(十六进制数值表示Unicode编码):

(a-z, A-Z) - 字母
(0-9) - 数字
" " (0x20) - 空格
"."  (0x2e) - 点
"-"  (0x2d) - 减号
"+"  (0x2b) - 加号
"@"  (0x40) - commercial at
"_"  (0x5f) - 下划线
"="  (0x3d) - 等号
":"  (0x3a) - 冒号
"/"  (0x2f) - solidus or slash
"["  (0x5b) - 左中括号
"]"  (0x5d) - 右中括号
null (0x00) - null separator
","  (0x2c) - 逗号
"~"  (0x7e) - tilde

key=value配对可以存在于PDU整个范围内。如把文本或登录的请求或响应里的C位设为1,意味着initiator
或target将在一个PDU内传送部分的key=value配对,并在后续的PDU里继续传送。一系列承载数据片断
的PDU中的C位,除在最后一个PDU中设为0,其它均设为1。如果由单个PDU传送完整的key=value配对,
则C位设为0,表示该PDU为一个logical-text-data-segment (LTDS)。

包括在LTDS中最后或唯一的的每一对key=value,必须以一个空字符 (0x00)结束。

key名是在第一个"="的前面的任何字符串。术语key将在本文档中代表key-name。

数值是在第一个"="号后面的任何字符串,不包括结束符null。

下面的定义将被用于本文档的余下部分:

     standard-label: A string of one or more characters that consist of
       letters, digits, dot, minus, plus, commercial at, or underscore.
       A standard-label MUST begin with a capital letter and must not
       exceed 63 characters.

     key-name: A standard-label.

     text-value: A string of zero or more characters that consist of
       letters, digits, dot, minus, plus, commercial at, underscore,
       slash, left bracket, right bracket, or colon.

     iSCSI-name-value: A string of one or more characters that consist
       of minus, dot, colon, or any character allowed by the output of
       the iSCSI string-prep template as specified in [RFC3722] (see
       also Section 3.2.6.2 iSCSI Name Encoding).

     iSCSI-local-name-value: A UTF-8 string; no null characters are
       allowed in the string.  This encoding is to be used for localized
       (internationalized) aliases.

     boolean-value: The string "Yes" or "No".

     hex-constant: A hexadecimal constant encoded as a string that
       starts with "0x" or "0X" followed by one or more digits or the
       letters a, b, c, d, e, f, A, B, C, D, E, or F.  Hex-constants are
       used to encode numerical values or binary strings.  When used to
       encode numerical values, the excessive use of leading 0 digits is
       discouraged.  The string following 0X (or 0x) represents a base16
       number that starts with the most significant base16 digit,
       followed by all other digits in decreasing order of significance
       and ending with the least-significant base16 digit.  When used to
       encode binary strings, hexadecimal constants have an implicit
       byte-length that includes four bits for every hexadecimal digit
       of the constant, including leading zeroes.  For example, a
       hex-constant of n hexadecimal digits has a byte-length of (the
       integer part of) (n+1)/2.
      
     decimal-constant: An unsigned decimal number with the digit 0 or a
       string of one or more digits that start with a non-zero digit.
       Decimal-constants are used to encode numerical values or binary
       strings.  Decimal constants can only be used to encode binary
       strings if the string length is explicitly specified.  There is
       no implicit length for decimal strings.  Decimal-constant MUST
       NOT be used for parameter values if the values can be equal or
       greater than 2**64 (numerical) or for binary strings that can be
       longer than 64 bits.

     base64-constant: base64 constant encoded as a string that starts
       with "0b" or "0B" followed by 1 or more digits or letters or plus
       or slash or equal.  The encoding is done according to [RFC2045]
       and each character, except equal, represents a base64 digit or a
       6-bit binary string.  Base64-constants are used to encode
       numerical-values or binary strings.  When used to encode
       numerical values, the excessive use of leading 0 digits (encoded
       as A) is discouraged.  The string following 0B (or 0b) represents
       a base64 number that starts with the most significant base64
       digit, followed by all other digits in decreasing order of
       significance and ending with the least-significant base64 digit;
       the least significant base64 digit may be optionally followed by
       pad digits (encoded as equal) that are not considered as part of
       the number.  When used to encode binary strings, base64-constants
       have an implicit
       byte-length that includes six bits for every character of the
       constant, excluding trailing equals (i.e., a base64-constant of n
       base64 characters excluding the trailing equals has a byte-length
       of ((the integer part of) (n*3/4)).  Correctly encoded base64
       strings cannot have n values of 1, 5 ... k*4+1.

     numerical-value: An unsigned integer always less than 2**64 encoded
       as a decimal-constant or a hex-constant.  Unsigned integer
       arithmetic applies to numerical-values.

     large-numerical-value: An unsigned integer that can be larger than
       or equal to 2**64 encoded as a hex constant, or
       base64-constant.  Unsigned integer arithmetic applies to
       large-numeric-values.

     numeric-range: Two numerical-values separated by a tilde where the
       value to the right of tilde must not be lower than the value to
       the left.

     regular-binary-value: A binary string not longer than 64 bits
       encoded as a decimal constant, hex constant, or base64-constant.
       The length of the string is either specified by the key
       definition or is the implicit byte-length of the encoded string.

     large-binary-value: A binary string longer than 64 bits encoded as
       a hex-constant or base64-constant.  The length of the string is
       either specified by the key definition or is the implicit
       byte-length of the encoded string.

     binary-value: A regular-binary-value or a large-binary-value.
       Operations on binary values are key specific.

     simple-value: Text-value, iSCSI-name-value, boolean-value,
       numeric-value, a numeric-range, or a binary-value.

     list-of-values: A sequence of text-values separated by a comma.

     如果没有特殊标明,simple-value的最大长度(指的不是它的编码表示)是
     255字节,不包括分隔符(逗号或空字节)。
     
     任何iSCSI target和initiator必须支持在交涉序列中接收至少8192字节的
     key=value数据。当提交或接受的认证方法显式要求使用很长的认证项,
     initiator和target必须支持至少64k字节的key=value数值(见附录11.1.2 -
     简单公钥证书)
     
5.2.  文本模式的交涉

     在登录中或其后的过程里,可以通过交换文本信息来声明或交涉一些会话和
     连接参数。
     
     initiator以文本或登录的请求来启动声明或交涉过程,也用同样的方法表示
     它准备完成声明交涉过程(通过把文本/登录请求中的F位/T位设为1)。由
     于交涉的文本可以存在于整个PDU的范围内,如果文本/登录的请求/响应中的
     C位设为了1,则F/T位就不能设为1。
     
     target若收到C位为1的文本/登录的请求/响应,必须以无数据片断
     (DataSegmentLength 0)来回答。若initiator收到C位为1的文本/登录的请求
     /响应,必须以无数据片断(DataSegmentLength 0)来回答。
     
     除非是为一般或特定key的交涉所要求,target和initiator不应该使用一个没
     有数据片断的文本/登录的请求/响应。
     
     声明的格式如下:
     
     声明者-> <key>=<valuex>
     
     一般情况下的文本交涉格式如下:
     
     提出者-> <key>=<valuex>
     接受者-> <key>={valuey>|NotUnderstood|Irrelevant|Reject}
     
     由此看出,声明是一个单向的文本交换,而交涉是一个双向交换。
     
     提出者或声明者可以是initiator和target,同样,接受者可以是initiator
     也可以是target。Target在响应initiator给出的key=value配对时没有限制,
     Target可以提出自己的key=value配对。
     
     所有的交涉都是显式的(即,结果必须基于交换或声明的数值)。没有隐式
     的提交方式。保守的设计同样要求默认数值不应当让后继的有严重影响的数
     值对其有依赖性。
     
     提交和定义的数值可以是数字值,用分隔于"~"的上限和下限定义的数字值的
     范围,二进制值,文本,iSCSI-name-value,iSCSI-local-name-value,
     boolean-value (Yes or NO),或一系列用逗号分隔开的文本。范围,
     large-numerical-value,iSCSI-name-value以及iSCSI-local-name-value只
     有在显式同意的情况下才可以使用。
     
     如果指定的key和当前的交涉无关,接受者可以用常量"Irrelevant"回应所有
     的交涉。然而,回应"Irrelevant"并不代表交涉失败。回应"Irrelevant"说
     明接受者选择的key与提交者提供的一系列的key无关。下面的例子演示了一
     个使用"Irrelevant"的情形:
     
   I->T OFMarker=Yes,OFMarkInt=2048~8192
   T->I OFMarker=No,OFMarkInt=Irrelevant

   I->T X#vkey1=(bla,alb,None),X#vkey2=(bla,alb)
   T->I X#vkey1=None,X#vkey2=Irrelevant
   
   accept可以忽略任何它不理解的key。对于不理解的key的回应必须是
   key=NotUnderstood。
   
   常量"None","Reject", "Irrelevant",以及"NotUnderstood"为保留使用,
   而且只能在本文描述的情形下使用。违犯这一原则将导致协议错误的发生(
   如,把"Reject","NotUnderstood", "Irrelevant"用于提交的数值)。
   
   Reject和Irrelevant在允许的情形下是合法的交涉选项,但不建意对他们过度
   使用。在接受者回应了key=value配对后,即便回应的数值为"Reject",
   "NotUnderstood",或"Irrelevant",交涉都被认为已完成的。重新发送key,
   将被认为是重新交涉,这对许多的key来说是不允许的。
   
   如果接受者发出了"Reject"作为回应,key将保持它原来的数值(如果没有设置
   过,将被设为默认数值。如果当前数值对于提交者发送时所在的发送时会话和连
   接是不能接收到的,提交者可以选择终止该会话或连接。
   
   除了X扩展格式,所有本文中提到的key,都必须被initiator和target所支持,
   并用本文档介绍的方法使用。如果在本文档说明的方法下使用这些key,接受方
   不可以用"NotUnderstood"回应。
   
   协议的实现者可以用一个"X-"的前缀,后面接上域名,定义新的key。使用IANA
   前缀X#也可以用于定义新的key。比如,一个拥有exmaple.com的网络实体可以
   发出:
   
           X-com.exmaple.bar.foo.do_something=3
       
   又或者,把一个新注册的key用于:
   
           X#SuperCalyPhraGilistic=Yes

       
   协议的实现者也可以定义新的数值,但新的数值只能用于新的key或认证机制上
   (见11节,iSCSI安全文本key和认证机制),或解析(见12.1节,包头解析和
   数据解析)。
   
   当参数的动作或接受某个参数时,要依赖于其它的参数,依赖的规则和参数的
   次序必须在参数中指明。
   
   在登录过程(见第5.3节,登录过程),每一阶段都是一个独立的交涉。在全功
   过程中,一个文本请求响应序列是一个交涉。交涉必须作为原子操作来处理。
   比如,在交涉成功达成一致或由于失败而被忽略后,所有的交涉后的数值都必须
   开始生效。
   
   某些参数中可能有一致性的规则(如,parameter-x不能超过parameter-y,或
   paramter-u不为1表示parameter-v为yes)。如果有这样的需要,一致性的规则
   必须在key中表明。必须在所有的参数都可用后(现有的和新交涉出的),才检
   查参数是否符合一致性规则。iSCSI target必须在新参数生效前进行一致性检查
   。Initiator可以选择进行一致性检查。
   
   iSCSI initiator和target可以在交涉未能在一个合理的时间或次数内结束时,
   选择终止该交涉。
   
5.2.1.  列举交涉

   在列举交涉中,发起方发送以优先级为序的一系列的数值(可能包含有"None")
   。
   
   响应方必须以相同的key以及列表中第一个它所支持的(也是指定的发起者同意
   的)数值作为响应。
   
   常量"None"必须只用于表示缺失的功能上。而且,"None"只有在发起方提供的列
   表中存在时才能被使用。
   
   如果接受方不理解列表中任何一个数值,它必须忽略这个数值。如果接受方不支
   持,不理解,或不允许使用提交方列表中的任何一个数值,它可以选择使用常量
   "Reject"或结束该交涉。选择一个列表中不存在的数值必须被认为是协议错误。
   
5.2.2.  简单数值交涉

  对于简单数值交涉,接受方必须以相同的key作为回应。接受方选择的数值将作为
  交涉的结果。
  
  当一个不允许的数值(如,没有在一个指定的范围内)被提交时,接受方可以
  选择以"Reject"常量作为回应,又或者选择一个允许的数值。
  
  当一个接受方选择了不允许的数值,将导致协议错误。选择的规则是针对特定的
  key的。
  
  对于数字值的范围,数值的选择必须在提交出的指定的范围内,或是"Reject"(
  如果该范围是不可接受的)。
  
  对于布尔值的交涉(即,这些交涉的结果是赋有Yes或No的key),接受方必须回
  应以相同的key和交涉的结果,收到的数值并不决定交涉的结果。传回的最终数值
  成为交涉的结果。回应数值的选择规则定义在接收到布尔函数中被定义,或是在
  给定的数值中作一个选择。
  
  特别地说,在以下两种情形下,回应是可选的:
  
    -  布尔函数为"AND"且返回的数值为"No",交涉的结果为"No"。
    -  布尔函数为"OR"且返回的数值为"Yes",交涉的结果为"Yes"。
   
  所有情形下,响应都是必须的,接受方选择并发回的数值将作为交涉的结果。
  
5.3.  登录过程

  登录过程在initiator和target之间建立一个iSCSI连接;同时建立一个新的会话
  ,或把接连维系到一个已有的会话。登录过程设置iSCSI协议参数,安全参数,同
  时在initiator和target之间相互认证。
  
  登录过程只通过登录请求和响应来实现。整个的登录过程被认为是单个的任务,
  并拥有一个独立的Initiator Task Tag(就如有维系的SCSI命令)。
  
  登录中使用默认的MaxRecvDataSegmentLength。
  
  登录过程中,请求和响应的顺序如下:
  
    -  登录初始请求
    -  登录部分请求(可选的)
    -  更多的登录请求和响应(可选的)
    -  登录最终响应(必须的)
   
  任何连接的登录初始请求必须包含InitiatorName key=value配对。第一个连接的
  登录初始请求可能包含SessionTyep key=value配对。对于会话中的不是
  "Discovery"的连接,登录初始请求必须包含Targetname key=value配对。
  
  登录最终响应接受或拒绝登录请求。
  
  登录过程可以包含安全交涉阶段(SecurityNegotiation stage)和登录操作交涉
  (LoginOperationalNegotiation)阶段。这两个阶段都是可选的,但需要至少有其
  中的一个阶段。被包含的阶段可以是空的,except for the madatory names。
  
  在登录请求和响应中有一个字段(CSG)表明当前的交涉阶段(SecurityNegotiation
  or LoginOperationalNegotiation)。如果在登录过程中两个阶段都有,安全交涉
  阶段必须在登录操作阶段之前进行。
  
  有些操作参数可以在登录过程后的文本请求和响应中交涉。
  
  安全交涉必须在登录过程内完成。安全交涉使用的IPsec安全协议在第8章和
  [RFC3723]里介绍。iSCSI支持的协议内的安全机制,只包含在登录时的认证过程
  中。
  
  在某些环境里,target和initiator不关心对相互的认证。这种情形下,可以过
  在登录请求和响应里的认证。
  
  initiator和target可能要交涉iSCSI认证参数。一旦交涉完成,该通道就被认为
  是安全的。
  
  大部分的认证key只能在指定的阶段里使用。安全交涉key出现于第11章,登录操
  作交涉key出现于第12章。有限的一些key可以在这两个阶段里使用。
  
  任何特定的登录请求和响应属于一个指定的阶段;这决定了请求和响应中允许的
  交涉key。如果某个key用于不允许的阶段,将被认为是一个协议错误。
  
  阶段的转换在一个载有T位和相同的CSG码的命令的交换(请求/响应)中进行在
  这个交换中,后继的阶段在targer在"next stage"码(NSG)里标明。选择出的NSG
  不可以超过initiator声明的数值。initiator可以在它准备好后发出一个转换请
  求,但target只有在initiator发出请求后才能对转换给出响应。
  
  在交涉的序列里,一对登录请求/响应的T位对下一对登录请求/响应的T位没有影
  响。如果initiator把一对登录请求/响应的T位设为1,但得到T位的响应,可以把
  下一个请求的T位设为0。
  
  当initiator请求,target响应的时候,双方都切换到已选择的阶段。
  
  Target不可以提交任何需要另一来自initiator的登录请求的T位为1的参数。
  
  在登录中的阶段转换(包括进入和退出)在下列表格中的情形下才可以发生:
  
  +------------------------------------------------------------------+
   |从     开始->   | 安全          |  操作           | 全功             |
   |                              |                   |                     |                      |
   | V                           |                   |                     |                      |
   +-----------------------------------------------------------------+
   | (开始)            |  yes           |  yes             |  no                |
   +-----------------------------------------------------------------+
   | 安全                |  no            |  yes             |  yes              |
   +-----------------------------------------------------------------+
   | 操作                |  no            |  no               |  yes              |
   +-----------------------------------------------------------------+
  
   接受登录请求的最后响应只可以对于登录请求的一个T位为1的响应,同时,请求和
   响应双方都必须通过NSG表示接受下一阶段为全功过程。
   
   Initiator和target都不可以尝试对同一个参数声明或交涉多次,除非对选定的key的
   响应显式允许多次声明(如,TargetAddress)。Target和initiator必须能发现其它
   不允许的参数进行重定义和重声明。如果这样的尝试被target发现了,target必须给
   以予一个拒绝登录的响应(initiator错误);如果是initiaotr发现了,则必须丢弃该
   连接。
   
5.3.1.  登录过程的开始
   
   登录过程以一个从initiator发往target的登录请求开始。初始的登录请求包括:
   
     -initiator支持的协议版本
     -iSCSI initiator名和iSCSI target名
     -ISID,TSIH,和连接IDs
     -initiator准备进入的交涉阶段。
     
  一个登录过程可以建立一个新的会话,或是将一个连接加入到一个已有的会话中。
  在一个给定的iSCSI节点(只由InitiatorName标识出)和一个由iSCSI TargetName和
  Target Portal Group Tag定义的的iSCSI target之间,可能的登录结果在下表中定义:
  
  
  +------------------------------------------------------------------+
   |ISID      | TSIH        | CID    |     Target action               |
   +------------------------------------------------------------------+
   |new       | non-zero    | any    |    登录失败                      |
   |              |                    |           |     ("会话不存在")          |
   +------------------------------------------------------------------+
   |new       | zero           | any    |    初始一个新会话           |
   +------------------------------------------------------------------+
   |existing | zero          | any     |     进行会话重申明         |
   |              |                   |           |     (见第5.3.5节)              |
   +------------------------------------------------------------------+
   |existing  | non-zero  | new    |     把一个新连接加入到 |
   |               | existing    |            |     会话中                         |
   +------------------------------------------------------------------+
   |existing  | non-zero  |existing|     进行连接重申明        |
   |               | existing    |             |    (见第5.3.4节)             |
   +------------------------------------------------------------------+
   |existing  | non-zero   | any     |         登录失败                |
   |               | new           |            |     ("会话不存在")         |
   +------------------------------------------------------------------+
   
   "existing"还是"new",由target判定。
   
   登录请求中还可以选择包含以下内容:
   
   -安全参数
   或
   -iSCSI操作参数
   和/或
   -initiator准备进入的两个交涉阶段
   
   target可以用以下的方式回应登录请求:
   
    -带有登录拒绝的登录响应。这是一个发自target的直接拒绝,会导致连接的终止,
    并且,如果使请求的连接是会话中的唯一的连接,该会话将被终止。T位,CSG和
    NSG字段在这种情况下被保留。
    -以登录接受作为登录的最后响应(T位为1,且请求和响应中的NSG皆为
    FullFeaturePhase)。响应包含有target支持的协议版本,会话ID,也可能含有
    iSCSI操作或安全参数(取决于当前所在的阶段)。
    -以登录接受作为登录的部分响应(请求和响应中的NSG不全为FullFeaturePhase)
    ,这说明将开始一系列的交涉。响应包含有target支持的协议版本,以及安全或
    iSCSI参数(在选择不使用安全机制的情形下)。
   
   如果initiator决定放弃安全交涉阶段,它把登录请求中的CSG设为LoginOperational-
   Negotiation,同时,target可以用一个登录响应来表明它不想接受没有安全交涉的
   连接(见第10.13节,登录响应),并以认证失败的响应来终止连接(见第10.13.5
   节,状态类和状态细节)。
   
   如果initiator愿意交涉iSCSI安全,但不愿意作初始参数的提交,同时可以接受没有
   iSCSI安全的连接,它发出T位为1,CSG为SecurityNegotiation,NSG为
   LoginOperationalNegotiation。如果target也准备忽略安全机制,那么在登录响应中
   只包含有TargetPortalGroupTag key(见第12.9节,TargetPortalGroupTag),T位为
   1,CSG为SecurityNegotiation,以及NSG为LoginOperationalnegotiation。
   
   如果initiator选择不带iSCSI安全的操作,且所有的操作参数都为默认值,它会发出
   这样的一个登录请求:T 位为1 ,CSG为LoginOperationNegotiation,以及NSG为
   FullFeaturePhase。如果target也准备忽略安全和完成它的LoginOperationNegotiation
   ,则登录响应的T位设为1,CSG为LoginOperationNegotiation,下一阶段的NSG为
   FullFeaturePhase。
   
   在登录过程中,iSCSI target必须在第一个登录响应PDU中返回
   TargetPortalGroupTag key,这在所有给定了TargetName,且响应不为重定向的的
   会话中都是允许的(即,第一个登录响应在第一个C位为0的登录请求后发出)。
   TargetPortalGroupTag key的值表示服务于登录请求PDU的iSCSI接口组。如果在一
   个特定的情形下,要考虑重新配置iSCSI接口组,iSCSI intiator应该使用这个key来
   确定它的登录请求已经发给了它想与之通信的target接口组。
   
5.3.2. iSCSI安全交涉
  
  安全交换设置安全机制,并且在initiator和target进行相互认证。针对交涉过程采用
  的认证机制,交换的过程通过使用登录请求和响应中的'key=value'来实施。
  
  intiator用以下方法引导交涉过程:
  
   -intiator在登录请求中发出一个它支持的(认证机制)选项的有序列表。这些选项
   以initiator的优先次序排列。initiator也可以发送私有或公有的扩展选项。
   
   -对于initiator指定的选项列表,target必须回复以它所支持且允许的第一个选项,
   除非它全都不支持,这种情形下,target应以"Reject"回应(见第5.2节,文本模式
   的交涉)。这些参数用UTF8格式编码。要了解安全参数,见第11章。
   
   -当initiator认为它准备好完成安全交涉阶段,就把T位设为1,并把NSG设为它想进
   入的下一阶段。target在完成安全keys的交换后,将会在登录响应中把T位设为1,
   并把NSG设为它想进入的下一阶段。选择好的下一阶段取决于target的响应。如果
   下一阶段为FullFeaturePhase,target必须回应以一个载有TSIH值的登录请求。
   
   如果安全交涉在target端失败了,target必须发出合适的登录响应PDU。如果安全
   交涉在initiator处失败了,initiator应当关闭连接。
   
   应当注意,如果initiator支持安全机制但并未准备好引导交涉时(Propose Option),
   则交涉可能由target来引导。
   
5.3.3.  登录过程中的操作参数交涉

  登录过程中的操作参数交涉可能是:
  
   -在第一个登录请求后即开始,如果initiator并没有提交安全/一致性的选项。
  
   -在安全交涉后即开始,如果initiator和target进行了安全交涉。
  
  操作参数交涉可能包含几对登录请求和响应的交换,这些交换由initiator发起和终止
  。initiator必须以T位为1来表明它终止交涉的意图;target在最后的响应中把T位设为
  1。
  
  如果对于T位为1的登录请求,target以T位为0的响应回复,则如果initiator想切换阶
  段,它就应该一直发送T位为1的登录请求(即便是空的请求),直到接收到T位为
  1的响应,又或者收到一个要求它把T位设为0的key。
  
  一些会话特定参数只能在会话的第一个连接(如,以一个包含一个值为0的TSIH的
  的登录过程)中被指定。- 最先前的登录过程(如果,该会话有最大数量的连接)
  
  会话在至少一个连接为FullFeaturePhase的情形下,为可操作会话。新的或是被替换
  的连接只能在该会话为可操作后,才能被加入到该会话。
  
  了解操作参数,见第12章
  
5.3.4. 连接重申明

  连接重申明是这样的一个进程:当initiator以一个ISID-TSIH-CID联合体登录,但对
  于target看来,该连接已在活动中,从而造成对于该CID的连接的隐式注销,且重申
  明一个新的全功态的iSCSI连接来替换该活动中的连接。因此,连接重申明中的登录
  PDU中的TSIH为非0,且CID为变。若旧连接在没有在先前时显式注销,登录请求令
  则会令其注销。在只有一个连接的会话中,这可能意味着建立一个新的连接 ,
  用于替代并clean up先前旧的连接。当target不支持多个全功态的连接时,也必须在
  ErrorRecoveryLevel为2时支持开启第二个连接,在ErroRecoveryLevel小于2时,可
  以选择支持开启第二个连接。
  
  如果操作中的ErrorRecoveryLevel为2,连接重申明支持未来的任务重指派。如果操
  作中的ErrorRecoveryLevel小于2,连接重申明做旧CID的替代,而不做任务重申明
  。在这种情形下,target并不事先通知initiator,对于所有在旧CID的活动的任务,
  必须立即被终止。
  
  当initiator尝试连接重申明时,initiator连接状态必须为CLEANUP_WAIT
(第7.1.3节)。

实在地说,重申明是在进行一个新的连接的登录在基础上,对旧连接做隐式的注销


5.3.5 会话重申明,关闭,以及超时

  会话重申明是当initiator以一个在target眼中为活动中的ISID登录时发生的进程。因
  此,相应于ISID的会话的隐式注销和重申明一个替代旧会话的新的iSCSI会话(拥
  有相同的ISID)。所有,会话重申明里,登录PDU中的TSIH为0。会话重申明导致
  旧会话里所有活动中的任务的立即终止,此过程中,target不会事先通知initiator。
  
  当initiator尝试会话重申明时,initiator会话状态必须为FAILED(见第7.3节,会话
  状态表)。
  
  会话的关闭是下述事件之一:
  
  -成功的"会话关闭"注销。
  -当会话中没有其它等待cleanup的连接,也没有任务等待重指派时,对于该会话中
  最后一个全功态的连接的成功的"连接关闭"注销。
  
  会话超时是在会话中没有任务等待重指派,且最后一个连接状态超时的事件。这使
  该会话处于FREE状态(会话状态表中的N6传输?)。
  
5.3.5.1 连结通知的丢失

 当以下任一事件发生之时,iSCSI层给SCSI层提供”I_T nexus loss”的通知:

a) 会话重申明的成功完成。
b) 会话关闭事件。
c) 会话超时事件。

 有些SCSI对象清理动作可能由SCSI结点的通知而发生,见附录F。
 - Target中几种事件的清理效果 -。

5.3.6. 会话的延续和失败

 会话的延续是这样的一种进程,它标明先前存在的会话将继续在连接重申明中使用,或用
新的CID添加一个连接。这些动作以该会话状态维系于新的传输连接中。

 会话失败是这样的一种事件,当全功过程进入CLEANUP_WAIT状态(见第7.2节,initiator和
 target的连接清理状态表),或是完成一个成功的恢复注销,因此导致所有活动中的任务
 (这些任务在先前曾被维系于连接中)开始等待被重指派。

5.4. 在登录过程之外进行操作参数的交涉

 一些操作参数可能在登录过程之外(之后)交涉

 在全功阶段中的参数交涉用文本请示和响应来进行。由initiator用同一个initiaotr任务标签发起
 和终止,操作参数交涉可以包含多个文本请求/响应的交换。initiator在表明要终止交涉的时候,
 必须把F位设为1,而target必须在最后的响应里把F位设为1。

 如果对于F位为1的一个文本请求,target给予F位为1的响应,而且initiator还想终止交涉,则
 initiator应当一直发送F位为1的文本请求(即便为空),直到它收到F位为1的响应。不主张对
 于一个F位为1的请求,用F位为0的空响应(没有key=value对)。

 target不能对依赖于其它参数的文本请求回复以F位为1的响应。

 在交涉序列中,一对文本请求/响应对中的F位设置与下一对里的F位设置无关。当一个initiator
 发出F位为1的请求,收到F位为0的响应后,可能在下一请求里把F位设为0。

 当target作出了F位为0的响应,则必须把target传输标签设置为默认值0xffffffff以外的值。

 在收到一个载有值不为0xffffffff的target传输标签后,initiator可以发出载有值为0xffffffff的target传输
 标签的文本请求来重置一个操作参数交涉。target可以用拒绝PDU来回复文本请求,以重置一
 个操作参数交涉。

 在插入操作参数交涉的重置之前,initiator和target都不应多次声明或交涉同一参数,除非是响
 应一个显式允许多次声明的key(如,TargetAddress)。如果多次声明或交涉同一参数的情形
 被target发觉,target必须发出原因码为"protocol error"的拒绝PDU,对于initiator,则用上面介绍
 的方法重置交涉。

 通过进行一交换交涉系列的参数交涉过程,只有在交涉系列完成后,参数才能生效。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-27 11:06:38 | 显示全部楼层
因为这个是我为了学习,自己翻译的,我不能担保翻译的准确,如果要学iSCSI的协议,建议还是看英文的RFC。


6. iSCSI错误处理和恢复

6.1 总观

6.1.1 背景

        以下两点考虑导致了大部分iSCSI错误恢复机制的设计:
i)        就算iSCSI的PDU已在TCP层上接收到了,它们也可能在包解析检察的时候发生错误并被丢弃。iSCSI层必须能够选择是否修复这些被丢弃的PDU。
ii)        在数据传输时,TCP连接可能在任意时刻发生错误。所有活动中的任务必须能够选择是否在同一session内的另一TCP连接中继续进行。

在考虑支持错误恢复的程度时,具体实现有相当的弹性,包括何时使用何种机制来达到相应的需要。只有错误处理机制的外部表征必须被标准化用以保证各个具体实现的互操作性。
        这一章勾画了一个为支持恢复的互操作性的一般模型。见附录E 错误恢复类的算法介绍 - 以了解这些模型可以是如何实现的。兼容的具体实现不需要符合这些模型的实现细节,但它们的外部表征必须必须与这些模型相一致。

6.1.2.        目标

iSCSI错误恢复设计的主要目标如下:
a)        定义一组可供iSCSI具体实现采用的错误恢复机制,以符合不同的需要。
b)        当不同的具体实现拥有不同的错误恢复功能时,保证它们之间的互操作性。
c)        为要求次序(demand ordering)的initiator定义错误恢复机制,以保证错误发生时的命令次序。
d)        不对fast path有所增加,允许在错误恢复路径(error recover path)中有适当的复杂度。
e)        防止initiator和target同时对同一组PDU尝试错误恢复。如,在initiator和target之间,必须有一个清晰的“分布错误恢复功能”。

6.1.3.        协议特性和状态(state)表述

在有错误恢复的连接中的initiator机制如下:

a)        NOP-Out用以探测target发出的序列号(sequence numbers) (10.18)
b)        命令重发(command retry) (6.2.1)
c)        支持Recovery R2T (6.7)
d)        使用SNACK机制请求status/data/R2T的重传 (10.16)
e)        确认数据的接收 (10.16)
f)        为一个不同的TCP连接再指定任务的连接维系 (6.2.2)
g)        终止并重启iSCSI会话(6.1.4.4)

在有错误恢复的连接中的target机制如下:

a)        NOP-In用以探测initiator发出的序列号(sequence numbers) (10.19)
b)        使用R2T请求数据的重发
c)        支持SNACK
d)        Requesting that parts of read data be acknowledged (section 10.7.2)
e)        支持维系的重指派
f)        终止iSCSI会话,以强迫initiator重新建立连接。

对任意未完成的SCSI命令,我们假定iSCSI以及initiator中的SCSI,保有可以重建命令PUD的足够信息;当命令未完成时,主机内存中的流出数据(outgoing data)也是可用的。我们也假定在target中,流入数据(incoming data)能被保存以便于重新被设备服务器读入。

我们更进一步地假定如果target支持状态重传(status retransmission)能为一个命令保存它执行后的“status & sense”。一个支持数据重传(data retransmission)的target应当准备好将被重传的流出数据,直到该已完成命令的状态被确认,或请求的数据已被分别确认。

6.1.4.        恢复类别

iSCSI支持以下恢复类别(以它们对iSCSI任务的影响范围增大的次序排列):

-命令内恢复(即,不必重发命令)
-连接内恢复(即,不必重建连接,但可能要重发命令)
-连接恢复(即,可能需要重建连接,命令也要被重新发出)
-会话恢复

本节描述的恢复类别的规定是具有代表性的,而不是唯一的强制性的。在每一情况下,可以尝试最低等级的恢复类别。哪些恢复类别将被实现,以及在什么情况下交由上层恢复类别处理的问题,都交由协议的实现者做决定。iSCSI的initiator和target都可能把错误操作提升到上层恢复类别,这将影响更多的iSCSI任务。这些情况我们会在下面再作介绍。

在每个类别中,如果要排除target中的ACA或类似的影响时,协议的实现者可以选择把错误推延给SCSI initiator。

在连接进入Full Feature Phase之前,不能尝试连接内和命令内恢复。

在恢复类别的详细描述中,如果该恢复类别被支持并使用,“必须,应当,可能”等术语表示被标准化执行的动作。

6.1.4.1.        命令内恢复

在target端,以下情形将导致命令内恢复:

- 数据PDU的丢失   由以下情形得知:
a)        数据的解析错误   用在6.7节中介绍的Recovery R2T解决。
b)        序列接收超时 - (无数据或partial-data-and-no-F-bit) - 被认作是序列错误并用6.8节中介绍的recovery R2T解决。
c)        包头的解析错误,由序列接收超时或序列接收错误得知 - 用6.8节中介绍的recovery R2T解决。

在initiator端,以下情形将导致命令内恢复:
a)        数据的解析错误 - 用在6.7节中介绍的SNACK解决
b)        序列接收超时(无状态)或响应接收超时 - 用6.8节中介绍的SNACK解决
c)        包头的解析错误,由序列接收超时或序列接收错误得知 - 用6.8节中介绍的SNACK解决。
为了避免和target竞争,当一个recovery R2T或终止响应已经发出时,initiator在自身内部超时的情况下(如果有的这种情况),不应该发出基于R2T的SNACK。在这种情形下,恢复工作由target来解决更好些。

Initiator和target的超时取值不在本文档的讨论范围之内。序列接收超时一般是一个足够大的数值,以便于完成数据序列的传输。

6.1.4.2.        连接内的恢复

在initiator端,下列情形将导致它们发生连接内的恢复

- 请求在很长的一段时间里没有得到确认。请求是由ExpCmdSN显式确认或由接收数据或状态隐式确认的。Initiator可能重发未被确认的命令,见6.2节,恢复的重发和重指派。
- iSCSI有序响应的丢失。这是从响应PDU/流入数据PDU中的数据的解析错误,或是从接收到一个大于statSN而被发现的。对于前者,解析错误由6.7节介绍的“发生解析错误时的SNACK”解决;而对于后者,由6.8节介绍的“发生序列错误时的SNACK”解决。

在target端,下列情形将导致它们发生连接内的恢复

- 状态/响应在很长的时间里没有得到确认。Target可能发出一个NOP-IN(用一个合法的target传输标签等),其中载有target将写于StatSN项的下一个状态序列号。这能帮助initiator检测一个或多个丢失的StatSN,并发出一个对应于该状态的SNACK。

Initiator和target中使用的超时取值(timeout value)不在本文档的讨论范围之内。

6.1.4.3.        连接恢复

在iSCSI initiator端,下列的情形将导致它们发生连接恢复:

- TCP连接失败:initiator必须关闭连接。然后initiator必须隐式或显式地,以原因号“remove the connection for recovery”来注销该失败的连接;对于每一个还在该失败连接中活动的命令,使用命令管理功能中的“任务重指派”把它们对于连接的维系重新指派到一个或多个新的连接中。对于一个initiator中的命令,如果它还未接收到响应或带有状态的流入数据PDU时,该命令还在活动中。

注意:注销功能是必须的。但是,只有在该失败连接是会话中唯一的连接时,才必须建立新的连接。

- 接收到一个表示一个或多个连接已丢失的异步消息。Initiator必须以TCP连接失败的情形来对对待这个(这些)连接。

对于iSCSI target,下列情形将导致它们发生连接恢复:

- TCP连接失败。Target必须关闭该连接,并且,如果还有另外的连接可用,target应该发送一个异步消息,表明它丢失了该连接。然后,target等待initiator重新恢复连接。

6.1.4.4 会话恢复

会话恢复应该在其它恢复都失效的情形下发生。最简单的initiator和target可能用会话恢复所解决所有的iSCSI错误,并依赖SCSI或其它的上层协议。

一旦initiator响应了该SCSI服务,会话恢复意味着关闭所有的TCP连接,在内部取消在指定的initiator和target中所有执行中或请求中的任务,并在一系列新的TCP连接上重新建立一个会话(建立TCP连接并登入所有新的连接)。

对于SCSI和iSCSI中会话恢复中的影响的消除,它们的可能的现实方法见附录F,target中各事件的影响的消除

6.1.5.        错误恢复的结构

至今我们描述的错误恢复类是以一种易于维护和受限制的结构来组织起来的。通过几个良好定义的等级,很容易做到(各实现的)互操作性。这个结构的属性有:
a)        每一级都是都是上一级中的功能的超集。比如,支持第1级表示能支持第0级中的所有的功能,并有所增加。
b)        很自然地,如支持更高级的错误恢复,则表示完备性的增加并有可能要求使用更多的资源。
c)        ‘N’级的错误恢复的支持,能通过在每个iSCSI实体之间交换test key “ErrorRecoveryLevel=n”,被互相通知。交换的两个ErrorRecoveryLevel中,较低的一个将作为会话的恢复级。
下图代表了恢复的等级结构:
                          +
                          /
                         / 2 \       <-- 连接恢复
                      +-----+
                      /   1     \     <-- 解析失败恢复
                    +---------+
                   /     0         \   <-- 会话失败恢复
                  +-------------+

下表列出了实现协议时,各错误恢复级应有的错误恢复功能:
   +-------------------+--------------------------------------------+
   |错误恢复级                         |  相应的错误恢复功能                                                            |
   +-------------------+--------------------------------------------+
   |        0                  |  会话恢复类                                                                   |
   |                           |  (6.1.4.4节,会话恢复)                                                |
   +-------------------+--------------------------------------------+
   |        1                  |  解析失败恢复 (见下面的注释)                                         |
   |                           |  加上等级0中的功能                                                       |
   +-------------------+--------------------------------------------+
   |        2                  |  连接恢复类                                                                 |
   |                           |  (6.1.4.3节, 连接恢复)                                             |
   |                           |  加上等级1中的功能                                                       |
   +-------------------+--------------------------------------------+

注意:解析失败是由连接内恢复类(6.1.4.2节,连接内的恢复)和命令内恢复类(6.1.4.1节,命令内的恢复)组合而成的。

当文本交涉中的一方提出一个已定义的ErrorRecoveryLevel,提出者必须支持该级中定义的功能,并支持该级以下级别支持的功能。当一个已定义的ErrorRecoveryLevel被响应方返回时,响应方必须支持它所接受的ErrorRecoverLevel。

如任何一方尝试使用交涉出的恢复级以外的功能,恢复可能失败;除非双方在此之前达成了相应的协定;这种情形不在本文档讨论范围之内。

协议的实现者必须支持错误恢复级“0”,而其它恢复级是可选的实现。以上starition表示下面的各级要求的附加的功能完善:
   +------------------+---------------------------------------------+
   |传输级                                   |  附加的要求                                                            |
   +------------------+---------------------------------------------+
   |        0->1       |  在本连接中重传PDU                                                                         |
   +------------------+---------------------------------------------+
   |        1->2       |  跨连接间重传,以及重指派 allegiance                              |
   +------------------+---------------------------------------------+

6.2.        恢复中的重发和重指派

这一节总结了在错误恢复中用到的,两种重要而且与iSCSI有一定关系的协议特性

6.2.1.        重发的用法

在缺失一个命令的确认或响应时,initiator可以重发该包含有相同的iSCSI命令PDU(retry)或响应,用以尝试“填补”失序的命令队列中的空缺。由解析错误而丢弃的命令PDU,可能产生这种失序。

重发不能用于填补命令序列空缺之外的情形,特别地,也不可用于请求从target处重传PDU。所有这些为载有某个活动中的已有维系的命令的PDU的请求重传,可以用10.16节中的SNACK机制完成,尽管SNACK的使用是可选的。

如果initiator,作为上面描述的填补命令序列过程中的一部分,不巧发出了已发过的已有维系的命令的重发请求(如,target看不见在CmdSN序列中的不连续),这一重复的命令将被target默默忽略(见3.2.2.1.节)

当一个iSCSI命令被重传,这个命令PDU必须载有原先的Initiator Task Tag和操作参数(如,标志,函数名,LUN,CDB等)以及原CmdSN。这个被重传的命令必须象原来的命令那样,用原连接发出,除非原连接已经被成功地注销。

6.2.2.        维系的重指派

当发出一个“任务重指派”的命令管理请求(10.5.1节,功能)时,inititator发出自己期望继续已有的活动中的命令的信息,作为连接恢复的一部分。这表示,为了这些(个)命令发出了一个新的连接的维系,它将这些(个)命令维系于命令管理请求所在的那个连接中。在尝试对一个任务进行维系重指派前,对于前一个任务已维系于的连接,必须事先以“remove the connection for recovery”为原因码的隐式或显式地完成注销。

在为一个命令重指派连接维系时,target应该使该命令以当前的状态继续下去。如,当重指派读命令,target应该利用由命令管理功能请求提供的ExpDataSN字段(如没有数据传输,该字段必须设为0),发送剩余的数据和状态以完成读命令。DataSN被赋以ExpDataSN,用以对从前的(但不包括当前的)流入数据(Data-In)再运行确认。然而,如target不能恢复或维持现有的状态时,target可能选择在重新指派连接维系时,发送/接收所有已确认的数据或所有的数据。Initiator不能在其后为了序列小于ExpDataSN的PDU(如,先于已确认的序列号),用数据SNACK请求数据重传。对于所有的命令类型,在initiator端看来,一个重指派的请求表示某个任务仍然在活动中,如果target对该重指派返回“Function Complete”的响应,target必须适当地终止该任务。如有需要,这可能包含数据/R2T/状态PDU的重传,但必须包含(重)传输状态PDU。

可以选择是否让target支持维系重指派。这个功能通过一个值为“ErrorRecoveryLevel”的text key,在登录时交涉。当target不支持维系重指派时,它必须给予一个“Allegiance reassignment not support”的任务管理响应码作为响应。如果target支持维系重指派,但任务已指派给另一连接,又或者前一个被维系的连接没有被成功地恢复注销,target必须给于一个“Task still allegiant”的任务管理响应码作为响应。

如果target支持维系重分配,对维系重分配的任务管理响应必须在重指派生效前被发出。

如果包含数据输入的SCSI命令被重指派,任何它所持有的原连接中的最终响应里的SNACK标签必须被删除,并替代以0。

6.3.        恢复中拒绝PDU的使用

Target不能隐式地以在任务生命周期中通过交换一个拒绝PDU的形式来终结一个活动中的任务。如果target决定要终结某个任务,它必须返回一个响应PDU来结束这个任务。如果该任务在被拒绝前不曾活动过(如,拒绝是在命令PDU中被发出),因为命令自己本身已被放弃,target应该向它发送任何其它响应。

以下的规则表示,如果收到的拒绝是对于一个PDU而不是对于命令PDU本身,无论如何,initiator能收到一个拒绝的响应。一个非命令的拒绝在错误日志中只有诊断值,这些值能被用于让initiator决定是否重传。

就算被拒绝的命令PDU的CmdSN可能是很可靠地已被确定了,target也不能认为已接收到该这个被拒绝的命令PDU(如果它是一个non-immediate命令)的CmdSN(即,要保留这个CmdSN的空缺)。在收到拒绝时,initiator必须用传输一个载有相同CmdSN的命令PDU,又或是取消该任务,来填充序号缺口。(见6.9节,如何用取消任务来填充序号缺口)

当一个数据PDU被拒绝,但它的DataSN能被确定,target必须为当前数据流增加ExpDataSN,以保证恢复R2T的进行。就算Target不打算恢复丢失的数据PDU,它也可能增加ExpDataSN。

6.4.        连接超时管理

iSCSI定义了两种会话范围内的超时取值(以秒为单位)
-Time2Wait和Time2Retain - 被应用于一个iSCSI的全功时段由于有意或意外地需要被维护时。Time2Wait是一个倒计时,用来计算尝试一个隐式或显式注销一个CID或对一个受影响的任务(如果有的话)做重指派前的时间。Time2Retain是一个缓冲时间,用来计算target为了进行一个可能的恢复工作,而对某任务或一个(多个)连接状态继续维护的时间。对连接和任务的恢复尝试不应当在Time2Wait规定的时间前进行,而且必须在等待了Time2Wait规定的时间后,在Time2Retian规定的时间内完成。

6.4.1.        异常传输事件的超时

如果没有事先用iSCSI协议交互机制对iSCSI两端再进行通知,就关闭或重启一个连接,将导致一个全功时段的iSCSI连接的突然终结。在这种情形下,会话中的text key中超时取值用的是默认的defaultTime2Wait的值(12.15节,DefaultTime2Wait)和DefualtTime2Retian(12.16节,DefualtTime2Retian)。

6.4.2.        有计划的终断的超时

任何对全功时段的iSCSI连接的有计划的终断,必须用注销响应PDU或异步消息PDU来进行。注销响应PDU中的Time2Wait和Time2Retain字段,以及异步消息中的Parameter2和Parameter3字段(AsyncEvent types “drop the connetion” or “drop all the connections”; 10.9.1节)规定了这两种情形下的超时取值。

这些超时取值只能用于受影响的连接,以及在该连接上的活动中的任务。在指定的连接中,这些超时取值对initiator中已经有的连接和任务中的计时器没有影响。

6.5.        任务的隐式终止

对以下情形,target以iSCSI协议动态地隐式终止一个活动中的任务:

a)        当一个连接已经隐式或显式地以原因码“Close the connection”注销,并且有活动中的任务维系于该连接。
b)        当一个连接失效,该连接状态已经超时(见7.2.2节,initiator和target的状态传输描述,里的状态传输M1),并且还有活动中的任务维系于该连接。
c)        当一个还有活动中的任务维系的连接以原因码“recover the connection for recover”被成功注销,并且这些任务已经在Time2Wait和Time2Retain后超时了,也没有重指派任务维系。
d)        当一个连接被隐式或显式地以一个“Close the session”的原因码注销了,并且还有活动中的任务在此连接中。

如果某些任务在以述a),b),c) 和d)的情形中是SCSI任务,它们必须用CHECK CONDITION状态被内部终止。这个状态只有在适当地处理内部SCSI状态和关于序列的SCSI副加影响(side effects)时才得有意义的,因为这个状态将不会再被通信,而是作为initiator的一个终止状态。然而,附加的活动可能在SCSI层发生,视乎于SCSI标准定义的上下文(如,在情形a),b),c)中的队列命令和ACA),在这些任务被终止后,target在下一个命令中必须报告Unit Attention情况,这个命令将对于每一个受影响的I_T_L nexus而发出,带有CHECK CONDITION状态和取值为“SOME COMMANDS CLEARED BY ISCSI PROTOCOL EVENT的ASC、ASCQ。见[SAM2]和[SPC3])。

6.6.        格式错误

以下两种对PDU格式规则的显式违犯,被认是格式错误:

a)        除Opcode外的任何PDU包头字段中的非法内容(合法的数值中第10节,iSCSI PDU格式,中定义)
b)        不一致的字段内容(一致的字段内容在第10节,iSCSI PDU格式,中定义)

格式错误表明(iSCSI)中的某一端中有实现上的错误。

当target或initiator接收到一个有格式错误的iSCSI PDU时,必须以连接关闭来终止会话中的所有连接,或以连接重置来把错误恢复上升到会话恢复级(见6.1.4.4节,会话恢复)

6.7.        解析错误

对于下面关于合法的解析错误解决方法的讨论,由于会话恢复是一个显式选项,并不包括在讨论里;但检测到解析错误的任何一端都可以选择把错误恢复上升到会话恢复级。

当target或initiator收到有包头解析错误的iSCSI PDU,必须丢弃包头以及截止至下一个PDU的所有数据,或者必须关闭该连接。因为解析错误表明包头中的数据报长度字段可能已经损坏,下一个PDU的起始地址必须被可靠地确定,比如载有一个异步或导向层的操作的PDU。

当target收到任何有payload解析错误的iSCSI PDU,必须给出载有原因码为Data-Digest-Error的一个拒绝PDU作为响应,并丢弃该PDU。

- 如果被丢弃的PDU是请求或非请求iSCSI数据PDU(对于命令PDU中的即时数据,使用非数据PDU规则),target必须做以下的一种动作:
a)        以一个Recovery R2T请求重指派。
b)        以一个载有CHECK CONDITION状态和“protocol service CRC error”iSCSI状况(见10.4.7.2节,含意数据)的响应PDU终止该任务。如果target选择实现这个选项,必须一直等候至所有数据(由一个对于所有未完成R2T而发出的,带有终止位的Data PDU发出) 都收到后,才能发出响应PDU。由initiator发出的任务管理命令(如一个已取消的任务)在这一等候阶段也可能终结这一任务。
-        对于target,如果丢弃的PDU是一个非数据PDU,它不需作任何动作。万一丢弃的PDU里带有即时数据,该即时数据会被隐式地恢复,因为在该任务结束时,该即时数据会附加于全部数据传输后。

当initiator收到任何带有payload解析错误的iSCSI PDU,必须丢弃该PDU。

- 如果被丢弃的PDU是一个iSCSI数据PDU,initiator必须做以下的任一种动作:
a)        通过SNACK请求需要的数据。在SNACK的响应中,target必须返回数据PDU来响应SNACK请求,或用带有原因码为“SNACK reject”的拒绝PDU来拒绝SNACK请求。拒绝可能在以下情形下发生:
i)        如果该命令的状态还没有被送出,target必须以一个带有CHECK CONDITION状态和“SNACK Rejected”的iSCSI状况(见10.4.7.2节,含意数据)的命令终止该任务。
ii)        如果状态已经被送出,target不需要再做任何动作。在这种情形下,initiator必须在状态已经被接收前一直等候,然后将该状态丢弃,使得在内部发出一个CHECK CONDITION的完成状态和“protocol service CRC error”iSCSI状况。
c)        取消任务,并以一个错误终结该命令

- 如果丢弃的PDU是一个响应PDU,initiator必须做以下的一种:
a)        以一个状态SNACK请求PDU重传。
b)        为恢复连接而注销该连接,并在另一连接中继续该任务,见6.2节,恢复中的重传和重指派。
c)        注销以关闭该连接(取消所有维系于该连接的命令)。

- 如果丢弃的PDU是非请求PDU(如,异步,拒绝),initiator不必做任何动作。就如target等候注销一样,initiator以任务超时来等候命令的完成,这样可以保证丢弃PDU时,这些情形都有可以有正确的操作行为。

6.8.        序列错误

当initiator接收到一个乱序的iSCSI R2T/数据PDU,这些PDU应该是带有乱序的R2TSN/DataSN,也可能是带有表明有丢包情况的ExpDataSN。这就表示,initiator一定能知道从前收到的R2T/数据PDU中有包头或数据的解析错误。Initiator必须将其标明为6.7节中描述的一个数据PDU的解析错误。当target收到一个乱序的DataSN,表明target一定在之前收到的数据PDU中遇到了数据解析错误。Target必须将其标明为6.7节中描述的一个数据PDU的解析错误。

当initiator收到一个乱序的iSCSI状态PDU,这说明它丢失了某些响应。Initiator必须将其标明为6.7节中描述的一个状态PDU丢失的解析错误。作为收到丢失响应的副作用,initiator可能检测到数据PDU的丢失。如果intitiator打算恢复该命令中的丢失的数据,它不能在收到与此命令有关的所有数据前,确认从这个命令的StatSN以后的所有PDU。

当initiator收到重复的R2TSN(产生于target重复传送的活动中R2T)或重复的DataSN(产生于initiator前一个活动的SNACK),它必须丢弃这些重复的包。

6.9.        SCSI超时

iSCSI initiator可能在ULP超时前,以重发未确认命令的方式,企图在target端填补一个命令序列的空缺(产生于从ExpCmdSN中察觉到的命令确认的缺失),见6.2节描述的恢复中的重发和重指派。

当一个命令(载有序号为n的CmdSN)发生ULP超时的时候,如果iSCSI initiator打算继续该会话,则必须为该命令发出一个合适的任务管理功能的请求,或者必须以“close the connetion”注销。当使用ABORT TASK时,如果ExpCmdSN仍然少于(n+1),target可能在没收到丢失的命令前就看到取消的请求,这有可能产生于以下原因:

- 原命令由于解析错误而被丢弃。
- 原命令所维系于的连接已被注销。如果是这样,已注销的连接里的未确认命令将被丢弃。

如果收到了取消请求,但却没有原命令,target必须认为带有RefCmdSN原命令已被收到,并发出一个以“Function Complete”为响应码的任务管理响应。这一响应将在两端终止该任务。如果收到了取消命令的请求,并且target可以查出该命令已被执行,而且在此之前已发出了响应(由Referenced Task Tag看出),target必须以“Task Does Not Exist”的响应码作出响应。

6.10.        交涉失败

当使用于设置/交涉操作参数时,文本请求及响应序列是交涉/参数设置的一个组成部分。交涉失败被认为可能由以下的一个或多个原因产生:

- 标明的,或可选的数值都不能被交涉的双方所共同接受。
- 文本请求已超时,并有可能已被终止
- 文本请求被回复以一个拒绝PDU

下面的两个规则用于标明交涉失败:

- 在登录时,交涉中出现的错误必须被认作为登录失败,并且必须终止登录过程和其所在的连接。如果target检测到该错误,必须以一个适当的登录响应码终止登录过程。
- 在全功过程中和交涉错误,将导致整个使用同一Initiator Task Tag的交涉序列的终结,包括一系列的文本请求。在此之前的交涉里商定的会话或连接中的可选参数将继续被使用(即,其它不未被成功商定的参数不能生效,必须被丢弃)。

6.11.        协议错误

把一帧帧的消息传输在一个象TCP这样的“流”连接里,使iSCSI这种机制因为软的帧错误而变得脆弱。从另一角度来看,这种帧机制的引入也限制了那些在简单的实现里可以出现的性能问题的发生,从而降低了系统的繁重性。命令序列号,上述的连接丢失机制,以及重建机制,可以帮助解决这些错误。

任何对本文档描述的PDU交互序列规则的违犯,也被视为协议错误。这一类的错误只能通过修改具体实现来解决;iSCSI定义了拒绝码和响应码来支持这些解决方案。

6.12.        连接失败

如果在initiator和target之间还有至少一个适时(timely)的TCP连接,则iSCSI可以保持一个会话的操作状态。通过来自传输层的通知,命令序列的空缺,命令在长时间内未能得到响应,或者是一个iSCSI NOP(作用类似于ping)的失败,target和initiator可以感知连接的失败。在后者(iSCSI NOP),可以被用于周期性地增加传输速率或者是检测连接失败。Initiator和target也可以使用TCP连接中的keep-alive选项来支持早期的链接失败,idle链接除外。

在连接失败时,initiator和target必须做以下的一个或多个动作:

- 在会话内尝试连接恢复(见6.1.4.3节,连接恢复)

- 以原因码“closes the connection”来注销该连接(见10.14.5节,隐式的任务终止),重发丢失的命令,并隐式地终止所有活动中的命令。这一选项要求连接内恢复级(见6.1.4.2 在连接内恢复)的支持。

-产生会话恢复(见6.1.4.4节,会话恢复)。

iSCSI的两端都可以选择把恢复级升级到会话恢复(通过在initiator端丢弃所有连接,或通过在target端发出有相同作用的异步消息),而且两端都必须给它一个优先权。当连接失败发生时,target必须终止并且/或者丢弃所有活动中的即时命令,不管使用的是上面介绍的哪个选项(即,即时命令在连接失败中是不可以恢复的)。

6.13.        会话错误

如果会话里的所有连接全部失效,且不能在短时间内重新建立,又或者initiator检测到持续的协议错误,initiator可以选择终止该会话,并建立一个新的会话。

在这种情形下,initiator做以下的几件事:

- 重置或关闭所有传输连接。
- 在建立一个新会话前,用一个合适的响应终止所有未完成的请求。如果打算重建一个相同的I_T nexus,initiator必须采用会话重申明(见5.3.5节)

当在targe端发生会话超时(最后一个连接也因超时而失效),它做以下的几件事:

- 重置或关闭所有TCP连接(关闭会话)。
- 终止所有维系于该会话中的连接的命令。

Target必须准备解决来自initiator的会话重申明的请求,这种请求发生时意味着会话错误的发生。
回复 支持 反对

使用道具 举报

发表于 2005-1-27 15:35:32 | 显示全部楼层
      :thank  :thank  :thank
支持!
回复 支持 反对

使用道具 举报

发表于 2005-3-2 11:31:07 | 显示全部楼层
支持,继续!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-17 16:14:50 | 显示全部楼层
呵,最近开始写代码了,翻译的事慢了下来,我还需要一点时间。。。:)
回复 支持 反对

使用道具 举报

发表于 2008-7-9 11:27:51 | 显示全部楼层
为什么不翻译了呢 ?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表