今天來說一下WebSocket的原理,能讓你更深刻的去了解WebSocket,深知其原理,才能更好的去使用它。web
WebSocket是HTML5出的協議,也就是說HTTP協議沒有變化,或者說不要緊,但HTTP是不支持持久鏈接的(長鏈接,循環鏈接的不算)。瀏覽器
首先HTTP有 1.1 和 1.0 之說,也就是所謂的 keep-alive ,把多個HTTP請求合併爲一個,可是 Websocket 實際上是一個新協議,跟HTTP協議基本沒有關係,只是爲了兼容現有瀏覽器的握手規範而已,也就是說它是HTTP協議上的一種補充。有交集,可是並非所有。服務器
另外Html5是指的一系列新的API,或者說新規範,新技術。Http協議自己只有1.0和1.1,並且跟Html自己沒有直接關係。通俗來講,你能夠用HTTP協議傳輸非Html數據,就是這樣。再簡單來講,層級不同。websocket
WebSocket的協議是持久化的,而HTTP是非持久化的協議。socket
首先咱們來看個典型的 Websocket 握手加密
GET /chat HTTP/1.1code
Host: server.example.comserver
Upgrade: websocket開發
Connection: Upgrade字符串
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
這段相似HTTP協議的握手請求中,多了幾個東西。我會順便講解下做用。
Upgrade: websocket
Connection: Upgrade
這個就是Websocket的核心了,告訴 Apache 、 Nginx 等服務器:注意啦,我發起的是Websocket協議,快點幫我找到對應的助理處理。
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
首先, Sec-WebSocket-Key 是一個 Base64 encode 的值,這個是瀏覽器隨機生成的,告訴服務器:驗證是否是真的是Websocke t助理。
而後, Sec_WebSocket-Protocol 是一個用戶定義的字符串,用來區分同URL下,不一樣的服務所須要的協議。
最後, Sec-WebSocket-Version 是告訴服務器所使用的 Websocket Draft (協議版本)。
而後服務器會返回下列東西,表示已經接受到請求, 成功創建Websocket啦!
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept:HSmrc0sMlYUkAGmm5OPpG2HaGWk= Sec-WebSocket-Protocol: chat
這裏開始就是HTTP最後負責的區域了,告訴客戶端已經成功切換協議
Upgrade: websocket
Connection: Upgrade
依然是固定的,告訴客戶端即將升級的是 Websocket 協議,而不是mozillasocket,lurnarsocket或者shitsocket。
而後, Sec-WebSocket-Accept 這個則是通過服務器確認,而且加密事後的 Sec-WebSocket-Key 。 服務器:返回ID CARD來證實。
後面的, Sec-WebSocket-Protocol 則是表示最終使用的協議。
至此,HTTP已經完成它全部工做了,接下來就是徹底按照Websocket協議進行了。具體的協議就不在這闡述了。
關注GoEasy WebSocket 簡單開發不迷路。