我可以在我的websockets上进行流量控制吗?

时间:2013-10-16 21:31:03

标签: browser tcp websocket

我正在使用websockets将来自服务器的视频图像(以Go编写)传输到作为HTML页面的客户端。我在下面分享的经验是Chrome。

我通过websocket的onmessage处理程序接收图像。在接收图像时,我可能需要异步完成许多任务才能显示图像。即使这些任务没有完成,另一个onmessage()可能会触发。我不想排队图像,因为此时我无法像服务器正在进行那样快速进行,因为显示旧图像毫无意义。我也不想放弃这些图像,我根本不想接收它们。

客户端是否会使用传统的TCP连接,它只会停止从连接中读取。这将导致接收缓冲区被填充,接收窗口被关闭,并最终暂停在服务器上发送图像。一旦客户端开始读取,接收缓冲区将清空,接收窗口将打开,服务器将恢复传输。每次我的服务器开始发送图像时,它会选择最新鲜的图像。这种选择最新鲜的行为以及TCP的流量控制确保了在许多情况下的合理行为。

是否可以通过websockets获得TCP的流量控制功能,其中websockets基于?我特别感兴趣的是一个依赖于TCP流控制而没有应用程序级别流控制的解决方案,因为这会导致不必要的额外延迟。

3 个答案:

答案 0 :(得分:3)

我怀疑你要求的是可能的。 WebSocket API spec中没有该功能的界面。但是,规范的概述要求底层套接字连接在使用WebSocket的脚本之外的后台进行管理,以便脚本不会被WebSocket操作阻止。当套接字接收入站数据时,它将数据包装在消息中并将其排队以供WebSocket脚本处理。当消息留在队列中等待脚本处理它们时,没有什么可以阻止套接字读取更多数据。

您可以在WebSocket中实现的唯一真正的流控制是明确的。当消息到达时,发回消息以确认消息。让服务器在发送下一条消息之前等待接收该确认。

答案 1 :(得分:2)

现在可以在WebSocket中包含流。 Chrome 78将附带一个新的WebSocketStream API,该API支持反压。

这是Chrome Platform Status的引文:

  

WebSocket API为RFC6455提供了JavaScript接口   WebSocket协议。虽然效果不错,但与   人机工程学的观点,并缺少重要的功能   背压。 WebSocketStream API的目的是解决   通过将流与WebSocket API集成在一起,可以解决这些缺陷。

     

当前无法对接收到的消息施加反压   使用WebSocket API。当邮件到达速度比页面快   处理它们,渲染过程将填满内存缓冲   这些消息由于100%的CPU使用率或两者而变得无响应。

     

可以对发送的消息应用反压,但这涉及   轮询效率低下的bufferedAmount属性,并且   不符合人体工程学。

很遗憾,这是仅适用于Chrome的API,并且没有网络标准 在撰写本文时。

有关更多信息,请参见:

答案 2 :(得分:1)

您可以对WebSocket连接进行流量控制(基于TCP背压自适应)。以下是两个可以帮助您入门的链接:

披露:我是Autobahn的原作者,并为Tavendo工作。