天天看點

websocket簡單介紹(一)

對于websocket的了解,可能我和其他人的了解也是不一樣的,簡單的來說websocket如果分開那就是web和socket兩個,是以websocket便是是浏覽器和底層程序正常通信的重要途徑,我對websocket的了解是websocket本身是一種協定,浏覽器想要和程序進行直接通信那需要首先建立TCP連接配接,當TCP三四握手成功以後,浏覽器會主動向TCP服務端發起一起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
                 /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
      

如果細心的小夥伴會發現浏覽器發出的http協定消息,這個更新的HTTP請求頭中的字段順序是可以随便的。與普通HTTP請求相比多了一些字段。

  • Sec-WebSocket-Protocol:字段表示用戶端可以接受的子協定類型,也就是在Websocket協定上的應用層協定類型。上面可以看到用戶端支援chat和superchat兩個應用層協定,當伺服器接受到這個字段後要從中選出一個協定傳回給用戶端。
  • Upgrade:告訴伺服器這個HTTP連接配接是更新的Websocket連接配接。
  • Connection:告知伺服器目前請求連接配接是更新的。
  • Origin:該字段是用來防止用戶端浏覽器使用腳本進行未授權的跨源攻擊,這個字段在WebSocket協定中非常重要。伺服器要根據這個字段判斷是否接受用戶端的Socket連接配接。可以傳回一個HTTP錯誤狀态碼來拒絕連接配接。
  • Sec-WebSocket-Key:為了表示伺服器同意和用戶端進行Socket連接配接, 伺服器端需要使用用戶端發送的這個Key進行校驗 ,然後傳回一個校驗過的字元串給用戶端,用戶端驗證通過後才能正式建立Socket連接配接。伺服器驗證方法是: 首先進行 Key + 全局唯一标示符(GUID)“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”連接配接起來,然後将連接配接起來的字元串使用SHA-1哈希加密,再進行base64加密,将得到的字元串傳回給用戶端作為握手依據。其中GUID是一個對于不識别WebSocket的網絡端點不可能使用的字元串 。

發送請求的要求:

  • 請求的WebSocket URI必須要是定義的有效的URI。
  • 如果用戶端已經有一個WebSocket連接配接到遠端伺服器端,不論是否是同一個伺服器,用戶端必須要等待上一個連接配接關閉後才能發送新的連接配接請求,也就是同一用戶端一次隻能存在一個WebSocket連接配接。如果想同一個伺服器有多個連接配接,用戶端必須要串行化進行。如果用戶端檢測到多個到不同伺服器的連接配接,應該限制一個最大連接配接數,在web浏覽器中應該設定最多可以打開的标簽頁的數目。這樣可以防止到遠端伺服器的DDOS攻擊,但這是對到多個伺服器的連接配接,如果是到同一個伺服器連接配接,并沒有數目限制。
  • 如果使用了代理伺服器,那麼用戶端建立連接配接的時候需要告知代理伺服器向目标伺服器打開TCP連接配接。
  • 如果連接配接沒有打開,一定是某一方出現錯誤,此時用戶端必須要關閉再次連接配接的嘗試。
  • 連接配接建立後,握手必須要是一個有效的HTTP請求
  • 請求的方式必須是GET,HTTP協定的版本至少是1.1
  • Upgrade字段必須包含而且必須是"websocket",Connection字段必須内容必須是“Upgrade”
  • Sec-Websocket-Version必須,而且必須是13

對于浏覽器發出的請求握手操作關鍵字段則是 Sec-WebSocket-Key 字段,對于服務端需要對這個消息需要進行解析,解析出 Sec-WebSocket-Key字段,重新計算并與浏覽器重新握手。伺服器響應頭如下:

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

響應頭握手過程中是伺服器傳回的是否同意握手的依據。

  • 首行傳回的是HTTP/1.1協定版本和狀态碼101,表示變換協定(Switching Protocol)
  • Upgrade 和 Connection:這兩個字段是伺服器傳回的告知用戶端同意使用更新并使用websocket協定,用來完善HTTP更新響應
  • Sec-WebSocket-Accept:伺服器端将加密處理後的握手Key通過這個字段傳回給用戶端表示伺服器同意握手建立連接配接。
  • Sec-Websocket-Procotol:伺服器選擇的一個應用層協定。

繼續閱讀