将阻塞流复用到TCP连接中是一个好主意吗?


13

我需要两个主机之间的几个双工通道。仅建立一个TCP连接有许多优点。但是我怀疑多路复用会引起一些不可避免的问题。它会损害性能或显着增加延迟吗?内存使用率和CPU使用率又如何呢?您有什么建议或警告吗?

Answers:


10

TLDR:在TCP上多路复用多个通道时(如果操作正确),您可能会注意到的主要缺点是由于通道之间的行头阻塞而导致延迟增加

结论:如果您不关心延迟,那应该没问题。

另一方面,使用单个TCP连接“意味着与其他流的竞争更少,连接寿命更长,从而可以更好地利用可用网络容量”

行头阻塞通过TCP阻塞

如果您在同一TCP流的顶部多路复用多个通道,则这些通道可能会遭受行头阻塞

当传输协议提供有序或部分有序服务时,可能会发生行头阻塞(HOL):如果段丢失,则后续消息必须等待接收器队列中的成功重传,从而被延迟。

在TCP上多路复用多个流时,会在通道之间出现 HOL 。

如果通道A已填满TCP发送缓冲区,则必须等待接收到所有这些数据,然后才能将通道B的任何新数据有效地传输到远程应用程序层。

请参阅“ TCP上的多路复用”以获取有关TCP上的多路复用通道和hackernews讨论的更多详细信息。

通过TCP进行复用的示例

通过SSH的通道多路复用(通过TCP)

SSH就是一个典型的例子。SSH可以复用多个信道(见ControlMasterControlPathControlPersistOpenSSH中)。使用此功能可减少初始化新SSH会话的成本(初始延迟),但在一个通道上进行大量传输通常会增加其他通道的延迟/交互(如果您使用多个TCP流,则不会发生):会话并开始尝试通过同一频道进行繁重的文件传输,您的会话将开始变得缺乏互动性。

TCP上的多路复用HTTP / 2

HTTP / 2使用TCP上的请求/响应的多路复用以修复HOL阻塞。在许多有关HTTP / 2的文章和论文中都宣传了此功能。的HTTP / 2 RFC权利要求:

HTTP / 1.1添加了请求流水线处理,但这仅部分解决了请求并发问题,并且仍然受到行头阻塞的困扰。

[...]

生成的协议对网络更友好,因为与HTTP / 1.x相比,可以使用更少的TCP连接。这意味着与其他流量的竞争减少,连接寿命更长,进而可以更好地利用可用网络容量。

但是,没有讨论的是HOL阻塞没有完全解决。HTTP / 2通过TCP仍然遭受从)TCP级HOL阻塞

在有关QUIC的LWN文章中对此进行了讨论 :

HTTP / 2旨在使用单个连接中内置的多个“流”来解决此问题。它带来了一个新问题:单个数据包的丢失将立即停止所有流的传输,从而产生新的延迟问题。此行头阻塞问题的变体内置于TCP本身,无法通过在HTTP级别进行更多调整来解决。

其他复用策略

计划

这是SCTP(多数据流)的独特功能之一,您可以在同一个SCTP关联中拥有多个独立的数据流,并且每个数据流都不会阻塞其他数据流。

有关使用SCTP以避免SSH中跨通道HOL阻塞的效果,请参阅SSH over SCTP -通过使其适应SCTP优化多通道协议

SCTP仅保留单个流中消息的顺序,以减轻称为行首阻塞的影响。如果丢失了一条消息,则必须延迟随后的消息,直到重新发送丢失的消息以保留顺序为止。由于仅必须延迟同一流的消息,因此减少了丢失后受影响消息的数量。

[...]

通过将SSH的通道映射到SCTP的流上,可以使SSH获得多流传输的好处,这可以减轻行首阻塞的影响

SCTP不一定易于部署(由于OS可用性,中间盒交互等)。一种可能性是在用户空间中通过UDP 实现它。

QUIC(通过UDP复用)

另一个示例是用于在UDP上多路复用HTTP 的实验性QUIC协议(因为HTTP / 2确实遭受HOL阻塞,因此在TCP之上多路复用多个流):

QUIC是一种新的传输方式,与TCP相比,它可以减少延迟。从表面上看,QUIC与在UDP上实现的TCP + TLS + HTTP / 2非常相似。

[...]

多路复用,无线路阻塞

Google的QUIC协议:在TCP上多路复用通道时,将网络从TCP迁移到UDP可以很好地概述QUIC和HOL阻止。

最近的一份演讲声称,HTTP over QUIC可以改善延迟,但是HOL阻止的改进是“较小的好处”:

0-RTT,超过50%的延迟改善

[…]

更少的基于超时的重传改善了尾部等待时间[…]

其他较小的好处,例如生产线阻塞

请注意,虽然QUIC被描述为“非常类似于在UDP上实现的TCP + TLS + HTTP / 2”,但它实际上是一种通用传输方式,可以独立于HTTP / 2使用,并且可能满足您的需求。

注意:HTTP / QUIC将被标准化为HTTP / 3


如果存在流控制机制,我认为HOL并不是真正的问题。打开多个TCP连接还会创建多个窗口缓冲区,这可能不会提高内存效率。
Sherwood Wang

我考虑过SCTP。但是,似乎SCTP尚未十分便携,并且NAT设备对其处理不佳。
Sherwood Wang

@SherwoodWang,在多路传输协议中具有控制流机制不会阻止HOL阻塞的发生。
ysdx'8

当发送方没有可用数据时,发送方可以发送流控制帧以通知接收方切换到下一个多路复用通道,然后继续发送该通道的数据帧。当接收器已满时,也可以使用类似的机制。它绝对可以防止HOL阻塞,而只有一半的往返延迟。
Sherwood Wang

@ SherwoodWang,TCP HOL问题实际上在接收方。如果某些数据包在传输中丢失,则接收器无法将以下数据包提供给用户空间。它必须等待数据包被重新发送和接收。阻塞所有剩余数据(来自其他多路复用流的事件),直到接收到该数据包。
ysdx

3

我要说的是,您需要阅读ZeroMQ指南,它所给出的模式,原因和缺点是必读的。

但是否则,断开网络通道与应用程序数据传递的连接就没有问题。您将必须对发送的数据包进行多路复用和多路分解(在这里我建议使用基于数据包的体系结构,而不是连续流传输数据),并在每端进行缓冲。

否则,应该没有什么影响,您可能需要更多的内存(但仅需要一点)来缓冲数据,并需要更多的CPU,因为您正在处理更多代码以锁定和解析数据包,但没有什么意义。(除非您正在编写需要高吞吐量和性能的专家,否则至关重要)。


2

是的,我正是使用此原理构建了一个客户端-服务器数据库系统。

多路复用到一个TCP连接上的通道各自发送数据包,然后将数据包拆分到另一端的相应接收者。

TCP连接发送方通过循环选择从一个准备就绪的通道中切换哪个数据包,以从具有准备发送数据的通道中进行选择。

为了处理一个通道决定发送1GB数据包并将其他所有人拒之门外的情况,发送方可以选择将数据包拆分为多个数据块,并仅在发送一个数据块之前转送另一个数据块。在接收端,在接收方看到数据包之前将块重组为数据包。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.