【问题标题】:How does a websocket know the server was taken down?websocket如何知道服务器被关闭了?
【发布时间】:2017-12-07 16:52:11
【问题描述】:

我在玩 websocket(使用 Sails.js 及其基于 Socket.io 的内置套接字)。

我注意到 Chrome 每 25 秒接收两帧。我认为这是某种轮询,以告知连接仍处于打开状态。

然后,我取消了服务器,Chrome 立即收到通知。

另外,我使用kill 命令强制关闭了 Node 进程,仍然通知 Chrome,这意味着在关闭服务器之前不是 Node 发送信号。

这是怎么发生的?

【问题讨论】:

  • 当对等进程退出时,对等操作系统使用 FIN 关闭连接或使用 RST 重置连接,这反过来导致流结束或本地套接字上的“连接重置” .

标签: http networking browser tcp websocket


【解决方案1】:

普通的 TCP 套接字连接会这样做,所以如果 websockets 没有,那就太令人惊讶了。

当服务器进程死亡/退出/被杀死时,服务器内核负责清理。这包括释放内存、关闭文件和关闭套接字。干净利落地关闭 TCP 套接字需要发送消息告诉对等方。

有趣的是,在某些带有用户空间 winsock 的旧版本的 Windows 上,如果服务器进程崩溃,则不会发生这种情况。在所有具有兼容 TCP 支持的操作系统上,除非内核本身挂起、机器断电或网络中断,否则应该保证它。

【讨论】:

  • 彻底关闭 TCP 套接字需要向对等方发送 FIN 消息。 RST 是一个中止关闭。
  • 很好,所以如果互联网连接突然与服务器完全断开(没有时间告诉客户端),客户端将无法立即判断连接中断?
  • @EJP 是的,我故意避免提及 FINRST,因为感觉比 OP 想要的更多细节,一旦你知道发生了什么,查找细节是微不足道的。
  • @FeloVilches 是的,如果你只是从服务器上拔下网线,客户端不会发现它已经消失,直到它尝试发送一些东西(例如,一个轮询请求)和 TCP 层等到超时,然后重试几次......客户端操作系统可能需要一段时间才能确定连接肯定是死的并告诉客户端进程。
  • @EJP ,没关系,我不介意你持有你的意见。我确实要求你尊重我拥有不同的权利。我认为在我引用整个 RFC 时声称“您引用的部分没有说任何这样的事情”是不友好的。还考虑了诸如解释half-open connections 的部分和我引用的有关connection resets 的段落。 你认为我误解了没关系,声称我是文盲没关系。
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-23
相关资源
最近更新 更多