Node.js Socket.io来自一个客户端的多个连接

Node.js Socket.io来自一个客户端的多个连接,node.js,socket.io,Node.js,Socket.io,我有一个节点JS+Socket.io设置来处理聊天+投票网站。从第一天起,我就注意到,一个客户不时会建立多个连接 客户端的浏览器(用户代理)和网络(ip)每次都不同,一次大约有2-3k的连接。这种行为很难诊断/重现,因为它每两天发生一次 据我观察,这就像客户端的浏览器连接并立即断开连接(超时),所以它尝试重新连接。Socket.io不知道用户“超时”,因此io.engine.clientscont显示几分钟内连接数增加。这不会是一个问题,对性能没有太大影响,但它在统计数据中显示错误数据,这对我来

我有一个节点JS+Socket.io设置来处理聊天+投票网站。从第一天起,我就注意到,一个客户不时会建立多个连接

客户端的浏览器(用户代理)和网络(ip)每次都不同,一次大约有2-3k的连接。这种行为很难诊断/重现,因为它每两天发生一次

据我观察,这就像客户端的浏览器连接并立即断开连接(超时),所以它尝试重新连接。Socket.io不知道用户“超时”,因此
io.engine.clientscont
显示几分钟内连接数增加。这不会是一个问题,对性能没有太大影响,但它在统计数据中显示错误数据,这对我来说是不可接受的

如下面的屏幕截图所示,此行为会导致连接计数器出现“尖峰”:

我找不到关于这种行为的任何信息,但我没有什么想法:

  • 客户端位于防火墙后面-Node.JS侦听3000以上的端口,因此某些公共网络不允许连接。就是这样,但这样就不会有任何联系了
  • 客户端使用某种代理——但我会得到代理的IP地址,而不是客户端的IP地址
  • 可能的拒绝服务攻击-不。简单来说,不会造成任何损坏
  • 已安装插件/禁用功能-这是可能的,但我不知道是什么导致了这种行为
  • 有趣的是,这种行为是在客户端使用相对最新的浏览器时观察到的,所以这不像是有人在IE4上碰碰运气:)

    这对我来说真是个大麻烦。。如果有人看到这样的情况,我会非常感谢你的帮助

    编辑2016-02-07

    我抓到了2个有此问题的用户,并获得了他们的一些信息:

    HTTP headers:
    
    host: ***.***.**.**:3000
    connection: keep-alive
    referer: http://***************.pl/
    origin: http://***************.pl
    x-wap-profile: http://wap.samsungmobile.com/uaprof/GT-P7510.xml
    accept: text/xml, text/html, application/xhtml+xml, image/png, text/plain, */*;q=0.8
    accept-charset: utf-8, iso-8859-1, utf-16, *;q=0.7
    user-agent: Mozilla/5.0 (Linux; U; Android 3.2; pl-pl; GT-P7510 Build/HTJ85B) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13
    accept-encoding: gzip,deflate
    accept-language: pl-PL, en-US
    cookie: io=ejdnQT_TOXNpRc-GAJU8
    
    Socket info:
    
    time: Sun Feb 07 2016 17:13:05 GMT+0100 (CET)
    address: ***.**.**.**
    xdomain: true
    secure: false
    issued: 1454861585297
    url: /socket.io/?EIO=3&transport=polling&t=1454865217050-32520
    
    -----
    
    HTTP headers:
    
    host: ***.***.**.**:3002
    connection: keep-alive
    referer: http://***************.pl/
    origin: http://***************.pl
    accept: text/xml, text/html, application/xhtml+xml, image/png, text/plain, */*;q=0.8
    accept-charset: utf-8, iso-8859-1, utf-16, *;q=0.7
    user-agent: Mozilla/5.0 (Linux; U; Android 3.2; pl-pl; GT-P7300 Build/HTJ85B) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13
    accept-encoding: gzip,deflate
    accept-language: pl-PL, en-US
    cookie: io=lLFL2chztf7gZzh3AFtG
    
    Socket info:
    
    time: Sun Feb 07 2016 17:40:55 GMT+0100 (CET)
    address: **.***.*.**
    xdomain: true
    secure: false
    issued: 1454863255162
    url: /socket.io/?EIO=3&transport=polling&t=1454863408365-11598
    

    他们似乎都在使用三星的安卓3.2平板电脑。我用这个版本在Android AVD emulator上进行了测试,但没有结果。

    你确定这不仅仅是长轮询传输吗?我通过在客户端添加
    传输:['polling']
    并运行
    ab-n 100-c 10”进行了测试http://192.168.1.30:3000/socket.io/?EIO=3&transport=polling&t=1450545297036-0“
    。这实际上会创建100个新连接,这些连接在预定义的超时(大约60秒?)后断开。然而,所描述的行为是完全不同的。连接的堆叠速度似乎略高于丢弃速度。此外,对于轮询传输,应该仍然只有一个连接(正如在浏览器中使用
    transports:['polling']
    选项所观察到的),您曾经解决过这个问题吗?我也有类似的行为。150个客户,但2500个连接。不:(这个项目现在已经死了,我没有用任何类似的方法来解决这个问题anything@datayeah你找到答案了吗?我也有同样的答案。轮询请求只在
    t
    queryparam(酵母时间戳缓存破坏)上有所不同。