【问题标题】:WebSocket messages get queued when client disconnected客户端断开连接时,WebSocket 消息排队
【发布时间】:2013-07-29 21:22:00
【问题描述】:

我们有一个使用 tornado 编写的服务器,它通过 websockets 向客户端发送异步消息。在本例中,是在 Mac 上的 Chrome 中运行的 javascript 应用程序。当客户端被强制断开连接时,在这种情况下,通过让客户端休眠,服务器仍然认为它正在向客户端发送消息。此外,当客户端从睡眠中醒来时,消息会以突发方式传递。

这些消息排队/缓冲的机制是什么?谁是负责的人?为什么他们仍然交付?谁在重新连接套接字?我的直觉是,即使 websocket 不像 HTTP 那样请求/响应,它们仍然应该需要 ACK 数据包,因为它们是基于 TCP 构建的。这样做是为了使协议在移动时代的临时下降中更加健壮吗?

【问题讨论】:

    标签: python websocket tornado


    【解决方案1】:

    浏览器可以在单独的线程中处理 websocket 客户端消息,该线程不会被睡眠阻塞。

    即使您的自定义应用程序的某个线程未处于活动状态,当您强制它进入睡眠状态(如 sleep(100))时,在这种情况下 TCP 连接也不会关闭。套接字句柄仍然由操作系统内核管理,并且 TCP 服务器仍然发送消息,直到它到达 TCP 客户端的接收窗口溢出。即使在此之后,服务器端的应用程序仍然可以成功提交新消息,这些消息在服务器端的 TCP 级别缓冲,直到 TCP 传出缓冲区溢出。当传出缓冲区已满时,应用程序应在发送请求时收到错误代码,例如“没有更多空间”。我自己没试过,但它应该是这样的。

    尝试关闭客户端(终止进程),你会看到完全不同的画面——服务器会注意到断开连接。

    对于高度可靠的场景,断开连接和溢出这两种情况都很难在服务器端处理。断开连接情况可以转换为溢出情况(当客户端重新连接时,websocket 服务器可以将消息缓冲到用户空间的某个限制)。但是,没有简单的方法来可靠地处理传输缓冲区限制的溢出。我只看到一种解决方案 - 将溢出错误传播回事件的发起者,这引发了由于溢出而被丢弃的消息。

    【讨论】:

    • 很有趣,我同意如果由于应用程序休眠而导致我没有在客户端处理消息,这可能会发生。但是,整个客户端计算机都在休眠。据我所知,网络适配器已断电,并且在接收数据包时没有发送任何 ACK。
    • 哦..这是另一种睡眠...在这种情况下,我会使用wireshark或类似工具跟踪数据包序列以了解图片...可以是任何东西...
    猜你喜欢
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2015-05-30
    相关资源
    最近更新 更多