Skip to main content

1. Introduction (简介)

WebSocket协议使得客户端和服务器之间能够在单个TCP连接上进行全双工通信。该协议包含一个开放握手 (Opening Handshake),随后是基本的消息帧 (Message Framing),分层在TCP之上。

本规范的目标是为脚本化网页提供一种机制,以便在不依赖于打开多个HTTP连接的情况下,建立与远程主机的双向通信通道(例如,使用XMLHttpRequest或<iframe>和长轮询)。

1.1 Background (背景)

历史上,创建需要客户端和服务器之间双向通信的Web应用程序(例如即时消息和游戏应用程序)需要滥用HTTP来轮询服务器的更新,同时通过单独的HTTP连接发送上行通知。

这导致了各种问题:

  • 服务器被迫为每个客户端使用多个不同的底层TCP连接:一个用于向客户端发送信息,另一个用于每个传入消息
  • 线路协议具有高开销,因为每个客户端到服务器的消息都有HTTP头
  • 客户端侧脚本被迫维护从出站连接到入站连接的映射以跟踪回复

更简单的解决方案是使用单个TCP连接进行双向流量。这就是WebSocket协议提供的功能。结合WebSocket API,它提供了HTTP轮询的替代方案,用于网页中的双向通信。

1.2 Protocol Overview (协议概述)

协议有两部分:握手和数据传输。

握手来自客户端,看起来如下:

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

来自服务器的握手看起来如下:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat

握手的关键点:

  • 客户端请求是一个有效的HTTP Upgrade请求
  • 添加了多个WebSocket特定的头部
  • 服务器使用状态码101响应

一旦建立连接,客户端和服务器可以在任何时候双向发送数据。

1.3 Design Philosophy (设计理念)

WebSocket协议设计基于以下原则:

  1. 基于框架而非流的协议: 基于帧的协议允许元数据与每个帧关联,并允许协议保留到应用层的消息边界
  2. 原点模型: 使用浏览器原点模型来确保安全性
  3. 单一TCP连接: 为了在HTTP端口80和443上工作
  4. 独立于HTTP: 虽然握手被HTTP服务器解释为Upgrade请求,但协议本身是独立的
  5. 可扩展性: 通过扩展和子协议机制支持未来的扩展

1.4 Security Model (安全模型)

WebSocket协议使用原点模型 (Origin Model),该模型通常用于Web浏览器。该协议包括一个原点头字段,服务器可以使用该字段来决定是否接受来自给定来源的WebSocket连接。

此外:

  • 建议使用TLS加密连接(wss://)
  • 客户端到服务器的帧必须进行掩码处理
  • 协议包括帧类型、操作码等,以防止缓存中毒

参考链接