在 socket.io 上设置高关闭超时是不是安全?

Posted

技术标签:

【中文标题】在 socket.io 上设置高关闭超时是不是安全?【英文标题】:Is it safe to set a high close timeout on socket.io?在 socket.io 上设置高关闭超时是否安全? 【发布时间】:2013-02-01 14:42:05 【问题描述】:

我有一个需要不断连接用户的网络应用程序。默认情况下,socket.io 会在 60 秒后断开连接。我已经打开了“重新连接”,所以它基本上每分钟都会关闭和重新打开连接。这可能会导致我连接的客户端的提要/通知出现问题。将此超时设置为 10 分钟或可能更高是否安全?现在这么低有什么原因吗?

【问题讨论】:

【参考方案1】:

我认为您的套接字不会在 60 秒后断开连接。我会调查为什么会发生这种情况。正确握手后,套接字应该心跳并无限期保持打开状态(禁止网络问题超出您的控制),直到客户端或服务器关闭连接,这绝对是我的经验。

您的连接实际上正在关闭的事实听起来可能没有正确握手,或者没有收到心跳。

【讨论】:

【参考方案2】:

我的猜测是您可能误解了'close timeout' 配置。它不会导致连接在 60 秒后关闭。 (如果客户端不断重新连接,心跳将毫无意义)。

如果客户端断开连接,close timeout 是服务器在释放与该连接关联的资源之前等待的时间量。从本质上讲,这允许存在间歇性连接问题的客户端在服务器忘记它们之前尝试重新连接。将close timeout 设置为十分钟可能是个坏主意,因为它会占用服务器资源。

如果您的客户端实际上每 60 秒断开一次连接,那么就像 samjm 所说的那样,还有其他问题。

【讨论】:

【参考方案3】:

您可能已经知道这一点,但您的套接字可能会在 60 秒后断开连接,因为您没有将心跳(“2::”)发送回服务器。

这里有一些适用于websocket client module 的 Python 代码。

# on_message handles messages from the server
def on_message(ws, message):
    if message[:3] == '2::':
        ws.send('2::')

【讨论】:

以上是关于在 socket.io 上设置高关闭超时是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io 与 flask-socketio python。如何设置套接字保持活动/超时

socket.io heroku 请求超时

Node.js + Socket.io |在服务器上设置自定义标头

Socket.io + Nginx + AWS Application Load Balancer 连接在建立之前关闭

在 Socket.IO 1.0 中配置超时和传输

在 socket.io 中控制来自客户端的心跳超时