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

transport/websocket: add heartbeat parameter for connection keep-alive #4065

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

hr567
Copy link

@hr567 hr567 commented Nov 26, 2024

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

hr567 added a commit to hr567/Xray-docs-next that referenced this pull request Nov 26, 2024
@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
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
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
Author

hr567 commented Nov 27, 2024

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

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

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

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.

5 participants