WebSocket握手失败101状态码没返回是为什么?

尼克

尼克

2026-05-09

748人浏览

原创

协议升级失败时未出现101响应,主因是反向代理未透传upgrade头、服务端未正确处理upgrade请求、sec-websocket-key校验失败、tls证书问题或origin校验拦截。

websocket握手失败101状态码没返回是为什么?

如果您在浏览器中发起 WebSocket 连接请求,但 Network 面板中未看到 HTTP/1.1 101 Switching Protocols 响应,则说明协议升级过程在某一层被中断。该问题通常表现为静默失败——无 JavaScript 报错、onerror 不触发或延迟触发,仅连接状态长期停留在 CONNECTING(0)或直接跳转为 CLOSED(3)。以下是定位与修复此问题的多种途径:

一、检查反向代理(如 Nginx)是否透传 Upgrade 头部

Nginx 等网关默认不识别 WebSocket 协议升级机制,若未显式配置,会将 Upgrade 和 Connection 头过滤或改写,导致后端服务收不到合法握手请求,因而无法生成 101 响应。

1、打开 Nginx 配置文件,定位到对应 location 块(例如 location /ws/location /api/socket/)。

2、确认已添加以下三行且拼写准确(注意大小写与引号):
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

3、检查 proxy_pass 指向地址是否可达,且后端服务监听地址与端口匹配(例如 http://127.0.0.1:8080)。

4、执行 nginx -t 验证语法,再运行 nginx -s reload 重载配置。

二、验证服务端是否正确处理 Upgrade 请求头

WebSocket 握手依赖客户端发送的两个关键请求头:Upgrade: websocket 和 Connection: Upgrade。若服务端框架(如 Workerman、Swoole、Ratchet 或自研 HTTP 服务器)未校验或忽略这两个字段,将直接返回 400 或 500,跳过 101 响应流程。

1、在服务端入口逻辑中插入日志,打印原始请求头:var_dump($request->getHeader('Upgrade'), $request->getHeader('Connection'));

2、确认输出中 Upgrade 值为 websocket(全小写,无空格),Connection 值包含 Upgrade(大小写敏感)。

3、若任一头缺失或值错误,需检查中间件、路由匹配逻辑或 HTTPS 重定向是否提前终止了原始请求。

4、对基于 PHP-FPM 的部署,确保服务端未运行于 CGI/FastCGI 模式——因进程生命周期极短,无法维持升级后的长连接,必须使用常驻进程模型(如 php start.php start -d)。

三、排查 Sec-WebSocket-Key 校验与响应头污染

服务端收到有效 Upgrade 请求后,必须依据 Sec-WebSocket-Key 计算 Sec-WebSocket-Accept 值,并返回完整响应头。任何计算错误、额外输出(BOM、echo、错误警告、var_dump)都会污染响应体,使浏览器拒绝升级,即便状态码为 101 也无法完成握手。

1、在服务端生成 Sec-WebSocket-Accept 前,调用 ob_end_clean() 清除所有输出缓冲区。

WebSocket 8.18.2
WebSocket 8.18.2

WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。

下载

2、Sec-WebSocket-Accept 必须严格按规范计算:对客户端 Sec-WebSocket-Key 字符串拼接固定 GUID 258EAFA5-E914-47DA-95CA-C5AB0DC85B11,进行 SHA-1 哈希后 Base64 编码。

3、响应中必须包含且仅包含以下必需头:HTTP/1.1 101 Switching ProtocolsUpgrade: websocketConnection: UpgradeSec-WebSocket-Accept: [base64-sha1-value]

4、使用 curl 手动模拟握手请求,观察原始响应字节流:curl -i -N -H "Upgrade: websocket" -H "Connection: Upgrade" -H "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==" -H "Sec-WebSocket-Version: 13" http://localhost:8080/ws

四、确认 TLS/SSL 层未拦截 wss:// 握手

当使用 wss:// 协议时,TLS 握手先于 HTTP 升级发生。若证书无效(自签名、过期、域名不匹配、链不完整),浏览器会在 TCP 层或 TLS 层静默终止连接,Network 面板可能显示 failed 或无任何请求记录,根本不会发出 Upgrade 请求。

1、访问同域名下的普通 HTTPS 页面(如 https://yourdomain.com/health),确认浏览器地址栏显示安全锁图标且无证书警告。

2、使用 openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 检查证书链完整性与有效期。

3、若为本地开发环境,确保已将自签名 CA 证书导入操作系统及浏览器信任库,而非仅在代码中设置 ignore SSL verify。

4、检查负载均衡器(如 AWS ALB、Cloudflare)是否启用了“强制 HTTPS”或“最低 TLS 版本”策略,导致早期 TLS 握手失败。

五、审查跨域与 Origin 校验逻辑

尽管 WebSocket 协议本身不受同源策略限制,但服务端常主动校验 Origin 头以防范 CSRF。若校验失败并返回 403 或直接关闭连接,浏览器将收不到 101 响应,且控制台可能无明确提示。

1、在浏览器 DevTools 的 Network 面板中,点击 WebSocket 请求,查看 Request Headers 中的 Origin 值(如 https://admin.example.com)。

2、检查服务端代码中 Origin 白名单配置,确认该值被显式允许(避免仅允许 *,尤其在携带 Cookie 时无效)。

3、若服务端返回 403,需在响应中添加 Access-Control-Allow-Origin 头(仅对握手阶段的 HTTP 请求生效,不影响后续 WebSocket 数据帧)。

4、禁用浏览器扩展(如广告拦截器、隐私保护插件),某些插件会主动篡改或屏蔽 Origin 头。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

状态码 websocket

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Golang WebSocket与实时通信开发
Golang WebSocket与实时通信开发

本专题系统讲解 Golang 在 WebSocket 开发中的应用,涵盖 WebSocket 协议、连接管理、消息推送、心跳机制、群聊功能与广播系统的实现。通过构建实际的聊天应用或实时数据推送系统,帮助开发者掌握 如何使用 Golang 构建高效、可靠的实时通信系统,提高并发处理与系统的可扩展性。

2025.12.22

115

11

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

2026.01.19

250

22

Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

2026.03.18

91

14

WebSocket 前端开发与实战技巧
WebSocket 前端开发与实战技巧

聚焦 WebSocket 在前端项目中的工程化实践,涵盖原生 JavaScript WebSocket 连接的封装与状态管理、Vue 3 中 WebSocket 的 Composable 封装(useWebSocket)、React 中自定义 Hook 管理连接生命周期、心跳检测(Ping/Pong 定时器)与自动断线重连的实现策略、指数退避重连算法、消息序列化协议(JSON / Protobuf / MessagePack)的选型与性

2026.05.25

224

33

WebSocket发送和接收数据教程合集
WebSocket发送和接收数据教程合集

本专题整合了WebSocket发送与接收数据教程合集,阅读专题下面的文章了解更多详细内容。

2026.05.25

155

20

Qt Creator新建项目使用教程
Qt Creator新建项目使用教程

本专题整理 Qt Creator 新建项目、打开已有工程、项目模板选择、目录结构、源文件管理、构建目录、运行配置和项目迁移方法,重点解决新手不知道选 qmake 还是 CMake、项目打不开、文件不参与编译等常见问题。

2026.08.05

0

10

maven常用插件使用大全
maven常用插件使用大全

PHP中文网精心整理Maven主流插件用法合集,涵盖编译、测试、打包等常用插件使用大全。从基础配置到进阶实战,详细解析各插件功能与适用场景,助你轻松掌握Maven自动化构建,解决Java项目开发痛点,是开发者必备的实用指南。

2026.08.05

0

31

PyCharm快速入门指南
PyCharm快速入门指南

本专题汇总了PyCharm快速入门的全套指南与教程,涵盖从官网下载安装、创建第一个Python项目、配置虚拟环境,到代码编辑、运行调试等基础操作,并整理了版本控制(Git)集成、常用高效快捷键及实用插件等进阶技巧,助你快速上手这款高效的Python IDE。

2026.08.05

2

17

PyCharm运行程序教程大全
PyCharm运行程序教程大全

本专题汇总了PyCharm运行程序的多种方式与详细操作步骤,涵盖通过主菜单Run、点击工具栏绿色三角图标、使用快捷键Shift+F10(或Ctrl+Shift+F10)等基本运行方法,以及配置运行/调试参数、设置PYTHONPATH环境变量、管理多脚本运行与交互式Python控制台调试等进阶技巧,助您全面掌握在PyCharm中高效运行与管理Python程序的方法。

2026.08.05

0

14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebSocket手册
WebSocket手册

共0课时 | 0人学习

Webman中文手册
Webman中文手册

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习