WebSocket 筆記

WebSocket 筆記

  • WebSocket 握手
    客戶端請求
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
一段被 base64 編碼的內容,這段內容解碼后是 the sample nonce

服務器返回

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat

Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
將客戶端傳來的 Sec-WebSocket-Key 加上固定的 GUID "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" 之后用 SHA-1 (非對稱加密)進行哈希,在采用 base64 編碼。
這段 GUID 是固定的,所有的 websocket 都采用這個RFC 文檔中說用它是因為 "unlikely to be used by network endpoints that do not understand the WebSocket Protocol"。

  • 幀格式
      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-------+-+-------------+-------------------------------+
     |F|R|R|R| opcode|M| Payload len |    Extended payload length    |
     |I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
     |N|V|V|V|       |S|             |   (if payload len==126/127)   |
     | |1|2|3|       |K|             |                               |
     +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
     |     Extended payload length continued, if payload len == 127  |
     + - - - - - - - - - - - - - - - +-------------------------------+
     |                               |Masking-key, if MASK set to 1  |
     +-------------------------------+-------------------------------+
     | Masking-key (continued)       |          Payload Data         |
     +-------------------------------- - - - - - - - - - - - - - - - +
     :                     Payload Data continued ...                :
     + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
     |                     Payload Data continued ...                |
     +---------------------------------------------------------------+
  • 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 將來自客戶端的 Sec-WebSocket-Key 加上這個 GUID 然后 SHA-1 加密,之后進行 BASE64 編碼,將結果作為 “Sec-WebSocket-Accept” 返回客戶端。 GUID 一定是 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 這個數。
  • 一個單個幀的沒有進行掩碼的文本消息 0x81 0x05 0x48 0x65 0x6c 0x6c 0x6f(消息內容為 “Hello”)
    0x81 1000 0001 未分片的消息只有一幀,所以FIN是1, 因為沒有擴展RSV1 RSV2 RSV3 都是0 ,因為這是一個文本幀,所以opcode 是 1。
    0x05 0000 01001 沒有用掩碼,所以 第一位 mask 是0,所以是 0000, hello 是 占 5個字節,所以是1001
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容