Tcp Http WebSocket全家桶解析

首先捋一下總的關係:Http協議和WebSocket協議都是創建在Tcp協議之上的應用層協議。瀏覽器

TCP協議

下面這張圖能夠表明Tcp的三次握手過程,以及它相較於UDP「可靠性保證」的由來。服務器

  1. 首先客戶端(Client)請求創建鏈接,因此SYN=1,因爲TCP規定SYN=1時不能攜帶數據,但要消耗一個序號,因此Client隨機取一個初始序號seq=(這裏沒有什麼響應,so跟ACK沒啥關係,認爲ACK=0)
  2. 服務器(Server端)收到請求後做出了響應,向Client發送確認,因此SYN=1, ACK=1,同時同理隨機取一個序號seq=y。目前Server端收到了x序號的數據,so它還告訴Client:但願下次給我發送包的序號是x+1,因此ack=x+1
  3. Client收到確認後還需再次發送確認,同時攜帶要發送給Server的數據:ACK=1, seq=x+1, ack= y+1;由於有 響應 動做,因此ACK=1(由於要攜帶發送的數據,因此這兒沒SYN什麼事)。由於(2)中Server 已經告訴了此次它想收到包的初始序列號是x+1,因此初始序號爲seq=x+1。又由於Client到 y爲止的全部數據都已正確收到了,準備接收序列號爲y+1的包,因此ack=y+1

這就是一個比較完整的三次握手過程網絡

这里写图片描述
爲何不能改爲兩次握手?
有人會困惑爲何要進行三次握手呢(兩次確認)?這主要是爲了防止已失效的請求鏈接報文突然又傳送到了,從而產生錯誤。
假定A向B發送一個鏈接請求,因爲一些緣由,致使A發出的鏈接請求在一個網絡節點逗留了比較多的時間。此時A會將此鏈接請求做爲無效處理 又從新向B發起了一次新的鏈接請求,B正常收到此鏈接請求後創建了鏈接,數據傳輸完成後釋放了鏈接。若是此時A發出的第一次請求又到達了B,B會覺得A又發起了一次鏈接請求,若是是兩次握手:此時鏈接就創建了,B會一直等待A發送數據,從而白白浪費B的資源。 若是是三次握手:因爲A沒有發起鏈接請求,也就不會理會B的鏈接響應,B沒有收到A的確認鏈接,就會關閉掉本次鏈接。spa

Http協議

HTTP協議使用的是請求-應答通訊模式,因此它也是無狀態協議,數據傳輸完成後就斷開鏈接,避免了資源的無效佔用。基於TCP/IP協議「儘可能」保證數據的送達。同時header採用明文傳輸:這是一把雙刃劍,在帶給開發者便利的同時,也會致使相應的風險。blog

WebSocket協議

WebSocket 是一種雙向通訊協議,在創建鏈接後,WebSocket 服務器和 Browser/Client Agent 都能主動的向對方發送或接收數據,就像 Socket 同樣。WebSocket 須要相似 TCP 的客戶端和服務器端經過握手鍊接,鏈接成功後才能相互通訊。資源

鏈接過程 —— 握手過程開發

  1. 瀏覽器、服務器創建TCP鏈接,三次握手。這是通訊的基礎,傳輸控制層,若失敗後續都不執行。
  2. TCP鏈接成功後,瀏覽器經過HTTP協議向服務器傳送WebSocket支持的版本號等信息。(開始前的HTTP握手)
  3. 服務器收到客戶端的握手請求後,一樣採用HTTP協議回饋數據。
  4. 當收到了鏈接成功的消息後,經過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

  1. WebSocket是雙向通訊協議,模擬Socket協議,能夠雙向發送或接受信息。HTTP是單向的。
  2. WebSocket是須要握手進行創建鏈接的。

相同點class

  1. 都是同樣基於TCP的,都是可靠性傳輸協議。
  2. 都是應用層協議。

 聯繫

WebSocket在創建握手時,數據是經過HTTP傳輸的。可是創建以後,在真正傳輸時候是不須要HTTP協議的。

相關文章
相關標籤/搜索