WebSocket原理及实现详解
一、核心问题:为什么需要 WebSocket?
在 WebSocket 出现之前,客户端(如浏览器)和服务器之间进行实时、全双工通信非常困难。主要依靠两种技术:
-
短轮询:客户端每隔几秒就向服务器发送一个 HTTP 请求,问“有数据更新吗?”。无论服务器有没有新数据,都会返回一个响应。这种方式效率极低,会产生大量无用的请求和响应头,浪费带宽和服务器资源。
-
长轮询:客户端发送一个 HTTP 请求,服务器会把这个请求“挂起”,直到有数据更新或超时,才返回响应。客户端收到响应后,立即再发送一个新的请求。这比短轮询好一些,但每次通信仍然需要完整的 HTTP 请求和响应,开销依然很大。
这些技术的本质问题在于:HTTP 协议是“无状态”的、基于“请求-响应”模型的。 服务器永远不能主动向客户端发送数据。
WebSocket 就是为了解决这个问题而生的。 它的目标是在一个单一的、持久的连接上,提供全双工的、双向的实时通信。
二、WebSocket 原理详解
WebSocket 的原理可以概括为“一次握手,持久连接”。
第 1 步:握手 - 从 HTTP 升级到 WebSocket
WebSocket 连接不是凭空建立的,它巧妙地利用了标准的 HTTP 协议来发起连接,这样可以更好地兼容现有的网络基础设施(如防火墙、代理服务器)。
-
客户端发起握手请求:
客户端(例如浏览器)发送一个特殊的 HTTP 请求,这个请求头中包含一个关键的字段:Upgrade: websocket。http
GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connect
