Flooding WebSocket

Flooding WebSocket

本文关键字:WebSocket Flooding      更新时间:2024-06-06

我是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. 客户端接收缓冲区将填满
  2. TCP流控制将启动,服务器将被告知停止在此套接字上发送更多数据包
  3. 然后,服务器将缓冲传出的数据包,直到流控制限制被删除
  4. 最终将达到服务器端缓冲区限制,底层TCP将拒绝套接字写入
  5. 这将从TCP发送返回一个错误
  6. 根据您为webSocket使用的服务器端库,您应该会在某个时刻从发送操作中得到错误

TCP是一个可靠的协议,所以它只会缓冲并稍后传输,直到缓冲区满为止。它本身不应该丢失数据包(除非连接断开),但当缓冲区满了时,它会给你一个错误,因为缓冲区满,它不能再发送了。


至于您尝试的客户端代码,您不能在Javascript中忙碌/等待很长时间。这会终止事件循环,并最终导致脚本引擎关闭。

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