WebSockets 可以选择将ping发送到另一端,另一端应该用pong响应.
收到Ping帧后,端点必须发送Pong帧作为响应,除非它已经收到一个关闭帧.它应该尽快响应Pong框架.
[Y]你向对等体发送一个keepalive探测包,其中没有数据,并且ACK标志打开.您可以这样做是因为TCP/IP规范,作为一种重复的ACK,并且远程端点将没有参数,因为TCP是面向流的协议.另一方面,您将收到来自远程主机的回复(根本不需要支持keepalive,只需TCP/IP),没有数据和ACK设置.
我认为TCP keepalive效率更高,因为它可以在内核中处理而无需将数据传输到用户空间,解析websocket框架,制作响应框架,然后将其交回内核进行传输.它也减少了网络流量.
此外,WebSockets 被明确指定为始终在TCP上运行; 它们不是传输层不可知的,因此TCP keepalive始终可用:
WebSocket协议是一种独立的基于TCP的协议.
那么为什么人们会想要使用WebSocket ping/pong而不是TCP keepalive?
我最近设置了一个本地WebSocket服务器工作正常,但是我有一些麻烦,了解我应该如何处理客户端或服务器故意启动的突然断开连接,即:服务器断电,以太网电缆退出等...我需要客户端知道连接是否在〜10秒内丢失.
客户端,连接简单:
var websocket_conn = new WebSocket('ws://192.168.0.5:3000');
websocket_conn.onopen = function(e) {
console.log('Connected!');
};
websocket_conn.onclose = function(e) {
console.log('Disconnected!');
};
Run Code Online (Sandbox Code Playgroud)
我可以手动触发连接断开,工作正常,
websocket_conn.close();
Run Code Online (Sandbox Code Playgroud)
但是,如果我只是将以太网电缆拉出计算机背面,或者禁用连接,onclose则不会被调用.我在另一篇文章中读到,当TCP检测到连接丢失时,它最终会被调用,但是我不需要及时作为Firefox的默认设置我认为是10分钟,我真的不想去大约数百台计算机about:config改变了这个值.我读过的唯一其他建议是使用'ping/pong'保持活动的轮询样式方法,这似乎与websockets的想法相违背.
有没有更简单的方法来检测这种断开行为?从技术角度看,我正在阅读的旧帖子是否仍然是最新的,最好的方法仍然是'ping/pong'风格?