使用 Socket.IO 时出现“错误:无效的 WebSocket 帧:RSV1 必须清除”

问题描述 投票:0回答:2
我收到此错误“错误:无效的 WebSocket 帧:RSV1 必须清除”可能是什么问题?

我正在使用 socket.io 包通过以下代码连接到 Node.js。

let app = express(); const http = require("http").createServer(app); const io = require("socket.io")(http, /*options*/); io.on('connection', function (socket) { console.log('a user connected'); socket.conn.on('upgrade', ()=>{ const upgradedTransport = socket.conn.transport.name; }); socket.conn.on('upgrade', ()=>{ const upgradedTransport = socket.conn.transport.name; }); socket.on('create or join', function (room) {...}); socket.on('ready', function (room) {...}); socket.on('candidate', function (event){...}); ..... ..... socket.on('hangup', function (room) { socket.leave(room); socket.emit('hangup', room); }); }); });
这是我的 Nginx 配置,

map $http_upgrade $connection_upgrade { default upgrade; '' close; } upstream websocket { server 127.0.0.1:1337; } server { server_name mydomain.subdomain.com; root /usr/share/nginx/html; include /etc/nginx/default.d/*.conf; underscores_in_headers on; location /socket.io/ { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:1337; # this magic is needed for WebSocket proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } location / { proxy_pass http://127.0.0.1:8094; } listen [::]:443 ssl ipv6only=on; listen 443 ssl; ssl_certificate ... ssl_certificate_key /etc/...; include /etc/...; ssl_dhparam /etc/...; } server { if ($host = mydomain.subdomain.com) { return 301 https://$host$request_uri; } # managed by Certbot listen 80; listen [::]:80; server_name mydomain.subdomain.com; return 404; }
向邮递员请求时,握手详情如下,

握手详情

Request URL: https://mydomain.subdomain.com/socket.io Request Method: GET Status Code: 101 Switching Protocols Request Headers Sec-WebSocket-Version: 13 Sec-WebSocket-Key: 3DlYbOFVRGepjPrOd92Zew== Connection: Upgrade Upgrade: websocket Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits Host: mydomain.subdomain.com
还有响应头,

Server: nginx/1.14.0 (Ubuntu) Date: Tue, 10 May 2022 12:50:41 GMT Connection: upgrade Upgrade: websocket Sec-WebSocket-Accept: FB8P5FMN8gPIsHjfRrrIoe+9+OI=
我收到此错误“错误:无效的 WebSocket 帧:RSV1 必须清除”可能是什么问题?谢谢你帮我。

node.js websocket socket.io nginx-config
2个回答
0
投票
您可以在请求标头中看到特定 WebSocket 扩展的设置 - 消息压缩:

Sec-WebSocket-Extensions: permessage-deflate;
我认为默认情况下,websocket 客户端会对消息使用压缩,但它接收到的数据帧不包含压缩位,因此会导致:

Invalid data frame: RSV1 must be clear
很可能是服务器中没有配置相关的压缩设置。因此,当您创建 WebSocket 服务器时,请尝试将以下选项传递给它:

let server = new Server({ perMessageDeflate: { threshold: 2048, // defaults to 1024 zlibDeflateOptions: { chunkSize: 8 * 1024, // defaults to 16 * 1024 }, zlibInflateOptions: { windowBits: 14, // defaults to 15 memLevel: 7, // defaults to 8 }, clientNoContextTakeover: true, // defaults to negotiated value. serverNoContextTakeover: true, // defaults to negotiated value. serverMaxWindowBits: 10, // defaults to negotiated value. concurrencyLimit: 20, // defaults to 10 }, });
您可能会看到错误随后就会消失。


0
投票
好吧,我应用了这个,但现在我收到此错误:

无效的 WebSocket 帧:必须设置 FIN

这是时间表:

* WebSocket connection established * Preparing request to ws://localhost:3000/chat/RELIANCE * Current time is 2024-01-14T22:16:51.680Z * Using HTTP 1.1 > GET /chat/RELIANCE HTTP/1.1 > user-agent: insomnia/8.5.1 > authorization: Bearer sometoken > cookie: null; > Sec-WebSocket-Version: 13 > Sec-WebSocket-Key: GpME3yEfzG4T+mLP9mLMWw== > Connection: Upgrade > Upgrade: websocket > Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits > Host: localhost:3000 < HTTP/1.1 101 Switching Protocols < upgrade: websocket < connection: Upgrade < sec-websocket-accept: g5pg3cR9XPLGJYwyDYCoV64O8i4= < sec-websocket-extensions: permessage-deflate; server_no_context_takeover; client_no_context_takeover; server_max_window_bits=10 * Invalid WebSocket frame: FIN must be set
    
© www.soinside.com 2019 - 2024. All rights reserved.