首先捋一下總的關係:Http協議和WebSocket協議都是創建在Tcp協議之上的應用層協議。瀏覽器
下面這張圖能夠表明Tcp的三次握手過程,以及它相較於UDP「可靠性保證」的由來。服務器
這就是一個比較完整的三次握手過程網絡
爲何不能改爲兩次握手?
有人會困惑爲何要進行三次握手呢(兩次確認)?這主要是爲了防止已失效的請求鏈接報文突然又傳送到了,從而產生錯誤。
假定A向B發送一個鏈接請求,因爲一些緣由,致使A發出的鏈接請求在一個網絡節點逗留了比較多的時間。此時A會將此鏈接請求做爲無效處理 又從新向B發起了一次新的鏈接請求,B正常收到此鏈接請求後創建了鏈接,數據傳輸完成後釋放了鏈接。若是此時A發出的第一次請求又到達了B,B會覺得A又發起了一次鏈接請求,若是是兩次握手:此時鏈接就創建了,B會一直等待A發送數據,從而白白浪費B的資源。 若是是三次握手:因爲A沒有發起鏈接請求,也就不會理會B的鏈接響應,B沒有收到A的確認鏈接,就會關閉掉本次鏈接。spa
HTTP協議使用的是請求-應答通訊模式,因此它也是無狀態協議,數據傳輸完成後就斷開鏈接,避免了資源的無效佔用。基於TCP/IP協議「儘可能」保證數據的送達。同時header採用明文傳輸:這是一把雙刃劍,在帶給開發者便利的同時,也會致使相應的風險。blog
WebSocket 是一種雙向通訊協議,在創建鏈接後,WebSocket 服務器和 Browser/Client Agent 都能主動的向對方發送或接收數據,就像 Socket 同樣。WebSocket 須要相似 TCP 的客戶端和服務器端經過握手鍊接,鏈接成功後才能相互通訊。資源
鏈接過程 —— 握手過程開發
HTTP 客戶端與服務器的交互
WebSocket 請求響應客戶端服務器交互
能夠看到,相較於傳統Http的請求應答模式,WebSocket 是相似 Socket 的 TCP 長鏈接的通信模式,一旦 WebSocket 鏈接創建後,後續數據都以幀序列的形式傳輸。在客戶端斷開 WebSocket 鏈接或 Server 端斷掉鏈接前,不須要客戶端和服務端從新發起鏈接請求。WebSocket能更好的節省服務器資源和帶寬並達到實時通信,它創建在 TCP 之上,同 HTTP 同樣經過 TCP 來傳輸數據。rem
WebSocket和 HTTP 最大不一樣是:
HTTP協議是非持久化的,單向的網絡協議,在創建鏈接後只容許瀏覽器向服務器發出請求後,服務器才能返回相應的數據。這樣的方法最明顯的缺點就是須要不斷的發送請求,並且一般HTTP request的Header是很是長的,爲了傳輸一個很小的數據 須要付出巨大的代價,是很不合算的,佔用了不少的帶寬。會致使過多沒必要要的請求,浪費流量和服務器資源,每一次請求、應答,都浪費了必定流量在相同的頭部信息上。
然而WebSocket的出現能夠彌補這一缺點。在WebSocket中,只須要服務器和瀏覽器經過HTTP協議進行一個握手的動做,而後單獨創建一條TCP的通訊通道進行數據的傳送。
不一樣點it
相同點class
聯繫
WebSocket在創建握手時,數據是經過HTTP傳輸的。可是創建以後,在真正傳輸時候是不須要HTTP協議的。