我查看了 FIX v4.2 规范,我不清楚当 TCP 连接在会话中间丢失时应该是什么预期行为。
更具体地说,假设当前序列号为 100,此时 TCP 连接丢失,当任何一方尝试恢复会话时,它会重新发送 100 号消息,还是通过登录开始新的会话?
在描述 FIX 会话时,规范说一个会话有一个登录和一个注销,但可以跨越多个物理连接。这使我认为,当 TCP 连接丢失时,恢复过程不应该以登录消息开始,但我对此并不积极。
提前致谢!
我查看了 FIX v4.2 规范,我不清楚当 TCP 连接在会话中间丢失时应该是什么预期行为。
更具体地说,假设当前序列号为 100,此时 TCP 连接丢失,当任何一方尝试恢复会话时,它会重新发送 100 号消息,还是通过登录开始新的会话?
在描述 FIX 会话时,规范说一个会话有一个登录和一个注销,但可以跨越多个物理连接。这使我认为,当 TCP 连接丢失时,恢复过程不应该以登录消息开始,但我对此并不积极。
提前致谢!
FIX 协议没有定义与传输协议相关的任何内容。官方网站上有一些文件只建议如何在这个或那个协议之上实现它,但只是建议。
因此,TCP/IP 断开连接时的预期行为取决于实现。例如,可能有一个根本不关心 TCP/IP 断开连接的系统,这会使这些细节变得无关紧要。在这种情况下,预期的行为将是在重新建立连接后继续发送接收消息,当然如果有的话,继续“恢复”丢失的消息。但实际上,我从未见过这样的系统。
实际上,所有系统都将 TCP/IP 断开连接视为会话的隐式丢失,并期望客户端在重新连接时发送登录信息。
登录时,有两个选项 - 重新连接会话可能会发送下一个传出序列号,或者它可能会要求服务器重置序列(为 1)。在第一种情况下,如果序列大于或等于它的预期,服务器端可以发送登录确认,或者如果接收到的序列号小于预期,则关闭(甚至拒绝)会话。此外,如果序列大于预期,服务器将发出重新传输。客户端会话也监视服务器的序列,如果检测到间隙(接收到的序列大于预期),则需要请求重传。在第二种情况下,如果服务器支持序列重置,则输入和输出序列都重置为 1,并且不会恢复任何消息。
在您的情况下,如果在发送序列号为 100 的消息后连接丢失,则客户端必须重新连接并发送序列号为 101 的登录,然后从那里继续。或者,连接并重置序列,在这种情况下,某些消息可能会丢失。
另外,不要忘记检查您连接的场地的具体情况。可能有一些非常奇怪的细节根本没有被 FIX 协议指定,甚至是那些违反 FIX 协议的细节。例如,ICE(实际上是最脑残的交易所之一)在这方面是最愚蠢的交易所之一——它不允许在前 15 秒内重新连接,然后如果客户端无法连接 30 秒,他们应该切换到故障转移服务器。如果发生故障转移,它们无法保持序列号完整,客户端别无选择,只能重置序列号。
希望它能让你更清楚一点。祝你好运!
如果传输层是 TCP/IP,我希望会话发起者:
登录消息上使用的序列号取决于会话的类型以及与 FIX 会话接受者达成的协议(有关详细信息,请参阅规范)。对于重播任何手数消息没有价值的会话,例如价格过时的市场数据馈送,发送序列号为 1 的登录消息并设置标签 141=Y(重置序列号)是有意义的。对于可能需要重播消息的订单会话,会话发起者通常应该使用比发送的最后一条消息大 1 的序列号登录(并期望来自 FIX 会话接受者的登录响应,其序列号比最后一条消息大 1收到消息)。
除非您确实需要重播消息,否则每次登录时重新设置序列号会更干净、更容易。这显然取决于 FIX 会话接受器(FIX 服务器)对此的支持。对于 STP 提要之类的东西,我发现这要可靠得多,并且应用程序协议通常更好地提供应用程序级重放设施,而不是依赖 FIX 会话重放的脆弱性。