日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WebSocket协议探究(序章)

發布時間:2024/4/15 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WebSocket协议探究(序章) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一 WebSocket協議基于HTTP和TCP協議

  • 與往常一樣,進入WebSocket協議學習之前,先進行WebSocket協議抓包,來一個第一印象。
  • WebSocket能實現客戶端和服務器間雙向、基于消息的文本或二進制的數據傳輸。
    • HTTP握手機制用于協商連接參數
    • 二進制消息分幀機制用于支持低開銷的數據傳輸
  • WebSocket協議特點:
    • 連接協商和同源策略
    • 與既有 HTTP 基礎設施的互操作
    • 基于消息的通信和高效消息分幀
    • 子協議協商及可擴展能減少通信量

二 抓包分析

  • WebSocket客戶端(MQTTBox)
    • IP:192.168.1.10
    • port:2994
  • WebSocket服務器(Eclipse的MQTT服務器)
    • IP:198.41.30.241
    • port:80

1 TCP三次握手

192.168.1.10 198.41.30.241 TCP 2994 → 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=256 SACK_PERM=1 198.41.30.241 192.168.1.10 TCP 80 → 2994 [SYN, ACK] Seq=0 Ack=1 Win=14600 Len=0 MSS=1412 SACK_PERM=1 WS=64 192.168.1.10 198.41.30.241 TCP 2994 → 80 [ACK] Seq=1 Ack=1 Win=66304 Len=0

注:TCP講解了很多遍了,就簡單貼出來了。

2 HTTP協議交換

# 1.客戶端 -> 服務器 ,HTTP升級Webscoket請求 192.168.1.10 198.41.30.241 HTTP 310 GET /ws HTTP/1.1 Hypertext Transfer ProtocolGET /ws HTTP/1.1\r\n # Method url 協議版本Connection: Upgrade\r\n # 升級協議Upgrade: websocket\r\n # 升級為webscoketHost: iot.eclipse.org\r\n # 主機名Sec-WebSocket-Version: 13\r\n # websocket版本Sec-WebSocket-Key: MTMtMTU0NDE1NjY2MjM2NA==\r\n # 客戶端標識符Sec-WebSocket-Protocol: mqtt\r\n # 子協議Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits\r\n # 拓展屬性# TCP應答報文 198.41.30.241 192.168.1.10 TCP 60 80 → 2994 [ACK] Seq=1 Ack=257 Win=15680 Len=0# 2.服務器 -> 客戶端,協議升級應答 198.41.30.241 192.168.1.10 HTTP 213 HTTP/1.1 101 Switching Protocols Hypertext Transfer ProtocolHTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\n# base64(sha1(客戶端標識符+固定UUID))Sec-WebSocket-Accept: pC5iSVAHF4dkYCnA6rA0VDfEpuI=\r\nSec-WebSocket-Protocol: mqtt\r\n

3 數據傳輸

  • HTTP協議升級為WebSocket協議后,并不適用HTTP報文封裝WebSocket報文,而是直接基于TCP報文。
  • 報文的格式為二進制或字符。
  • 發送方需要設置Mask為True,并發送Masking-Key;Masking-Key會一直變化。(解析方式以后細說)
# 只截取MQTT中PINGREQ和PINGRESP報文# PINGREQ報文 192.168.1.10 198.41.30.241 WebSocket 62 WebSocket Binary [FIN] [MASKED] WebSocket1... .... = Fin: True # 是否為最終幀.000 .... = Reserved: 0x0 # 保留.... 0010 = Opcode: Binary (2) # 操作碼1... .... = Mask: True # 是否掩碼.000 0010 = Payload length: 2 # 負載長度Masking-Key: 8f 06 5d 55 # 掩碼的Key值(Mask為True時需要傳輸該字段)Masked payloadData: 4f06 -> (4f xor 8f == c0)(06 xor 06 ==00) == c000# PINGRESP報文 198.41.30.241 192.168.1.10 WebSocket 60 WebSocket Binary [FIN] WebSocket1... .... = Fin: True.000 .... = Reserved: 0x0.... 0010 = Opcode: Binary (2)0... .... = Mask: False.000 0010 = Payload length: 2PayloadData: d000

注:MQTT報文請參考MQTT協議探究(一)

參考:

  • 《圖解HTTP》
  • 《Web性能權威指南》

轉載于:https://www.cnblogs.com/linzhanfly/p/10083161.html

總結

以上是生活随笔為你收集整理的WebSocket协议探究(序章)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。