H2一、FAST协议简介

H31、FAST协议

FAST(FIX Adapted for Streaming,适流FIX或面向流的FIX)
技术是指由FAST编/解码规范1.1、FAST会话协议SCP以及FAST
扩展协议1.2等协议构成的FAST协议族所共同定义的一种面向消
息流的压缩、编码和传输方法。FAST技术的基本思想是利用消息流中先后传送的消息之间字段数据的逻辑联系来减少需要传送的数据 内容,并针对不同字段类型进行高效的二进制编码以使实际传送的
数据大小得到进一步降低。

H32、FAST优点

FAST优点如下:
(1)压缩率高。对FIX、TXT、DBF等常用数据格式的压缩率可
以达到70%以上,对XML格式的压缩则可达90%以上。
(2)专门针对高速、低带宽地传输实时消息流所设计,时空开
销小。
(3)编、解码的处理速度高,一般只需要数个微秒就可完成对
一条实时消息的处理。
(4)由权威的FPL组织提出,是对行业事实标准FIX协议优化
和改进的一种国际标准,代表着行业技术的一种发展趋势。
(5)适用于压缩文件等静态数据。
(6)简单易懂,实现起来相对容易。

H33、FAST发展

随着国际资本市场快速发展,程序化交易、算法交易、高频交易等计算机化交易模式已逐渐成为市场新宠,其交易量已占到欧美市场总交易量的一半以上从而超过传统的手工交易模式而成为主流。而在亚洲等新兴市场,计算机化交易也呈现出快速增长的势头。与交易相关的消息的数量呈现出激增的态势,通信带宽、延迟方面的问题已成为近年来证券交易行业发展面临的最大技术挑战之一。
面对挑战,全球主要交易所和金融企业联盟组织FPL(FIX Protocol Limited)在2004年专门成立了市场技术优化工作组(MDOWG),针对已成为行业事实标准的FIX协议进行优化和改进,力图使得FIX消息的传输更快、占用带宽更小、更适于低延迟地分发海量的市场数据。因此,MDOWG于2005年首次提出了FIX协议的优化协议——FAST。
不同数据格式表示相同数据内容时数据大小如下:
压缩率高、处理开销小、简单实用、应用面广、可以与FIX无缝连接等优点使得FAST在推出后很快被一些主要证券或期货交易所、经纪商等业内单位所采用,,应用到对实时要求高、带宽资源较为宝贵的行情、报单、成交等应用系统或场景中。事实上,以CME、NYSE、ARCA、BATS、SIAC、BOVESPA为代表的主要交易所以及以ICAP为代表的大型证券经纪商都开始在各自的行情或股票交易指令等消息交换系统中采用FAST。更多的金融企业正计划采用或部分采用FAST来改进各自的相关信息交换系统。作为对FIX协议优化和改进而提出的一种国际性标准,FAST代表了行业内标准化、低延迟信息交换技术的一种发展趋势。
随着FAST技术影响力的提高和应用范围的逐渐扩大,各软件供应商、各应用单位都陆续开展了对FAST以及相关技术的研究,并开始研制自己的FAST协议引擎,出现了一些基于Java或C++的FAST协议引擎,如QuickFast、OpenFast、mFast。
2009年,FPL在FAST1.1的基础上进一步推出了最新的FAST扩展协议1.2。FAST1.2在减少消息尺寸、降低延迟上作了进一步
增强,使得协议效率得到了更进一步的提高。

H34、FAST协议特征

FAST协议基本特征如下:
(1)每个字段中所有的byte的最高位用0表示当前字节属于该字段,用1表示这是该字段的最后一个字节(停止位特征),byte流和unicode字符串流数据部分不使用停止位特征
(2)FAST协议传输过程中不会传输float、double类型数据,而将其根据小数位(具体每个字段小数位数在模板配置文件中约定)扩展成数字类型。
(3)数字类型在传输过程中,可以为1-10个字节,具体根据是否为有符号、无符号以及数字范围来具体确定占用几个字节。
(4)在传输数字时,如果涉及到有符号数的时候,第一个字节的第2位用来表示符号,0表示正数,1表示负数。
(5)在传输ASCII编码类型时,占用1个字节。ASCII编码本身第一位为0,所以一个字节是符合FAST协议规定的。
(6)在传输Unicode编码类型时,使用(size,真正数据)来传输,size代表数据真正占用的字节数。
(7)在传输byte流时,和Unicode编码一样,也使用(size,真正数据)来传输。
(8)在传输Unicode和byte流时,不使用停止位特征,即每个字节的最高位为真实数据。数据长度字段仍然使用停止位特征。

H35、FAST协议数据压缩方式

