Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RealTime Web: WebSocket

RealTime Web: WebSocket

a simple description of WebSocket via Node.js

R.coffee

March 12, 2014
Tweet

Other Decks in Technology

Transcript

  1. HTTP Core of the web 在 B/S 的 web 架构模型中,

    每次打开一个网页,浏览器都 至少发起一次 HTTP 请求去 从指定网络位置获取资源。
  2. OMG! WebSocket! 直到这货诞生…… “ 将 TCP 的 Socket 与无状态的 HTTP

    协议共同使用, 从而使通信双方建立起一个保持在活动状态的连接通道, 并且通信属于‘ full duplex (全双工)’”。 ————from Wikipedia
  3. TCP or HTTP ? WebSocket 是基于 TCP 的独立的协议。 和 HTTP

    的唯一关联就是 : HTTP 服务器需要把 WebSocket Client 发出的握手动作升级为 “ Upgrade” 请求并进行解析。 WebSocket 也属于长连接
  4. Hand Shake 2 “Sec-WebSocket-Key” 字段 它是个经过 base64 编码的随机字符串,在握手过程中特重要: 当 Server

    接收到来自浏览器的“ upgrade” 请求时,便会将请求 中的“ Sec-WebSocket-Key” 字段提取出来,追加一个固定 字符串“ 258EAFA5-E914-47DA-95CA-C5AB0DC85B11” , 同时进行 SHA-1 加密,然后再次经过 base64 编码,生成一个新 的 KEY , 作为响应头中的“ Sec-WebSocket-Accept” 字段的内容返回 给浏览器:
  5. Hand Shake 3 服务器响应头 : HTTP/1.1 101 Switching Protocols Upgrade

    : websocket Connnection: Upgrade Sec-WebSocket-Accept: ******
  6. Frame WebSocket 传输的数据都是以 Frame (帧)的形式存在的, 就像 TCP/UDP 协议中的报文段 Segment WebSocket

    协议是基于 Frame 而非 Stream 的。 每个 Frame 都定义了严格的数据结构,因此所有的信息就在这个 Frame 载体中。
  7. Masking key Masking-key (掩码)如果存在,则一定是一个 32bit 的值。 如果消息是从客户端发送到服务器,那么 mask 一定是 1

    。 如果是从服务器发送到客户端, mask 为 0 。 作用:当 mask 字段的值为 1 时, payload-data 字段的数据需要 经这个掩码进行解密。
  8. Decode 在一个 WS 通信中,当消息到 WS 达服务器后,服务器程序就开始以 byte 为单位逐步读取这个帧。当读取到 payload-data 时,首先将数

    据按 byte 依次与 Masking-key 中的 4 个 byte 按照如下算法做异或运 算: for (i = 0; i < len; i++) { j = i % 4; data[offset + i] ^= masking_key[j]; } // data : Payload-data, len : Payload 字节数 ; // masking_key : 4byte 的 mask 掩码组成的数组 // offset :跳过 Payload-data 之前的字节数
  9. Future 尽管 WebSocket 解决了 web 页面全双工通信的问题,但是一个真 正的 RealTime 互联网远不止于此。 Google

    在 2010 年获得了 WebRTC 技术,这是一个允许浏览器之 间进行 P2P 通信的技术集合,利用 WebRTC 可以构建实时音频 视频等多媒体信息通信的应用程序。 不过这并不代表 WebSocket 就没有价值了。
  10. after 这个 Slide 已上传至 SpeakerDeck : https://speakerdeck.com/abbshr/realtime-web-websocket-and-node demo 代码在这个 Repo

    中: https://github.com/abbshr/websocket_talk 涉及到的解码和编码代码可在 Github Gist 上找到: https://gist.github.com/abbshr/7511731 https://gist.github.com/abbshr/7511762 详细学习 WebSocket ,移歩 http://abbshr.github.io/2013/11/05/new46.html 和 http://abbshr.github.io/2013/11/10/new47.html 了解 Node 底层实现(尚未完工,正在填坑),移歩 https://github.com/abbshr/abbshr.github.io/issues