Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WebSocket config: Add heartbeatPeriod for client & server #4065

Merged
merged 7 commits into from
Nov 29, 2024
Merged

Conversation

hr567
Copy link
Contributor

@hr567 hr567 commented Nov 26, 2024

通过定时发送 ping message 为 WebSocket 传输模式添加心跳机制。未来可以改进为一段时间没有传输后发送。
为 ws 配置添加一项 heartbeat 配置,表示间隔固定时长发送 ping,单位为秒。默认为0,不指定时不发送ping,与当前行为一致。
(对xray和go都不太熟悉,如有疏漏请随意修改指正

@Fangliding
Copy link
Member

em 没加config选项啊
不过ws已经有那么久了 没看懂加个ping作用在哪

@yuhan6665
Copy link
Member

yeah I agree with @Fangliding , it seem the keepalive mechanism should be handled by lower layer, eg. TCP/H2/QUIC

@hr567
Copy link
Contributor Author

hr567 commented Nov 26, 2024

config是还需要修改其他文件吗,我不太清楚,添加了一个疑似config的地方,如果还需要其他修改请帮忙补充一下,感谢
有些反向代理仅通过http读写超时判断关闭连接,ws无message负载后短时间内就会被关闭,导致部分情况下tcp连接非预期eof。仅设置tcp keepalive超时无法改善这一情况,在ws层加入ping/pong可以比较好的缓解这个问题。

@RPRX
Copy link
Member

RPRX commented Nov 27, 2024

虽然 websocket 快被我们标为 deprecated 了,不过考虑到是 first-time contributor,我们一般会鼓励贡献

有些反向代理仅通过http读写超时判断关闭连接,ws无message负载后短时间内就会被关闭

所以你是遇到了这个问题吗,具体是什么中间件

@hr567
Copy link
Contributor Author

hr567 commented Nov 27, 2024

所以你是遇到了这个问题吗,具体是什么中间件

我使用的CDN在代理WS时超时设置过小且目前无法设置,所以代理TCP连接时一段时间没有数据传输连接就会被迅速关闭,实测为出站设置更长的TCP keepalive对于我的CDN没有效果(比如用GPT的时候GPT正在思考,思考着思考着网络超时错误了

WebSocket虽然设计得也不好也快被抛弃了,不过目前在CDN支持是最完善的,使用xhttp在我的场景还有一些问题CDN不支持流式然后上传Post被负载均衡转发到不同服务器去了,后续如果我尝试一下如果能解决的话切换到xhttp可能是最好的。目前看给Websocket添加一个heartbeat是对于我来说比较简单的解决方案,也不会对当前的版本引入破坏性的更改。

@xqzr
Copy link
Contributor

xqzr commented Nov 27, 2024

看起来不错!
有了它,不出意外,就不用配置它了
https://github.com/XTLS/Xray-examples/blob/d65029fd208aef89d207e471fa488db48a0bc6cb/VLESS-WSS-Nginx/nginx.conf#L27

@Fangliding
Copy link
Member

其实与其在每个传输都塞 开mux也能保活连接

@hr567
Copy link
Contributor Author

hr567 commented Nov 27, 2024

其实与其在每个传输都塞 开mux也能保活连接

因为我的场景使用的是CDN且对延迟不敏感,开启 mux 多路复用对带宽利用的负面影响还挺大的。

mux 增加了协议的复杂性,在不需要多路复用的情况下为了连接保活开启 mux 感觉有些多余,而且 mux 也没有暴露 keepalive 间隔的配置项。

@LearZhou
Copy link

這個 pull request 能解決長連接問題嗎?

一個典型用例是通過 Xray 代理來連 ssh,容易遇到連接被中斷、無法保持的問題,尤其是在等待命令的時候。

@Fangliding
Copy link
Member

Fangliding commented Nov 27, 2024

ssh有自己的保活的 设置了也断是被掐了

@hr567
Copy link
Contributor Author

hr567 commented Nov 27, 2024

這個 pull request 能解決長連接問題嗎?

这个配置只能解决长连接中ws传输超时的问题,实际上还需要根据具体的应用等多个方面综合来看

一個典型用例是通過 Xray 代理來連 ssh,容易遇到連接被中斷、無法保持的問題,尤其是在等待命令的時候。

具体到SSH可以尝试通过配置调整缩短保活的时间间隔,较短的心跳包间隔也许能避免连接被中断

@RPRX RPRX changed the title transport/websocket: add heartbeat parameter for connection keep-alive WebSocket: Add heartbeat for client & server Nov 29, 2024
@RPRX RPRX changed the title WebSocket: Add heartbeat for client & server WebSocket config: Add heartbeatPeriod for client & server Nov 29, 2024
@RPRX
Copy link
Member

RPRX commented Nov 29, 2024

为了和另一个 PR 像一些,改名 heartbeatPeriod,没有上传权限好麻烦

@RPRX RPRX merged commit 4f6f126 into XTLS:main Nov 29, 2024
36 checks passed
@RPRX
Copy link
Member

RPRX commented Nov 29, 2024

感谢 PR,你试下配置 heartbeatPeriod 是否有效

@hr567
Copy link
Contributor Author

hr567 commented Nov 29, 2024

感谢 PR,你试下配置 heartbeatPeriod 是否有效

已测试通过配置解决了TCP空闲时断连问题,感谢各位大佬的Review

@Benjamin1919
Copy link

httpupgrade 是不是也可以使用 heartbeatPeriod 这个参数?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants