Websockets是如何实现的

How Websockets are implemented?

本文关键字:实现 何实现 Websockets      更新时间:2023-09-26
  • Websockets是如何实现的
  • 这项新技术背后的算法是什么(与Long Polling相比)
  • 就表现而言,他们怎么能比Long Polling更好呢

我之所以提出这些问题,是因为这里有一个Jetty-websocket实现(服务器端)的示例代码。

如果等待足够长的时间,就会发生超时,导致客户端上的以下消息。

这无疑是我在使用长轮询时面临的问题。它停止进程以防止服务器过载,不是吗?

Websockets是如何实现的?

webSockets的实现方式如下:

  1. 客户端向服务器发出HTTP请求,请求中带有"升级"标头
  2. 如果服务器同意升级,则客户端和服务器交换一些安全凭据,并且现有TCP套接字上的协议从HTTP切换到webSocket
  3. 现在有一个持久的开放式TCP套接字连接客户端和服务器
  4. 任何一方都可以随时在这个打开的套接字上发送数据
  5. 所有数据都必须以非常特定的webSocket数据包格式发送

因为只要双方同意,套接字就会保持打开状态,这就为服务器提供了一个通道,每当有新的信息要发送时,就可以向客户端"推送"信息。这通常比使用客户端驱动的Ajax调用要高效得多,在Ajax调用中,客户端必须定期轮询以获取新信息。而且,如果客户端需要向服务器发送大量消息(可能类似于多人游戏),那么使用已经打开的套接字向服务器发送快速消息也比Ajax调用更高效。

由于webSockets的启动方式(从HTTP请求开始,然后重新调整套接字的用途),它们与现有的web基础设施100%兼容,甚至可以在与现有web请求相同的端口上运行(例如端口80或443)。这使得跨源安全性更加简单,并使客户端或服务器端基础设施上的任何人都不必修改任何基础设施来支持webSocket连接。

这项新技术背后的算法是什么(与长轮询)?

本文对webSocket连接算法和webSocket数据格式的工作原理进行了很好的总结:编写webSocket服务器。

就表现而言,他们怎么能比Long Polling更好呢?

从本质上讲,长时间的投票有点像黑客。之所以发明它,是因为对于发送到客户端的服务器启动的数据,没有更好的替代方案。以下是步骤:

  1. 客户端对来自客户端的新数据进行http请求
  2. 如果服务器有一些新数据,它会立即返回这些数据,然后客户端发出另一个http请求,要求获得更多数据。如果服务器没有新数据,那么它只会挂起连接一段时间而不提供响应,从而使请求挂起(套接字打开,客户端正在等待响应)
  3. 如果在请求仍然挂起的任何时候,服务器获取了一些数据,那么它将这些数据形成一个响应,并返回挂起请求的响应
  4. 如果有一段时间没有数据进入,那么最终请求将超时。这时,客户端将意识到没有返回新的数据,并将启动一个新的请求
  5. 冲洗,起泡,重复。返回的每一条数据或挂起请求的每一次超时之后都会收到来自客户端的另一个ajax请求

因此,虽然webSocket使用一个长寿命套接字,客户端或服务器可以通过该套接字向另一个发送数据,但长轮询包括客户端一遍又一遍地询问服务器"你还有数据吗?",每个套接字都有一个新的http请求。

如果做得好,长时间轮询就可以工作,只是在服务器基础设施、带宽使用、移动电池寿命等方面效率不高…

我想要的是对此的解释:Websockets保持C/S之间的开放连接与长轮询等待不太一样过程换句话说,为什么Websockets不会使服务器过载?

对于服务器来说,在客户端和服务器之间维护开放的webSocket连接是一件非常便宜的事情(它只是一个TCP套接字)。非活动但打开的TCP套接字不占用服务器CPU,只占用非常少量的内存来跟踪套接字。正确配置的服务器一次可以容纳数十万个打开的套接字。

另一方面,进行长时间轮询的客户端,即使是没有新信息发送给它的客户端,也必须定期重新建立连接。每次重新建立新连接时,都会有一个TCP套接字拆卸和新连接,然后是一个要处理的传入HTTP请求。

以下是关于缩放主题的一些有用参考:

  • 使用Node.js在AWS上进行600k个并发websocket连接
  • Node.js w/1M并发连接
  • HTML5 WebSocket:Web可伸缩性的巨大飞跃
  • HTML WebSockets是否为每个客户端维护开放连接?这个比例吗

很好地解释了web套接字、长轮询和其他方法:

在什么情况下AJAX长/短轮询比HTML5 WebSockets更受欢迎?

长轮询-请求→等待→响应。像AJAX一样创建到服务器的连接,但保持连接打开一段时间(但时间不长),在连接打开期间,客户端可以从服务器接收数据。由于超时或数据丢失,连接关闭后,客户端必须定期重新连接。在服务器端,它仍然被视为与AJAX相同的HTTP请求,只是请求的答案将在现在或将来某个时候由应用程序逻辑定义。所有主要浏览器都支持。

WebSockets-客户端↔服务器。创建到服务器的TCP连接,并根据需要保持该连接。服务器或客户端可以很容易地关闭它。客户端通过HTTP兼容的握手过程,如果成功,则服务器和客户端可以随时双向交换数据。如果应用程序需要以两种方式频繁地交换数据,那么它是非常高效的。WebSocket确实有数据帧,其中包括从客户端发送到服务器的每条消息的掩码,因此数据只需加密即可。支持图表(非常好)

总的来说,套接字的性能比长轮询要好得多,您应该使用它们而不是长轮询。