Websocket 被玩出了多种花样!

作者:微信小助手

发布时间:2022-07-05T11:52:22


一、首先我们要了解 Websocket 握手的原理

请求头特征

  • HTTP 必须是 1.1 GET 请求
  • HTTP Header 中 Connection 字段的值必须为 Upgrade
  • HTTP Header 中 Upgrade 字段必须为 websocket
  • Sec-WebSocket-Key 字段的值是采用 base64 编码的随机 16 字节字符串
  • Sec-WebSocket-Protocol 字段的值记录使用的子协议,比如 binary base64
  • Origin 表示请求来源

    响应头特征

    • 状态码是 101 表示 Switching Protocols
    • Upgrade / Connection / Sec-WebSocket-Protocol 和请求头一致
    • Sec-WebSocket-Accept 是通过请求头的 Sec-WebSocket-Key 生成

    二、短连接轮询、长连接、Websocket 横向对比

    1. 短连接轮询

    • 很耗费 TCP 连接
    • 而且 Header 重复发送
    • 且通过宏任务发起,受限于 Event Loop,无法保证及时性
    • 同时无效请求会很多

    2. 长连接

    • HTTP keep-alive 开启后虽然 TCP 可以复用,但是 Header 重复的问题并没有解决
    • 同时 HTTP keep-alive 还有一个有效期,有效期结束后服务端会发侦查帧探查 TCP 是否有效

    题外话:

    HTTP keep-alive 的作用是,告知服务端持久化当前的 TCP 连接,不要立即断开,以便后续的 HTTP 请求复用它,也就是我们所说的「长连接」

    HTTP 的 keep-alive 是为了让 TCP 活久一点,而 TCP