websocket是如何实现握手?

WebSocket 握手是客户端和服务器之间建立 WebSocket 连接的第一步。它本质上是一个 HTTP 请求和响应,用于升级协议从 HTTP 到 WebSocket。以下是握手的具体步骤:

1. 客户端发送 WebSocket 握手请求:

客户端向服务器发送一个 HTTP 请求,其中包含一些特殊的头部信息,表明它想要升级到 WebSocket 协议。这个请求通常是一个 GET 请求,指向 ws:// 或 wss:// (加密连接) 开头的 URI。

关键的头部信息包括:

  • Connection: Upgrade: 表示客户端希望升级到不同的协议。
  • Upgrade: websocket: 指定要升级到的协议是 WebSocket。
  • Sec-WebSocket-Key: 一个随机生成的 Base64 编码的字符串,用于防止代理服务器缓存和重用握手。服务器必须使用这个 key 进行特定的计算并返回结果。
  • Sec-WebSocket-Version: 指定客户端支持的 WebSocket 协议版本,通常是 13。
  • Origin (可选): 指示请求的来源,用于安全策略。
  • Sec-WebSocket-Protocol (可选): 客户端支持的子协议列表,服务器可以选择其中一个。
  • Sec-WebSocket-Extensions (可选): 客户端希望使用的扩展。

示例请求:

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

2. 服务器响应 WebSocket 握手请求:

如果服务器同意建立 WebSocket 连接,它会返回一个 HTTP 101 Switching Protocols 响应。这个响应也包含一些特殊的头部信息,确认升级到 WebSocket 协议。

关键的头部信息包括:

  • Upgrade: websocket: 确认升级到 WebSocket 协议。
  • Connection: Upgrade: 确认连接升级。
  • Sec-WebSocket-Accept: 服务器根据客户端提供的 Sec-WebSocket-Key 计算出的值。这是握手过程中至关重要的一步,用于证明服务器确实收到了客户端的请求并同意建立 WebSocket 连接。计算方法是将 Sec-WebSocket-Key 与一个固定的 GUID ("258EAFA5-E914-47DA-95CA-C5AB0DC85B11") 连接起来,然后计算 SHA-1 哈希值,最后将哈希值进行 Base64 编码。

示例响应:

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

3. 连接建立:

一旦客户端收到服务器的 101 响应,WebSocket 连接就建立完成了。客户端和服务器就可以开始双向通信,发送和接收 WebSocket 数据帧。

如果握手失败:

如果服务器拒绝建立 WebSocket 连接,它会返回一个普通的 HTTP 错误响应,例如 400 Bad Request 或 404 Not Found。客户端可以通过检查响应的状态码来判断握手是否成功。

前端开发中的 WebSocket 握手:

在前端开发中,通常使用 JavaScript 的 WebSocket API 来建立 WebSocket 连接。开发者无需手动构建 HTTP 请求和解析响应,WebSocket API 会自动处理握手过程。

const socket = new WebSocket('ws://example.com/chat');

socket.onopen = function(event) {
  console.log('WebSocket connection opened');
posted @ 2024-12-10 09:31  王铁柱6  阅读(439)  评论(0)    收藏  举报