洪水WebSocket

时间:2015-02-25 16:07:12

标签: javascript websocket flooding

我是websocket的新手,我在Web应用程序上实现了websocket,服务器端是用java编写的,客户端是javascript。服务器通过websocket向客户端发送通知。 我想知道如果客户端能够以足够快的速度处理传入的消息而服务器发送它们的速度会发生什么。 例如,服务器可能每秒发送大约200条文本消息,客户端速度慢,每秒处理100条消息。 我相信浏览器会在收到消息之前对其进行排队,但不确定。我还知道如何检查此缓冲区大小及其限制,以及如果达到缓冲区限制会发生什么。 关于如何模拟这种情况的任何想法,我试过:

webSocket.onmessage = function (message) {
    var bool = true;
    var datenexexec = Date.now() + 1000;
    while(bool) {
        if(Date.now() > datenexexec){
            bool = false;
        }      
    }
}

但这会导致浏览器仅挂起并在以后崩溃。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:6)

为了比客户端读取数据更快地发送数据,这里最终会发生什么。

  1. 客户端接收缓冲区将填满
  2. TCP流量控制将启动,服务器将被告知停止在此套接字上发送更多数据包。
  3. 然后,服务器将缓冲传出的数据包,直到删除流控制限制
  4. 最终将命中服务器端缓冲区限制,底层TCP将拒绝套接字写入
  5. 这将从TCP发送中返回错误。
  6. 根据您用于webSocket的服务器端库,您应该在某个时刻从发送操作中收到错误。
  7. TCP是一种可靠的协议,因此它只会缓冲并稍后传输,直到缓冲区已满。它本身不应该丢失数据包(除非连接丢失),但是当缓冲区已满时,它会给你一个错误,它不能再发送,因为缓冲区已满。


    对于您尝试过的客户端代码,您无法在Javascript中忙碌/等待很长时间。这会杀死事件循环并最终导致脚本引擎崩溃。

    模拟这种情况的唯一方法是尝试实际发送比客户端可以处理的数据包更多的数据包。你可以编码"慢"客户端需要250ms才能在短忙/等待循环中处理每个数据包,并且快速"发送大量数据包的服务器,你应该可以模拟它。