WebSocket協定是一種雙向通信協定,它建立在TCP之上,同http一樣通過TCP來傳輸資料,但是它和http最大的不同有兩點:1.WebSocket是一種雙向通信協定,在建立連接配接後,WebSocket伺服器和Browser/UA都能主動的向對方發送或接收資料,就像Socket一樣,不同的是WebSocket是一種建立在Web基礎上的一種簡單模拟Socket的協定;2.WebSocket需要通過握手連接配接,類似于TCP它也需要用戶端和伺服器端進行握手連接配接,連接配接成功後才能互相通信。
下面是一個簡單的建立握手的時序圖:

這裡簡單說明一下WebSocket握手的過程。
當Web應用程式調用new WebSocket(url)接口時,Browser就開始了與位址為url的WebServer建立握手連接配接的過程。
1. Browser與WebSocket伺服器通過TCP三向交握建立連接配接,如果這個建立連接配接失敗,那麼後面的過程就不會執行,Web應用程式将收到錯誤消息通知。
2. 在TCP建立連接配接成功後,Browser/UA通過http協定傳送WebSocket支援的版本号,協定的字版本号,原始位址,主機位址等等一些列字段給伺服器端。
例如:
[html] view plain copy
- 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
3. WebSocket伺服器收到Browser/UA發送來的握手請求後,如果資料包資料和格式正确,用戶端和伺服器端的協定版本号比對等等,就接受本次握手連接配接,并給出相應的資料回複,同樣回複的資料包也是采用http協定傳輸。
[html] view plain copy
- HTTP/1.1 101 Switching Protocols
- Upgrade: websocket
- Connection: Upgrade
- Sec-WebSocket-Accept:s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
- Sec-WebSocket-Protocol: chat
4. Browser收到伺服器回複的資料包後,如果資料包内容、格式都沒有問題的話,就表示本次連接配接成功,觸發onopen消息,此時Web開發者就可以在此時通過send接口想伺服器發送資料。否則,握手連接配接失敗,Web應用程式會收到onerror消息,并且能知道連接配接失敗的原因。