websocket与标头connection-keep-alive =million的http有何不同

Posted

技术标签:

【中文标题】websocket与标头connection-keep-alive =million的http有何不同【英文标题】:how is websocket different than http with header connection-keep-alive=million 【发布时间】:2013-07-10 14:53:38 【问题描述】:

这个 HTTP 标头会不会导致连接长时间保持打开状态?那么有什么优势呢?

谁能帮我澄清一下?我想我似乎错过了这个概念。

【问题讨论】:

对我有帮助的链接:***.com/questions/10028770/… ------- ***.com/questions/11077857/… "例如在node.js中你可以为不同的socket连接共享相同的内存,这样他们就可以访问共享变量。所以你不需要使用数据库作为中间的交换点(像使用 AJAX 或长轮询,例如 php)。您可以将数据存储在 RAM 中,甚至可以立即在套接字之间重新发布。" ***.com/questions/10028770/… 【参考方案1】:

在 TCP/IP 级别看起来是一样的:一个套接字是打开的。

但从浏览器的角度来看,它们是完全不同的。 keep-alive 是让浏览器重新使用以请求更多内容(例如图像、css 文件、站点上的下一页)。 WebSockets 用于在您的 javascript 应用程序代码中进行双向通信。服务器可以随时选择发送内容。您的 JS 应用程序可以随时向服务器发送数据。

还值得与 SSE(又名 EventSource)进行比较,后者也允许服务器选择随时发送内容,但它是单向的(您的 JS 应用程序在需要发送更多数据时不得不求助于 XHR) . (WebSockets 和 SSE 的完整比较可能会变得非常复杂,所以我在这里不再多说,只是说 SSE 通常是正确的选择。)

还可以与 HTTP/2(又名 SPDY)中的服务器推送进行比较。这是为了让服务器主动推送文件(图像、css 文件、站点上的下一页),但它又是在浏览器级别,不受 Javascript 控制。

【讨论】:

所以你说的是内容:保持活动服务器仅在浏览器请求时才发送数据。它在连接打开时不断请求,而在 Web 套接字浏览器中不必请求服务器可以在需要时发送。如果需要,您可以手动请求/告诉服务器发送。 我认为浏览器不会“不断请求”。 (虽然如果你有一个每秒加载一个新图像的 javascript 循环,那么我想它会一直很忙。)还要记住,如果要获取大量内容,http/1.1 通常会与服务器建立 6 个连接。 (我知道你的问题是理论上的,但总体而言,很长的保持活动时间几乎肯定是个坏主意。) 我想我明白了,即使在长轮询/http.. 客户端与服务器通信它需要发送 http req。服务器可能会与客户端交谈。但是连接超时并且最终必须进行不必要的连接。但是我看到有人说 websocket 让更多的客户共享空间。这是如何工作的。 @MuhammadUmer 回复:“人们说 websocket 让更多的客户共享空间”,我不确定这是什么意思。有链接之类的吗? 要进行这样的比较,您需要在比较的内容上更加精确;以及您正在优化的内容(内存?)。正如我回答的那样,从浏览器到服务器的保持活动 http 连接用于不同的目的,所以无论如何比较有点奇怪。但是,如果你的 websocket 服务器是一个 PHP 实例,那么它也使用了一个线程和 2MB(或其他)。

以上是关于websocket与标头connection-keep-alive =million的http有何不同的主要内容,如果未能解决你的问题,请参考以下文章

缺少 Websocket 标头

PHP websocket不适用于safari,标头修改

做代理时 Nginx 中的 Websocket 升级标头问题

Haskell websockets 标头

如何在 Web 套接字标头中设置 Sec-WebSocket-Key?

如何在 Javascript 中为 websocket 的请求标头设置 cookie?