websocket ,ping pong heardbeat心跳机制

浏览器限制

经过测试,每个浏览器能支持的最大连接数是不同的

  1. 所有连接,连接到同一个域名
  • chrome(46)整个浏览器最多支持256个连接,再新建连接会失败‘ERR_INSUFFICIENT_RESOURCES’
  • ie11 每个tab最多支持6个连接

心跳

websocket规范定义了心跳机制,一方可以通过发送ping(opcode 0x9)消息给另一方,另一方收到ping后应该尽可能快的返回pong(0xA)。

服务端心跳,以java为例

目前的话,浏览器中没有相关api发送ping给服务器,只能由服务器发ping给浏览器

下面是java中的写法,本文采用的是注解方式的websocket写法

1
2
3
4
@ServerEndpoint("/websocket")
public class EchoAnnotation {
// some code
}

  1. 服务发送ping

    1
    2
    3
    4
    byte[] bs = new byte[1];
    bs[0]='i';
    ByteBuffer bb = ByteBuffer.wrap(bs );
    session.getBasicRemote().sendPing(bb);
  2. 浏览器会自动返回pong消息,并且会主动触发服务器的onPong方法

    1
    2
    3
    4
    @OnMessage
    public void echoPongMessage(Session session,PongMessage pm) {
    System.out.println("收到浏览器的pong " + pm.getApplicationData());
    }

浏览器心跳

虽然浏览器环境中的js没有websocket ping pong的api,但是通过监听网络的情况下,我发现浏览器是自带了心跳机制的,我对chrome46 和 ie11进行了测试,发现心跳是不同的,说明浏览器心跳并不是标准规范,而是浏览器厂商自己设计的

  1. ie11
    ie11 的心跳机制是标准的pong消息,能够被服务端的onPong监听函数捕获,心跳间隔是30秒
    websocket-heartbeat-ie11

  2. chrome46
    chrome46 的心跳是tcp心跳,心跳间隔是45秒
    websocet-heartbeat-chrome46


参考文档

https://tools.ietf.org/html/rfc6455#section-5.5.2