菜单

WebSocket 协议

相关源文件

本文档介绍了 Deno 对 WebSocket 协议的实现,包括客户端 WebSocket 连接以及通过 HTTP 升级实现的服务器端 WebSocket 处理。此实现支持传统的 WebSocket API 和较新的 WebSocketStream API,并全面支持 HTTP/1.1 和 HTTP/2 协议。

有关 HTTP 服务器功能,请参阅Fetch 和 HTTP。有关通用网络原语,请参阅网络

架构概述

Deno 的 WebSocket 实现跨越多个层,从 JavaScript API 到基于 Rust 的协议处理。该系统同时支持客户端连接和服务器端 WebSocket 升级。

来源:ext/websocket/lib.rs903-935 ext/websocket/01_websocket.js126-274 ext/websocket/02_websocketstream.js93-285

客户端 WebSocket 实现

客户端 WebSocket 实现从 JavaScript WebSocket 构造函数开始,一直到建立底层的网络连接。

WebSocket 构造函数和连接流程

来源:ext/websocket/01_websocket.js126-274 ext/websocket/lib.rs467-533

WebSocket 构造函数执行多个验证步骤

验证步骤实现错误类型
URL Scheme只允许 ws:wss:SyntaxError
URL 片段WebSocket URL 不允许片段SyntaxError
协议重复不能多次提供相同的协议SyntaxError
权限需要网络访问权限PermissionCheckError

来源:ext/websocket/01_websocket.js158-217

WebSocket 握手过程

握手过程根据协议方案和 HTTP 版本而有所不同

来源:ext/websocket/lib.rs277-299 ext/websocket/lib.rs302-328 ext/websocket/lib.rs331-384

消息处理和数据类型

WebSocket 实现支持多种数据类型用于发送和接收消息

数据类型Send 方法Op 实现接收类型
字符串send(string)op_ws_send_textMessageEvent,数据为 string
ArrayBuffersend(arrayBuffer)op_ws_send_binary_abMessageEvent,数据为 ArrayBuffer/Blob
ArrayBufferViewsend(view)op_ws_send_binaryMessageEvent,数据为 ArrayBuffer/Blob
Blobsend(blob)异步转换为二进制MessageEvent,数据为 ArrayBuffer/Blob

来源:ext/websocket/01_websocket.js337-373 ext/websocket/lib.rs646-687

服务器端 WebSocket 支持

服务器端 WebSocket 支持通过升级机制与 Deno 的 HTTP 服务基础设施集成。

HTTP 到 WebSocket 升级

来源:ext/http/01_http.js360-383 ext/http/lib.rs202-224

升级过程涉及 HTTP 扩展处理的几个关键步骤

  1. 请求验证:检查正确的 WebSocket 升级头
  2. 响应生成:创建 101 Switching Protocols 响应
  3. 连接移交:将底层连接转移到 WebSocket 处理
  4. 资源创建:为消息处理创建 ServerWebSocket 资源

来源:ext/http/websocket_upgrade.rs235-299

WebSocket 服务器资源管理

The ServerWebSocket 资源管理服务器端连接的生命周期

来源:ext/websocket/lib.rs556-601

WebSocketStream 实现

The WebSocketStream API 使用 Streams API 提供了一种更现代、基于流的 WebSocket 通信方法。

WebSocketStream 架构

来源:ext/websocket/02_websocketstream.js102-285

WebSocketStream 与传统 WebSocket 对比

功能传统 WebSocketWebSocketStream
API 样式基于事件基于流
反压手动缓冲通过流自动处理
数据流回调 (onmessage)ReadableStream.read()
Send 方法send() 同步/异步WritableStream.write()
错误处理事件监听器Promise 拒绝

来源:ext/websocket/01_websocket.js337-373 ext/websocket/02_websocketstream.js210-249

协议支持和网络处理

Deno 的 WebSocket 实现支持 HTTP/1.1 和 HTTP/2 协议,并具有自动回退机制。

协议检测和握手

来源:ext/websocket/lib.rs310-328 ext/websocket/lib.rs331-384

消息处理管道

消息处理遵循一致的模式,无论底层 HTTP 版本如何

消息类型Op CodeJavaScript 事件数据处理
文本0message,带 stringUTF-8 验证
二进制文件1message,带 ArrayBuffer/Blob直接二进制数据
Pong2内部处理心跳响应
Close>5close 事件连接终止
错误3error 事件错误传播

来源:ext/websocket/01_websocket.js463-557 ext/websocket/lib.rs825-901

安全与权限

Deno 中的 WebSocket 连接与其他网络操作一样,受相同的权限模型约束。

权限检查

来源:ext/websocket/lib.rs158-182 ext/websocket/01_websocket.js213-217

该权限系统会验证:

  • 目标 URL 的网络访问权限
  • wss:// 连接的 TLS 证书验证
  • 特定域名的权限授予
  • 不安全证书忽略选项(如果已配置)

来源:ext/websocket/lib.rs403-425 ext/websocket/lib.rs407-410