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协议设计基于以下原则:
- 基于框架而非流的协议: 基于帧的协议允许元数据与每个帧关联,并允许协议保留到应用层的消息边界
- 原点模型: 使用浏览器原点模型来确保安全性
- 单一TCP连接: 为了在HTTP端口80和443上工作
- 独立于HTTP: 虽然握手被HTTP服务器解释为Upgrade请求,但协议本身是独立的
- 可扩展性: 通过扩展和子协议机制支持未来的扩展
1.4 Security Model (安全模型)
WebSocket协议使用原点模型 (Origin Model),该模型通常用于Web浏览器。该协议包括一个原点头字段,服务器可以使用该字段来决定是否接受来自给定来源的WebSocket连接。
此外:
- 建议使用TLS加密连接(wss://)
- 客户端到服务器的帧必须进行掩码处理
- 协议包括帧类型、操作码等,以防止缓存中毒
参考链接
- 详细实现: 查看实现指南了解完整的握手流程、代码示例
- 下一章: 2. Conformance Requirements