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:// 开头。它是有状态的持久连接,客户端和服务器可以随时互相发送数据。

连接建立过程:

  1. 客户端发起 HTTP 握手请求(状态码 101 表示协议切换)
  2. 升级为 WebSocket 连接
  3. 保持连接直到任一方主动关闭
// 客户端建立 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 协议