通过 WS 与 Http 发送多个 5mb 二进制文件
Sending multiple 5mb binary files over WS vs Http
在发送大文件时,通过 websocket 发送大文件是否会“阻止”websocket 接收其他消息?
通过独立的 Http 请求发送文件而其他消息继续通过 WS 发送是否有任何明显的优势“保持 WS 畅通无阻”?
假设1个网卡。
如果 WebSocket 超过 HTTP/1.1,是的,上传大文件(以大型 WebSocket 消息的形式)会阻塞 WebSocket 连接。
在WebSocket over HTTP/2的情况下(如果客户端和服务器都支持),一个HTTP/2流将上传大文件,另一个HTTP/2流用于携带WebSocket消息。在这种情况下,问题就变成了HTTP/2流量控制window,可能会被大上传流耗尽,导致WebSocket消息流停顿(从而导致消息排队和延迟)。不幸的是,这个 queueing/delay 的细节取决于客户端和服务器实现,所以你必须尝试。
通常实现在交错流方面做得很好,因此可能的停顿很少成为问题。
对于 HTTP/1.1 上的 WebSocket,如果您打开多个 WebSocket 连接,您可以并行发送文件和消息,文件使用 N
WebSocket 连接,文件使用 1
WebSocket 连接例如,对于消息。
一些 non-browser 客户端允许您打开多个 HTTP/2 到同一域的连接,因此您将再次有机会并行发送文件和消息。然而,据我所知,浏览器不允许超过 1 个 HTTP/2 连接到同一域,因此存在并行性,但受到 HTTP/2 流控制 window.[=14 的限制=]
不确定“保持 WS 畅通”是什么意思,但是 HTTP/1.1 的工作方式与 WebSocket 相同,涉及其连接的使用。
如果您处于浏览器环境中,浏览器允许到同一域的 6-8 个 HTTP 连接,并且通常无限制(或至少更多)WebSocket 连接。
因此,如果您想发送 10 个大文件,其中 6-8 个将通过 HTTP 上传,但其余文件将排队等待其中一个 HTTP 连接完成上一次上传。
同时,您可以使用WebSocket连接发送消息。
在 HTTP/2 的情况下,浏览器仅打开 1 个连接,因此您可以使用 HTTP/2 流进行上传,并使用 WebSocket over HTTP/2 流进行消息,但它们将共享相同的 HTTP/2 流量控制 window,可能会互相拖延。
总而言之,WebSocket 并不是为大型上传而设计的。
如果您达到 WebSocket 消息大小限制,我不会感到惊讶,因为服务器不允许客户端上传任意大小的消息(因为它会炸毁服务器内存)。客户也是如此;浏览器通常对它们接收的 WebSocket 消息的大小有很小的限制,与使用 HTTP/1.1 还是 HTTP/2 无关。
如果您真的需要上传大文件,我认为通过 HTTP 上传(允许更大的文件,例如在使用 multipart/form-data
时)并通过 WebSocket 保持小消息的解决方案是最佳的。
使用HTTP/2可能达到HTTP/2流量控制window限制,但是你有6-8个连接的限制在 HTTP/1.1 中也是如此,所以你必须再次尝试查看 如果 你达到了任何限制,如果你达到了,在什么情况下是哪个限制。
使用 HTTP 进行上传可以降低您达到事先不知道的 WebSocket 消息大小限制的可能性,并且可能因客户端(浏览器到浏览器)而异,并且您不想实施自己的拆分和通过 WebSocket 合并大量上传以遵守这些限制。
在发送大文件时,通过 websocket 发送大文件是否会“阻止”websocket 接收其他消息?
通过独立的 Http 请求发送文件而其他消息继续通过 WS 发送是否有任何明显的优势“保持 WS 畅通无阻”?
假设1个网卡。
如果 WebSocket 超过 HTTP/1.1,是的,上传大文件(以大型 WebSocket 消息的形式)会阻塞 WebSocket 连接。
在WebSocket over HTTP/2的情况下(如果客户端和服务器都支持),一个HTTP/2流将上传大文件,另一个HTTP/2流用于携带WebSocket消息。在这种情况下,问题就变成了HTTP/2流量控制window,可能会被大上传流耗尽,导致WebSocket消息流停顿(从而导致消息排队和延迟)。不幸的是,这个 queueing/delay 的细节取决于客户端和服务器实现,所以你必须尝试。
通常实现在交错流方面做得很好,因此可能的停顿很少成为问题。
对于 HTTP/1.1 上的 WebSocket,如果您打开多个 WebSocket 连接,您可以并行发送文件和消息,文件使用N
WebSocket 连接,文件使用1
WebSocket 连接例如,对于消息。
一些 non-browser 客户端允许您打开多个 HTTP/2 到同一域的连接,因此您将再次有机会并行发送文件和消息。然而,据我所知,浏览器不允许超过 1 个 HTTP/2 连接到同一域,因此存在并行性,但受到 HTTP/2 流控制 window.[=14 的限制=]不确定“保持 WS 畅通”是什么意思,但是 HTTP/1.1 的工作方式与 WebSocket 相同,涉及其连接的使用。
如果您处于浏览器环境中,浏览器允许到同一域的 6-8 个 HTTP 连接,并且通常无限制(或至少更多)WebSocket 连接。
因此,如果您想发送 10 个大文件,其中 6-8 个将通过 HTTP 上传,但其余文件将排队等待其中一个 HTTP 连接完成上一次上传。
同时,您可以使用WebSocket连接发送消息。
在 HTTP/2 的情况下,浏览器仅打开 1 个连接,因此您可以使用 HTTP/2 流进行上传,并使用 WebSocket over HTTP/2 流进行消息,但它们将共享相同的 HTTP/2 流量控制 window,可能会互相拖延。
总而言之,WebSocket 并不是为大型上传而设计的。
如果您达到 WebSocket 消息大小限制,我不会感到惊讶,因为服务器不允许客户端上传任意大小的消息(因为它会炸毁服务器内存)。客户也是如此;浏览器通常对它们接收的 WebSocket 消息的大小有很小的限制,与使用 HTTP/1.1 还是 HTTP/2 无关。
如果您真的需要上传大文件,我认为通过 HTTP 上传(允许更大的文件,例如在使用 multipart/form-data
时)并通过 WebSocket 保持小消息的解决方案是最佳的。
使用HTTP/2可能达到HTTP/2流量控制window限制,但是你有6-8个连接的限制在 HTTP/1.1 中也是如此,所以你必须再次尝试查看 如果 你达到了任何限制,如果你达到了,在什么情况下是哪个限制。
使用 HTTP 进行上传可以降低您达到事先不知道的 WebSocket 消息大小限制的可能性,并且可能因客户端(浏览器到浏览器)而异,并且您不想实施自己的拆分和通过 WebSocket 合并大量上传以遵守这些限制。