为啥我们需要网络套接字?

Posted

技术标签:

【中文标题】为啥我们需要网络套接字?【英文标题】:Why do we need web-sockets?为什么我们需要网络套接字? 【发布时间】:2010-09-01 11:38:26 【问题描述】:

这更像是一个 n00b 问题,但我从未真正知道答案。

那么为什么我们需要 websockets 协议呢?

并且,与彗星式/长轮询/挂起 GET 式使用 HTTP 相比有什么优势?

【问题讨论】:

【参考方案1】:

Comet 和 Ajax 都可以提供具有桌面式功能和低用户感知延迟的最终用户体验,只有 Web Sockets 才能兑现承诺,提供一种本地方式来准确高效地将事件流式传输到浏览器和从浏览器流出延迟可忽略不计。

通过轮询,它会发出不必要的请求,因此,在低消息率的情况下会不必要地打开和关闭许多连接。(与轮询一样,它会定期发送 HTTP 请求并立即收到响应。)

Web Sockets 消除了开销并显着降低了复杂性。

【讨论】:

@Lethargy 您的评论使上述所有技术讨论都变得有意义......谢谢:)【参考方案2】:

1-WebSocket 是天然的全双工, 双向,单套接字连接。使用 WebSocket,您的 HTTP 请求变为 打开 WebSocket 连接并重用相同连接的单个请求 从客户端到服务器,从服务器到客户端。

2-WebSocket 减少延迟。例如,与轮询不同, WebSocket 发出一个请求。服务器不需要等待来自 客户端。同样,客户端可以随时向服务器发送消息。这个单 request 大大减少了轮询的延迟,轮询每隔一段时间发送一个请求,不管 消息是否可用。

3-WebSocket 使实时通信更加高效。 您始终可以通过 HTTP 使用轮询(有时甚至是流式传输)来接收 通过 HTTP 的通知。但是,WebSocket 节省了带宽、CPU 功率和延迟。 WebSocket 是一种性能创新。

4-WebSocket 是一种底层网络协议,可让您构建其他标准 协议。

5-WebSocket 是为 html5 应用程序提供高级功能的努力的一部分 为了与其他平台竞争。

6-WebSocket 是关于简单的

【讨论】:

那么为什么不像 HTTP 一样常用呢?【参考方案3】:

这是一篇关于 benefits of websocket 在 websocket.org 上进行轮询的文章

【讨论】:

【参考方案4】:

尚不清楚我们是否确实需要它们。在向客户端推送事件的场景下,页面可以循环发出普通的 AJAX GET 请求,服务器可以“挂起”直到有事件可用。在经过一些超时后,服务器可以返回“无事件”响应,以便客户端重新连接。在连接打开和客户端等待响应期间,从服务器返回客户端有一个有效的推送通道。

可以调整超时时间以减少不必要的重新连接,但它通常不能是无限的,因为大多数服务器框架会在服务器端进程挂起时间过长时终止它。

鉴于现有的能力,问题是:一个新的通信框架真的增加了显着的价值超过了已经可以做的事情吗?它不会真正实现无法完成的事情。它只会稍微改善它。

【讨论】:

您将如何使用XmlHttpRequest 实现像BitTorrent 客户端或VNC 客户端之类的东西? 您可以通过在 HTTP 上编写一个类似的协议来实现“类似”它们。开个玩笑,我曾经在 HTTP 上做了一个套接字隧道代理,其中一方将数据发布到 Web 应用程序,另一方将读取数据并将其传送,从而根据大量单独的 HTTP 事务模拟流。令我惊讶的是,它实际上可以用作 Microsoft 远程桌面会话的管道。任何现有的协议都可以以这种方式被模仿。您为什么要这样做是另一个问题。 速度和简单。循环中的 AJAX GET 请求是一种丑陋、缓慢的 hack,它提供了与 websocket 干净优雅地提供相同的东西。是的,请。

以上是关于为啥我们需要网络套接字?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Node.js 中的某些 TCP 套接字比大多数其他套接字需要更多的时间来连接?

Socket为啥要翻译成套接字?

server socket为啥要绑定ip地址和端口

为啥我们在套接字编程c中使用memset将结构填充为0?

为啥我们需要使用 package.json? [复制]

为啥我们需要 RPC 编程? [关闭]