2013-07-29 134 views
0

我们有一个服务器,使用龙卷风写,它比的WebSockets发送异步消息给客户端。在这种情况下,Mac上的Chrome中运行的JavaScript应用程序。当客户端强制挂断,在这种情况下,通过将客户睡觉,服务器仍然认为它是将消息发送到客户端。另外,当客户从睡眠中唤醒时,消息会突然传送。WebSocket的消息能排队

这些消息排队/缓冲的机制是什么?谁是负责的人?他们为什么仍然交付?谁正在重新连接套接字?我的直觉是,尽管websockets不像HTTP这样的请求/响应,但它们仍然需要ACK数据包,因为它们是建立在TCP上的。这是否是为了使协议在移动时代的临时丢失更有力?

回答

0

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

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

尝试关闭客户端(终止进程),您将看到完全不同的图片 - 服务器将通知断开连接。

这两种情况下,断开和溢出,都很难在服务器端处理高可靠性场景。断开的情况下可以被转化成溢出的情况下(当客户端被重新连接的WebSocket服务器可以缓冲消息到用户空间中的一些限制)。但是,没有简单的方法来可靠地处理发送缓冲区限制的溢出。我只看到一个解决方案 - 传播溢出错误回到事件,这引起了该消息,已因溢出丢弃的鼻祖。

+0

有趣的是,如果我没有在应用程序休眠时处理客户端上的消息,我可能会同意这种情况。但是,整个客户端计算机正在睡眠。据我所知,网络适配器断电,收到数据包时不会发送ACK。 –

+0

喔..这是另一种睡眠......在这种情况下,我将跟踪使用Wireshark或类似工具包的序列了解图片...这可能是什么... – Andrew