当前位置: 首页 > news >正文

WebSocket的参数粗略解释

一、握手阶段(HTTP 升级请求)

1. 请求行参数

格式GET /{path}?{query} HTTP/1.1
/{path}
服务端监听路径,用于指定 WebSocket 服务端点(如 /chat)。支持路径参数动态匹配(如 /room/123)。
?{query}
附加查询参数,常用于身份验证(如 token=abc)或传递初始化数据。需手动解析键值对。

2. 必需请求头
请求头作用与格式示例
Upgrade固定为 websocket,声明协议升级。Upgrade: websocket
Connection固定为 Upgrade,表示需保持长连接。Connection: Upgrade
Sec-WebSocket-Key客户端生成的 16 字节随机数 Base64 编码,用于安全验证。服务端需将其与 GUID 拼接后计算 SHA-1 哈希并返回 Sec-WebSocket-AcceptSec-WebSocket-Key: dGhlIHNhbXBsZQ==
Sec-WebSocket-Version固定为 13,表示使用 WebSocket 协议第 13 版。Sec-WebSocket-Version: 13
3. 可选请求头
请求头作用与格式示例
Origin请求来源域名,用于跨域策略验证。若为空或未授权,服务端可拒绝连接。Origin: http://client-domain.com
Sec-WebSocket-Protocol客户端支持的子协议列表(如 chatbinary),服务端需选择其一返回。Sec-WebSocket-Protocol: chat, video
Cookie传递 HTTP 会话 Cookie,用于身份关联(需服务端配置支持)。Cookie: sessionId=abc123
Authorization身份验证凭证(如 Bearer Token),替代 URL 参数传递敏感信息。Authorization: Bearer eyJhbGci...

二、客户端构造函数参数(WebSocket API)

1. url 参数

格式ws://host:port/path?querywss://host:port/path?query
ws vs wssws 为明文协议(默认端口 80),wss 为加密协议(默认端口 443)。
动态路径:支持路径参数(如 /user/123),服务端可通过解析路径实现资源隔离。

2. protocols 参数

作用:声明客户端支持的子协议列表(字符串或数组),服务端选择其一返回 Sec-WebSocket-Protocol 响应头。

// 示例:声明两种子协议
const socket = new WebSocket("ws://example.com", ["chat-v1", "binary-v2"]);

三、数据传输阶段参数(数据帧格式)

WebSocket 数据帧由以下字段构成,用于控制数据传输:

字段名长度(位)作用与取值
FIN1标识是否为消息的最后一个分片(1=结束,0=还有后续帧)。
RSV1-33保留位,需为 0(除非协商了扩展)。
Opcode4定义数据类型:
0x1 文本帧
0x2 二进制帧
0x8 关闭帧
0x9 Ping 帧等。
Mask1客户端到服务端的数据必须掩码(1=启用,0=禁用)。服务端到客户端禁止掩码。
Payload Length7/16/64负载长度:
• 0-125:直接表示长度
• 126:后 2 字节为长度
• 127:后 8 字节为长度。
Masking-Key32掩码密钥(仅当 Mask=1 时存在),用于异或运算解码负载数据。
Payload Data可变实际传输的数据(如 JSON、二进制流)。

四、关键验证与处理逻辑

  1. 安全握手验证
    服务端需计算 Sec-WebSocket-Accept

    key = client_key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
    accept = base64(sha1(key))
    

    若验证失败,返回 401 Unauthorized 并关闭连接。

  2. 跨域处理
    服务端需在响应头添加 Access-Control-Allow-Origin,或通过拦截器动态验证 Origin 头。

  3. 子协议协商
    服务端从客户端 Sec-WebSocket-Protocol 中选择支持的协议,返回给客户端以实现多逻辑分支处理。


五、常见问题与调试

连接失败:检查端口是否开放、路径是否匹配、跨域策略是否允许。
数据解析错误:验证 Opcode 类型与负载格式是否一致,或检查掩码解码逻辑。
性能优化:使用二进制帧(Opcode=0x2)传输结构化数据(如 Protobuf),减少带宽占用。

通过合理配置上述参数,可构建高效、安全的实时通信系统。具体实现可参考各语言库(如 Node.js 的 ws 或 Java 的 Tyrus)的文档。

相关文章:

  • AVL树的平衡算法的简化问题
  • 数据类型及sizeof,进制转换
  • go中实现子模块调用main包中函数的方法
  • /etc/sysconfig/jenkins 没有这个文件
  • 计算机网络-TCP/IP协议族
  • 无再暴露源站!群联AI云防护IP隐匿方案+防绕过实战
  • netsh实现TCP端口转发
  • 40.动态规划13
  • Ansible命令行模式常用模块使用案例(三)
  • Python与Solidity联手:从跨语言智能合约开发到区块链生态跃迁
  • 实习笔试-01字符转换小写字母
  • 【AWS入门】2025 AWS亚马逊云科技账户注册指南
  • 《解锁华为黑科技:MindSpore+鸿蒙深度集成奥秘》
  • A Survey on Mixture of Experts 混合专家模型综述(第二部分:混合专家系统设计)
  • 机器学习基础
  • MyBatis 如何解析 XML 配置文件和 SQL 映射文件
  • 【综述】An Introduction to Vision-Language Modeling【二】
  • WordPress调用当前文章作者头像
  • 使用Flask和OpenCV 实现树莓派与客户端的视频流传输与显示
  • Nature | TabPFN:表格基础模型用于小规模数据分析
  • 中国情怀:时代记录与家国镜相|澎湃·镜相第三届非虚构写作大赛征稿启事
  • 俄代表团:16日上午将继续“等候乌代表团”
  • 北方产粮大省遭遇气象干旱,夏粮用水如何解决?
  • “远践”项目启动公益生态圈,上海青少年公益力量蓬勃生长
  • 俄乌拟在土耳其举行会谈,特朗普:我可能飞过去
  • 白玉兰奖征片综述丨综艺市场破局焕新,多元赛道重塑价值坐标