低延迟两阶段协议

Low latency two-phase protocol

我正在查看有关如何为以下网络协议实现低延迟的建议:

  1. Alice 向从非常大的池中随机选择的许多对等点发出信息请求。
  2. 每个对等点都以 <20kb 的小数据包响应。
  3. Alice 汇总响应并相应地选择对等方。
  4. 然后,Alice 和选定的对等方继续协议的第二阶段,执行一系列请求和响应。
  5. 从 1 开始重复。

鉴于第 1 步和第 2 步不需要可靠(只要一定比例的响应返回我们继续第 3 步)并且 1 本质上是多播,这部分协议似乎适合 UDP - 与这些对等点建立 TCP 连接会增加一次往返。

但是第 4 步需要可靠 - 我们不能容忍在随后的 requests/responses 期间丢包。

我面临的难题是 UDP 适合 1 和 2 而 TCP 协议适合 4。连接到 1 中选择的每个对等点都很慢,尤其是因为我们的目标是仅传输 20kb,但是在步骤 4 中不能容忍 UDP . 与4.中选择的peer握手需要额外的往返,这与3次往返相比仍然是一个相当大的总时间增加。

是否有一些混合方案,您可以在传输少量数据的同时进行 TCP 握手? (握手可以合并为 1 和 2,因此不会增加任何额外的往返时间。)

是否有此类协议的名称?我应该读什么书才能更熟悉这些问题?

附加信息:

这里没有足够的细节来做一个 well-informed 批评。如果你雇我是为了征求意见,我会想更多地了解这个提案,但由于我是免费的,所以我只会按要求回答问题,并尽量使其实用而不是理想.

我认为 UDP 不适合您协议的早期部分。您不能只将单个数据包多播到 Internet 上的大量主机(尽管您可以在典型的 LAN 上这样做)。在任何情况下,20KB 的有效载荷都不是您通常可以在单个数据报中传输的那种东西,并且当消息无法放入单个数据报时,UDP 失去了大部分吸引力,因为您开始(糟糕地)重新发明 TCP。

您可以做的最简单的事情可能是将您的系统建立在 HTTP 的基础上,并使用包含 Google(大部分)已投入 HTTP 开发的所有各种 speed-ups 的实现。这包括 TCP Fast Open,以及类似的东西。启动与您选择的服务器的连接;有些人会比其他人反应更快:通过与最快的人一起使用它来利用它。顺便说一下,不要低估相对于理论 round-trip 时间的高效实施的重要性。

对于第二阶段,继续像以前一样使用 HTTP。为了提高效率,您可以在第一阶段结束时保持所有连接打开,然后关闭除您选择的第二阶段伙伴之外的所有连接。不过,从您的描述中不清楚第二阶段交换适用于 HTTP 模型,所以我必须 hand-wave 一点。

您也可以简单地或多或少永久地保持对所有可用对等点开放的 TCP 连接,从而几乎始终避免建立连接的成本。一千个同时打开的连接数很大,但在大多数情况下并不过分(尽管您可能需要调整 OS 设置以允许它)。如果你这样做,你可以通过 TCP 谈论任何你喜欢的协议。如果它是真正的 peer-to-peer 协议,则每对只需要一个 TCP 连接。不过,实现这种事情很棘手:根据我的经验,普通程序员会做得很糟糕。