FAST协议是一套比较完整的协议,包括协议层和会话层,目前国内交易所使用FAST协议,主要是在STEP协议内部使用FAST压缩算法,将STEP消息体(对于L2行情数据是tag96内容)压缩。
FAST协议采用了多种压缩数据的方法:
(1)利用先后发送的消息间字段数据的规律和相互联系来降低冗余度。定义了copy、delta、default、increment、constant、tail等运算符来对字段进行优化运算。
(2)隐式标签。通过模版规定了字段的顺序、结构以及各字段的标签(tag),使得对于tag=value<SOH>的FIX/STEP基本字段格式,无需再传送tag=部分。
(3)停止位编码。将字段值编码为停止位编码实体(SBE),使得字段的长度可自描述,省去对<SOH>字段分隔符的传送。
(4)按照数据类型将消息内容编码为二进制表示方式,提高了单位数据的有效信息量。
https://jettekfix.com/education/fix-fast-tutorial/

H2二、FAST工作机制

H31、FAST协议层次

从网络层次结构看,FAST通常工作在传输层协议和FIX层次之间。对于发送方,FAST协议层负责将FIX的应用消息或会话消息转化为二进制的FAST消息,然后调用FAST会话层,再由FAST会话层进一步调用传输层进行发送;接收方与此相反。根据需要,在会话层和传输层之间可调用其它压缩或加密方法对待发送的FAST消息进行进一步的处理。
FAST的兼容性很好,根据具体的网络特点和具体实现,FAST可以工作在不同的传输层协议上,同时也可根据实际需求修改或替换FAST会话层,使得FAST的使用更贴合实际应用需求。除了可以直接用于压缩FIX和STEP等协议格式的实时消息,FAST也可用于对结构化的DBF、TXT等静态数据格式进行压缩编解码。

H32、FAST工作框架

FAST编码方法通过两个层面上的处理降低数据流的大小:首先,通过域/字段编码的处理使得可以利用流中先后数据的相关性消除冗余数据;其次,对剩余数据进行传输编码,利用隐式标签,可自描述长度的停止位编码、二进制编码等手段来降低物理空间占用。
FAST字段编码利用先后发送的消息间的字段数据的规律和相互联系来降低冗余度。为此,FAST定义了拷贝(copy)、差值(delta)、缺省(default)、递增(increment)、常值(constant)、换尾(tail)等逻辑运算符(operator)来对字段进行优化运算。
FAST字段编码如下:
FAST隐式标签技术针对FIX/STEP消息的格式引入。FAST通过模板的控制结构规定了字段的顺序、结构以及各字段的标签(tag),使得对tag=value<SOH>的FIX/STEP基本字段格式,无需再对tag=部分进行传送。
FAST传输编码利用停止位编码的方法将字段值编码为停止位编码实体(SBE),使得字段的长度可自描述,省去对<SOH>的字段分隔符的传送。
在将剩余数据序列化为二进制编码的过程中,FAST传输编码按照数据类型将ASCII表示的整数等数字类型编码为二进制表示方式,提高了单位数据的有效信息量。

H33、FAST模板

FAST的消息编码依据称为模板的控制结构来进行。模板通过规定字段的顺序和结构、字段的逻辑运算及其字段二进制编码的表示方式来控制对数据流的编码。字典是与模式相对应的一种有状态结构,由于FAST是一种消息上下文相关的技术,所以字典被用以保存前一个包含该字段的应用消息的该字段的应用值,即字段的前值(previous value)。字典对字段前值的维护有着十分重要的意义,因为前述对字段进行的优化运算均依赖于收发双方能够维护一致的前值和字段状态。如果采用TCP等可靠传输层,则对于字段前值的依赖不会造成问题,因为消息不会丢失;但如果使用UDP等不可靠传输层,则需要特别考虑对数据包间的相互依赖性。

H34、FAST会话

为确保FAST编解码双方模板状态的一致性,FPL推出了FAST SCP协议来支持模板交互和FAST会话。
FAST会话工作在传输层上,具体可采用TCP、UDP或其他协议作为传输层协议。FAST会话层制定了Hello、Reset和Alert三个消息用来对FAST编码消息的传输进行控制。FAST会话发起方通过发送Hello消息来发起FAST会话。Hello消息中包含了发送者的名称和FAST的版本。对于每个不可分割的消息序列的传输过程,通常会以一个Reset消息,或任一个具有重置属性的模版的消息作为开始。在收到Reset消息的时候,解码器字典的前值将会被重置。 
FAST会话可以以显式或者异常的两种方式结束。通常情况下,通过发送一个Alert消息来显式地结束一次FAST会话,以其他方式结束的情况的均为异常方式的结束。

H35、FAST1.2

在FAST最初推出的正式版本FAST1.1中,除字节向量外的协议数据类型均使用SBE来编码,其最小编码单位为字节。为达到更高的压缩率,FPL在最新的FAST扩展版本中增加了短整型、枚举、集合、布尔、位元组、时间戳等数据类型。其中,短整型用来表示范围占用空间不超过1个字节的字段,枚举和布尔类型均使用占最少比特的无符号整数来编码,位元组用来将最大占用空间不超过1字节的数据类型字段填充到同一个SBE中 。 FAST1.2对字段数据类型的增强 使得编码可以达到比FAST1.1更优的压缩效果—甚至只需用一个字节就可以表示多个异构字段的数据。