HTTP vs. WebSocket
本文比较了 HTTP 和 WebSocket 协议,解释了它们的关键差异、功能和理想的使用场景。它为开发者提供了选择合适协议进行 Web 应用开发的重要见解,比较了 HTTP 的请求-响应模型与 WebSocket 的实时、双向通信能力。
整个数字世界的基础是机器之间的通信。授权客户端创建请求,服务器接收、解释并提供适当的响应。这是普通人对数字通信的常见理解。然而,幕后的工作是复杂而繁琐的。
应用开发者需要做大量的工作以确保这种客户端-服务器通信正常运行。选择正确的通信协议是其中一项任务。当开发者尝试选择一个可行的通信协议时,HTTP 和 WebSocket 是他们会遇到的两个常用概念。
明确这两者的相似性、功能及其他方面,对于确保根据实际需求选择正确的选项至关重要。
介绍 HTTP
首先让我们了解一下 HTTP。它可能是数字通信领域中最常用的协议。HTTP 的初始版本于 1989 年发布,功能和应用范围有限。但很快就被改进和升级,以支持浏览器和服务器之间的大规模通信。
HTTP 是一种单向协议,意味着在任何给定时间,通信中的只有一方可以发送或接收信息。当客户端向服务器发送请求时,该请求以 HTTP 或 HTTPS 的形式发送,服务器在接收到请求后向客户端发送一个相应的、唯一的响应。每个 HTTP 或 HTTPS 请求都建立与服务器的新连接,并在接收到响应后自动终止连接。
HTTP 的一些主要特点包括:
- 无状态
- 可以基于面向连接的协议工作(如 SCTP 和 TCP)
- 信息以 ASCII 编码
- HTTP 请求的主要组成部分包括 HTTP 版本(HTTP/1.1、HTTP/2、HTTP/3)、方法、HTTP 头、主机信息和消息
什么是 WebSocket?
WebSocket 是一种可以实现客户端 和服务器之间实时双向通信的通信协议。
WebSocket 是一种在 Web 应用中创建实时双向通信通道的协议。与传统的 HTTP 请求(通常一个请求对应一个响应)不同,WebSocket 可以建立持久连接,允许服务器实时向客户端推送数据,同时也接收来自客户端的数据。与传统轮询相比,WebSocket 显著减少了网络流量和延迟,提高了数据传输的效率和速度。它特别适合开发实时 Web 应用和在线游戏。
WebSocket 的一些主要特点包括:
- 基于持久 TCP 连接,连接保持打开状态,直到客户端或服务器发起终止请求
- 构建于 HTTP 协议之上,所有 WebSocket 请求通过标准 HTTP 协议发送,然后在服务器端标识为特定头信息 Upgrade
- WebSocket 协议基于帧(数据包),一个完整的数据包可以分为多个帧,每帧包含部分数据和头信息
HTTP 和 WebSocket 之间的关系
从上面的介绍中,我们可以看到 HTTP 和 WebSocket 协议都:
- 使用 TCP 协议进行数据传输
- 用于客户端和服务器之间的通信
我们可以通过下表更直观地展示 HTTP 和 WebSocket 之间的差异。
HTTP | WebSocket |
---|---|
每个请求建立新的连接(除非使用 HTTP 长连接,如 HTTP/1.1 Keep-Alive),通信结束后关闭连接 | 初始握手成功后连接保持打开状态,除非主动关闭或出现错误 |
单向通信模式,客户端发送请求,服务器返回响应,每次新通信需要重新建立连接 | 双向通信模式,连接建立后,客户端和服务器可以随时发送数据而无需重新建立连接 |
每次通信需要发送完整请求和响应头,因此频繁的 短消息通信开销较大 | 连接建立后数据传输更轻便,每次不需要传输头信息,适合高频率、低延迟的通信需求 |
主要用于传输相对稳定的数据 | 主要用于传输实时数据 |
由于每个请求需要重新建立连接并通过头等必要信息传输,带宽使用效率和响应速度受到影响 | 持续连接省去了每个请求建立连接和传输必要信息的步骤,从而降低了延迟,提高了带宽使用效率 |
频繁的请求影响性能 | 频繁的请求不影响性能 |
如何选择使用哪个协议?
基于上一节对 HTTP 和 WebSocket 优缺点的比较,我们可以从两个不同的维度来评估使用场景:
- 数据是否变化迅速,以及业务是否依赖实时数据
- 是否涉及频繁的双向通信
例如,如果 Jack 想构建一个视频聊天应用程序,每个用户需要接收来自聊天对象的实时视频数据并传输自己的视频流数据给对方,那么 WebSocket 是最佳选择。
Logto 的管理控制台不需要频繁获取当前登录用户的资源使用状态,因为资源只有在用户修改配置时才会改变状态。它只需要在用户对资源进行操作时及时重新获取资源状态。从这个角度来看,HTTP 非常适合 Logto 管理控制台的使用场景。同样,对于大多数云服务仪表板,可以选择 HTTP 作为仪表板和服务器之间的通信协议。