经过前面2篇文章,我们已经看到QuickFix 运行效果了,那么我们接下来就要结合QuickFix 实现来详解Fix 协议,因为FixClub 的宗旨是让人了解,熟悉Fix 协议。不是让人去单单理解一个开源的Fix 引擎。所以,本系列文章会从协议和QuickFix 源码分析结合来阐述。
必备基础知识:
什么是Fix
关于Fix 定义,谁在用等,我不想过多解释,详细请参考http://www.fixprotocol.org/ ,同时你也可以在百度搜索关于中文的资料。
协议层次
FIX协议包含2个层次:会话层和应用层。会话层与数据的通信相关;这里的会话层指的是信息交换会话,而不是网络或通信会话。会话层主要定义系列规则,去怎样建立会话,维护会话,数据交换,和退出的机制。而应用层定义了一些具体的业务相关的消息,下单,订单执行报告等.
协议格式
1 “标记1=值<分隔符>标记2=值 ”语法格式 (本系列文章,均以此种格式讲解)
2 “FIXML语法”语法格式 (后续有专门系列文章讲解)
消息
A)FIX消息的一般格式为:一个标准头+消息体+一个标准的尾部
一个消息,必须Tag(#8),Tag(#9),Tag(#35)开始,而且顺序保持8,9,35的顺序, 8表示开始字符串,9表示消息长
度, 35 表示消息类型. 并且必须以 Tag#10结尾. Tag #10表示校验和码
那么给定一个消息字符 串怎么知道哪些Tag属于头,哪些属于内容,哪些属于尾呢? 可以根据Tag #35后面的值,在http://www.fixprotocol.org/FIXimate3.0/ 容易查出每种类型消息的定义.
如: 登陆消息
8=FIX.4.3^9=65^35=A^34=1^49=BANZAI^52=20130703-15:55:08.609^56=EXEC^98=0^108=30^10=225^
注意: 真实消息分割符不是^, 而是一个字符'\001'(java 语言)
另外从这个登陆消息可以看出9=65表示消息内容长度是65,计算的标准为 从35=A开始到最后10之前.
即:35=A^34=1^49=BANZAI^52=20130703-15:55:08.609^56=EXEC^98=0^108=30^ ,长度正好为65个字符. 校验和码 为225 ,这个225是从第一个字符到10之前(不包括10)所有字符一个一个转成整型,然后相加得到的和模上256而得到。
B) Fix消息是基于理想化模式设计的,不支持消息确认的,通信双方必须自己根据收到的消息序列号判断是否有错误发生.
C)消息的处理按从小到达依次按顺序处理的。即先到达的消息,需要先处理.
工作原理简述
1. 通信双方,一方叫Initiator(客户端),另一方叫Acceptor(服务器),各自维护2个递增的序列号(发送消息序列号--每发送一个消息加1,接受消息序列号--每收到一个消息加1)。
2. 通信首先由Initiator开始发起建立一个网络连接 , Acceptor(服务器),接受网络连接建立。
3. Initiator 发起登录消息请求。
4. Acceptor 收到登录请求后,经过一系列消息检查,合格后,返回登录确认。Initiator 收到登录确认后,经过一系列消息检查,合格后,双方Fix 会话层连接成功。
5. 双方交换消息
6. 退出(任意一方均可发退出消息)