6 FIX 会话层测试用例和期望行为
6.1 Applicability 适用性
本文档在2002年9月20日最后被修订,当时的FIX协议的最新版本为带有20020930的扩展的FIX 4.3 。此文当适用于FIX4.X,除非特别说明。
6.2When to send a Logout vs. when to just disconnect何时发送Logout与仅断开连接
一般情况下,一个Logout消息应在关闭一个连接前发送。如果这个Logout消息是源于一个错误条件,Logout的Text域应提供错误原因的描述,为远端FIX系统提供问题诊断的操作支持。这里有2个例外,推荐不发送Logout消息:
1、在登陆阶段,如果会话发起者的SenderCompID,TargetCompID或IP其中一个无效时,推荐立即终止会话,不发送Logout消息。这个登陆尝试有可能使一个未经授权的破坏系统的未认证尝试,因此,企业不希望泄露其FIX系统的任何信息,如,哪个SenderCompID,TargetCompID是有效的,或所支持的FIX版本。
2、在登陆阶段,当一个有效的FIX会话已经被一个企业使用时,该企业的第2次连接尝试的Logon消息被接受时,推荐会话接收者立即中断该第2次连接尝试,不发送Logout消息。发送一个Logout消息将冒着妨碍和影响当前FIX连接的风险。例如:在一些FIX实现系统中,发送一个Logout消息可能会消耗一个序列号,这样将会导致在一个已经建立的FIX会话中的序列号混乱。
在其他情况下,如果发送一个Logout消息不产生风险和安全冲突,Logout消息应随同描述信息一起发送。
6.3 When to send a Session Reject vs. when to ignore the message 何时发送会话驳回与何时忽略消息
以下内容从FIX协议规范中的Reject消息定义中摘抄:
注意:接收程序应忽略任何文本混乱,不能被解析以及数据完整性检查失败的消息。处理下一个右下的FIX消息将导致检测到一个序列号间隙并产生一个重传请求消息Resend Request。这种情况下,FIX引擎应包含识别重传无限循环的逻辑。
FIX协议采取乐观的观点。它假设一个混乱的消息是由于传输中出现的错误,而不是FIX系统的问题。因此,如果发送一个重传请求消息(Resend Request),该混乱消息将被正确得重传。如果一个消息没被认为是混乱的,那么,推荐发送一个会话级驳回消息。
6.4 What constitutes a garbled message 什么样的情况认为是一个混乱消息
1.
BeginString(tag#8)不是一个消息中的第一个tag或不是8=FIXT.n.m.的格式。
2.
BogyLength(tag#9)不是一个消息中的第二个tag或没有包含正确的字节数。
3.
MsgType(tag#35)不是一个消息中的第三个tag。
4.
Checksum(tag#10)不适最后一个tag或没有包含正确的值。
如果丢失MsgSeqNum(tag#34),一个Logout消息将被发送以终止FIX连接。因为这种情况意味着一个严重的应用程序错误。
6.5 FIX Session-level State Matrix FIX会话层状态举证
Precedence
次序
|
State
状体
|
Initiator
发起者
|
Acceptor
接收者
|
Descriptioin
描述
|
1 | 断开 当天未连接 | Y | Y | 当前处于断开状态,当日未进行连接尝试。没有MsgSeqNum被使用(下一个当日的连接的MsgSeqNum值为1)。 |
2 | 断开 当日开始连接 | Y | Y | 当前处于断开状态,尝试建立当日连接,这样,MsgSeqNum开始被消耗(下一个当日连接时,MsgSeqNum将从其(last+1)开始) |
3 | 检测到网络连接的中断 | Y | Y | 处于连接状态时,检测到一个网络连接中断(如TCP socket关闭)。断开网络连接并关闭该会话的配置。 |
4 | 等待连接 | N | Y | 会话登陆消息接收者等待对端的连接。 |
5 | 初始话(发起)连接 | Y | N | 会话登陆消息发起者同对端建立连接。 |
6 | 网络连接建立 | Y | Y | 双方建立网络连接。 |
7 | 发送Logon发起消息 | Y | N |
会话登陆发起者发送Logon
消息。
***异常:24小时会话
|
8 | 收到Logon发起消息 | N | Y |
会话登陆接收者收到对端的Logon消息
***异常:24小时会话
|
9 | Logon发起消息响应 | N | Y | 会话登陆接收者使用Logon消息与对端握手,响应对端Logon消息。 |
10 | 处理ResendRequest | Y | Y | 接收和响应对端发送的对消息的ResendRequeset消息,和(或)对MsgSeqNum所请求范围的SequenceReset-Gap Fill消息。修改以驳回接收到的MsgSeqNum小于LastSeqNum的Resend Request消息。 |
11 | 收到MsgSeqNum过大 | Y | Y | 从对端接收到过大的MsgSeqNum,将消息排队暂存,发送ResendRequest消息 |
12 | 等待/处理ResendRequest响应 | Y | Y | 处理请求的MsgSeqNum请求的、PossDupFlag=’Y’的消息,和/或从对端进行的SequenceRset-Gap Fill消息。将MsgSeqNu过高的接收消息排队暂存。 |
13 | 在实践间隔后未收到消息 | Y | Y | 没有非混乱消息在HeartBeatInt+响应时间内被接收,发送TestRequest消息。 |
14 | 等待/处理TestRequest消息响应 | Y | Y | 处理接收消息。当接收到非混乱消息后,复位心跳间隔时间。 |
15 | 接收Logout消息 | Y | Y | 从对端接收到发起注销/连接断开的Logout消息。如果MsgSeqNum过高,发送RsendRequest。如果发送,等待一定周期,以完成ResendRequest的响应处理。注意,依据Logout的原因,对端可能不能执行该请求。 发送Logout消息作为响应并等待一定时间让对端断开网络连接。注意,对端可能发送ResendRequest消息,如果Logout响应消息的MsgSeqNum过高并重新发起Logout操作。 |
16 | 发起Logout处理 | Y | Y | 识别优雅断开连接的条件和原因(如:日终,多个未响应的TestRequest消息发送后,MsgSeqNum过高等)。发送Logout效益给对端。等待一个时间周期以接收Logout响应。在这期间,如有可能,处理新接收的消息和/或ResendRequest。注意,一些注销/终止条件(如数据库/消息存储失败),可能要求紧接在初始沪Logout消息发送后立即止网络连接。断开该会话的网络连接并关闭该会配置。 |
17 | 活动/正常会话 | Y | Y | 网络连接建立后,Logon消息成果交换完成,接收和发送的MsgSeqNum都是所期望的顺序,并且Heartbeat 或其他消息在(HeartBeatInt +响应周期)内被接收。 |
18 | 等待Logon确认 | Y | N | 会话发起者等待会话接收者发送Logon确认消息。 |
6.6 FIX Logon Process State Transition Diagram FIX登陆消息处理状态转换图
Session Initiator(e.g. buyside)Action 会话发起者(如,买方)行为
|
Session Acceptor(e.g. sellside)Action会话接收者(如,卖方)行为
|
Session Initiator(e.g.buyside)State会话发起者(如,买方)状态
|
Session Acceptor(e.g. sellside)State会话接收者(如,卖方)状态
|
开始 |
未连接-当日未连接
未连接-当日连接
| 等待连接 | |
连接 |
发起连接
(可能)检测到网络连接中断
| 等待连接 | |
接受连接 | 建立网络连接 | 建立网络连接 | |
发起登陆
| 发送发起登陆消息Logout | 建立网络连接 | |
收到发起登陆消息Logout | 发送发起登陆消息Logout | 收到发起登陆消息Logout | |
发送发起登陆消息响应 | 发送发起登陆消息Logout |
发起Logon的响应
(可能)发起 Logout处理
(可能)接收到的MsgSeqNum过高
| |
(可能)发送ResendRequest |
发起Logon响应
(可能)接收到的MsgSeqNum过高
| ||
接收发起登陆消息的响应 |
(可能)活动/正常的会话
(可能)发起 Logout处理(如,MsgSeqNum过高)
|
发起Logon的响应
| |
(可能)发送RsendRequest |
(可能)活动/正常的会话
(可能)接收的MsgSeqNum过高
|
(可能)活动/正常的会话
(可能)处理ResendRequest
| |
活动/正常的会话 | 活动/正常的会话 |
6.7 FIX Logout Process State Transition Diagram FIX Logout处理状态转换图
Logout Initiator: Action
Logout发起者行为ie
|
Logout Acceptor Action
Logout接收者行为
|
Logout Initiator State
Logout发起者状态
|
Logout Acceptor State
Logout接收者状态
|
开始 |
1.
活动/正常的会话
2.
没有在时间间隔内收到消息
3.
等待/处理响应TestRequest
| ||
原文转自:http://blog.csdn.net/songzhang/article/details/1812824