【问题标题】:High Frequency Trading - TCP > UDP?高频交易 - TCP > UDP?
【发布时间】:2011-10-31 02:45:03
【问题描述】:

有人告诉我,对于需要低延迟的高频交易 (HFT) 系统,TCP 是通过 UDP 使用的。有人告诉我,使用 TCP 可以进行点对点连接,而使用 UDP 则不能,但是据我了解,您可以将 UDP 数据包发送到特定的 IP/端口。

article 中使用了几个论点来解释为什么 UDP > TCP 用于游戏,但我可以看到 HFT 的相关性。

为什么 TCP 是用于 HFT 的更好协议?

(管理员:我之前发的这个问题的帖子被默默地删除了,没有任何解释。如果我违反了使用条款,请提醒我这一点,而不是默默地删除这个问题)

【问题讨论】:

  • 我对 HFT 领域没有任何经验,但我怀疑使用 TCP 是因为它可以保证数据包到达目的地,而 UDP 不能。
  • UDP 连接会更快,但不那么可靠。如果您试图出售暴跌的股票但您的 UDP 数据包没有通过,那就太糟糕了。这可能是大多数人使用 TCP 而不是 UDP 进行 HFT 的原因。
  • 这里有一个post 与此对话。

标签: tcp udp low-latency hft


【解决方案1】:

如果您不需要 TCP 提供的某些功能,则 UDP 优于 TCP。每个功能都有成本,因此,如果您不需要功能,您就无缘无故地支付了这笔费用。

在 HFT 应用程序中,您几乎需要 TCP 所需的所有功能。因此,如果您选择 UDP,则必须自己实现这些功能。这意味着您必须实现连接建立、连接拆除、重传、传输步调、窗口等。

如果有一种方法可以比 TCP 做的更好,那么 TCP 就会这样做。你的一只手会被绑在背后,因为 TCP 由地球上一些最优秀的人进行了高度优化,并在内核中/与内核一起实施。

【讨论】:

  • 有些基金有自己的内核优化版本,以减少从网卡到算法的延迟。
  • 不确定我是否同意。当数据包丢失时,TCP 会阻塞流向应用程序的数据流,直到成功重传。 HFT 数据就像视频一样 - 如果你没有及时获得一帧,那就忘了它 - 为时已晚 - 只需获取下一个。
  • @BlankXavier:您必须权衡 TCP 所做的所有其他您确实需要的事情,例如传输调步、重复数据包检测、连接设置和断开, 等等。您还必须考虑您自己制作的东西与 TCP 相比的相对成熟度和可靠性。从性能的角度来看,每个现代平台都有一个经过高度优化的 TCP 堆栈,包括硬件卸载之类的东西。自己很难做到这一点。
  • 同样的平台也有大量优化的 UDP 堆栈,在这些平台上,编写此代码的努力有很大的回报。见鬼,这些公司正在实施 FPGA 软件以提高性能。实现自己的 UDP 传输包装是正确的做法。
【解决方案2】:

没有理由期望已经建立的 TCP 连接上的数据流会比 UDP 上的相同数据慢,而且您还可以获得校验和、重试以及所有其他 TCP 优点。 UDP 主要在您有能力放弃可靠性或多次 TCP 握手的开销过于昂贵的情况下胜出,例如常见的 DNS 查询。

【讨论】:

    【解决方案3】:

    在使用少量连接时,TCP 速度更快,重要的区别是现代 NIC 在 TCP 上执行大量加速,而对于 UDP 并没有那么多。这意味着处理每个 UDP 数据包的开销更大,因此除非您需要同时发送给多个收件人,否则它们无法竞争。

    然而,UDP 多播路由仍然遇到与单播 UDP 每个数据报开销相同的问题。因此,许多 HFT 系统使用硬件加速系统,可以通过 TCP 在多个 NIC 上多路复用流,例如 Solace。

    如今,尽管您想使用诸如 Solarflare 或 Mellanox 之类的用户空间 IP 堆栈完全绕过内核,或者甚至使用 RDMA 跳过内核和 IP 堆栈。

    【讨论】:

      【解决方案4】:

      很简单,如果您需要连接可靠性(确保接收到传输的每个字节数据),则无论如何都应该使用 TCP。

      正如您所提到的,UDP 更适合游戏,其中 100% 准确的实时跟踪每个对象会占用大量带宽并且是不必要的(这是慢速连接遇到延迟的地方)。

      TCP 端口和 UDP 端口之间没有特别的区别,除了所使用的连接类型(发送数据包并忘记它,UDP 风格,或协商连接并维持它,TCP 风格)和服务监听在服务器端。例如TCP/25 通常会显示 SMTP 服务器,而 UDP/25 不会。

      【讨论】:

        【解决方案5】:

        基本上,如果您保持连接处于活动状态,现代 TCP 实现将与 UDP 一样快。如果 TCP 必须重新发送数据包,您也需要在 UDP 中重新发送它。另外,对于 UDP,您最终将实现与 TCP 已经实现的相同的可靠性代码(丢弃的数据包的重新传输)。

        【讨论】:

          猜你喜欢
          • 2015-03-08
          • 1970-01-01
          • 2012-04-14
          • 2018-04-22
          • 2016-05-17
          • 1970-01-01
          • 2022-12-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多