相关疑难解决方法(0)

WebSockets ping/pong,为什么不用TCP keepalive?

WebSockets 可以选择将ping发送到另一端,另一端应该用pong响应.

收到Ping帧后,端点必须发送Pong帧作为响应,除非它已经收到一个关闭帧.它应该尽快响应Pong框架.

TCP 以keepalive的形式提供类似的东西:

[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?

tcp keep-alive websocket

63
推荐指数
4
解决办法
4万
查看次数

使用websockets处理连接丢失

我最近设置了一个本地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'风格?

javascript firefox firefox-addon websocket

29
推荐指数
4
解决办法
5万
查看次数

标签 统计

websocket ×2

firefox ×1

firefox-addon ×1

javascript ×1

keep-alive ×1

tcp ×1