WebSocket 与 HTTP 的区别
对比 WebSocket 和 HTTP 协议的通信方式、连接特性和使用场景
问题
WebSocket 和 HTTP 有什么区别?分别适用于什么场景?
解答
HTTP 协议特点
HTTP 是单向的请求-响应模型。客户端发送请求,服务器返回响应后连接关闭。每次请求都需要重新建立连接。
HTTP 运行在 TCP 之上,是无状态协议。从 HTTP/1.1 开始支持长连接(Keep-Alive),可以在一个 TCP 连接上发送多个 HTTP 请求,但本质上仍是请求-响应模式。
HTTP/1.1 200 OK
Connection: keep-alive
Keep-Alive: timeout=75
Content-Type: application/json
HTTP 长连接的特点:
- 默认开启,响应头包含
Connection: keep-alive - 有超时时间限制(如 Nginx 默认 75 秒)
- 需要客户端和服务端都支持
- 连接复用减少了 TCP 握手开销,但仍是单向通信
WebSocket 协议特点
WebSocket 是双向全双工协议,使用 ws:// 或 wss:// 开头。它是有状态的持久连接,客户端和服务器可以随时互相发送数据。
连接建立过程:
- 客户端发起 HTTP 握手请求(状态码 101 表示协议切换)
- 升级为 WebSocket 连接
- 保持连接直到任一方主动关闭
// 客户端建立 WebSocket 连接
const socket = new WebSocket('ws://example.com/socket');
socket.onopen = () => {
console.log('连接已建立');
socket.send('Hello Server');
};
socket.onmessage = (event) => {
console.log('收到消息:', event.data);
};
socket.onclose = () => {
console.log('连接已关闭');
};
使用场景对比
适合使用 WebSocket 的场景:
- 实时交易应用:股票、加密货币价格实时推送
- 在线游戏:服务器持续推送游戏状态,无需刷新界面
- 即时通讯:聊天应用中消息的实时收发
- 协同编辑:多人同时编辑文档的实时同步
适合使用 HTTP 的场景:
- 获取静态资源或一次性数据
- RESTful API 调用
- 不需要实时更新的数据查询
- 传统的表单提交
关键点
- HTTP 是单向请求-响应模式,WebSocket 是双向全双工通信
- HTTP 每次请求建立新连接(或复用长连接),WebSocket 建立一次连接后持续使用
- WebSocket 适用于需要服务器主动推送或高频双向通信的场景
- HTTP 长连接(Keep-Alive)只是复用 TCP 连接,仍然是请求-响应模式
- WebSocket 通过 HTTP 握手升级协议(状态码 101),之后切换为 WebSocket 协议
目录