Sockets 低延迟两阶段协议

Sockets 低延迟两阶段协议,sockets,networking,tcp,udp,protocols,Sockets,Networking,Tcp,Udp,Protocols,下面是关于如何实现以下网络协议的低延迟的建议: Alice向从一个非常大的池中随机选择的许多对等方发送信息请求 每个同龄人都会用一小包回答这里没有足够的细节来进行充分的批评。如果你雇用我是为了提供建议,我想知道更多关于这个提议的信息,但是因为我是免费的,我会按照你的要求回答这个问题,尽量使它实用而不是理想化 我认为UDP不适合协议的早期部分。您不能只将单个数据包多播到Internet上的大量主机上(尽管您可以在典型的LAN上这样做)。在任何情况下,20KB的有效负载都不是通常可以在单个数据报中传

下面是关于如何实现以下网络协议的低延迟的建议:

  • Alice向从一个非常大的池中随机选择的许多对等方发送信息请求

  • 每个同龄人都会用一小包回答这里没有足够的细节来进行充分的批评。如果你雇用我是为了提供建议,我想知道更多关于这个提议的信息,但是因为我是免费的,我会按照你的要求回答这个问题,尽量使它实用而不是理想化

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

    也许你能做的最简单的事情就是将你的系统建立在HTTP上,并使用包含了Google(主要是)在HTTP开发中投入的所有各种加速的实现。这包括TCP Fast Open等。启动与所选服务器的连接;有些人的反应会比其他人更快:通过选择最快的人来发挥你的优势。顺便说一句,不要低估有效实施相对于理论往返时间的重要性

    对于第二阶段,像前面一样继续使用HTTP。为了提高效率,您可以在第一阶段结束时保持所有连接打开,然后关闭除您选择的第二阶段合作伙伴之外的所有连接。但是,从您的描述中不清楚第二阶段的交换是否适合HTTP模型,所以我不得不稍微考虑一下


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

    有一种称为“TCP Fast Open”的实验性TCP变体,它在握手完成之前携带数据。见RFC 7413。除此之外,如果您对您的网络环境有更多的说明,这将有所帮助。是否所有参与者都通过本地网络连接,或者他们任意分散在互联网上,或者什么?“TCP快速开放”听起来不错。我编辑了OP以添加更多信息。这非常有用。多播请求本身很小(只有一个标志)。如果响应收缩到一个数据包中(是否为~1kb?),那么第一阶段UDP是否可行?保持所有TCP连接打开是我考虑过的另一件事,如果得到你的支持,它似乎比我最初想象的更有吸引力。“如果它是一个真正的点对点协议,那么每对只需要一个TCP连接。”我使用的是Rust+Tokio,它的级别相对较高,并且提供了现成的异步。我应该知道有什么常见的陷阱吗?您将无法多播UDP:您将向不同的地址发送大量相同的数据包,一个接一个。处理UDP和有效负载大小是一项棘手的工作,因为最大大小取决于网络本身。如果数据包在某个点超过大小限制,也有可能出现碎片。这增加了数据包无法完整到达的可能性。我建议512字节是一个很好的大小,但我很久没有做任何网络测量来了解实际情况。关于TCP,繁忙的web服务器或邮件服务器可以轻松地同时进行1000个会话,因此这是可能的,但不一定很容易。关于编码,请确保所有内容都是异步和事件驱动的(在大多数语言中,这不是一种简单的编码风格)。在您的插座上设置严格的超时,并做好准备,在连接发生故障时立即断开连接。TCP本质上会在需要时永远重试。不要让它发生:杀死并暂时挂起任何变慢的连接。谢谢。在当前的实现中,一切都已经是异步的。“‘在大多数语言中都不是一种简单的编码风格’”——在Rust中,这是由futures和许多组合器完成的,这有点棘手,但我对它有着相对巧妙的理解。