理解WebSocket

WebSocket的動機是什麼?

目前的Web通訊使用的是HTTP協議,HTTP協議是基於TCP協議的應用層協議,HTTP協議的工做模式是request/response模式。在一次通訊中,必須首先由client向server發起TCP鏈接,而後server接受該TCP鏈接請求,在TCP鏈接創建以後,首先由client發起HTTP request,而後server再發出HTTP response。 程序員

 

所以,在這種標準HTTP工做模式的約定下,server是不被容許發起一個TCP請求的,所以也就不被容許在未收到HTTP request的狀況下,發送一個HTTP response給client。在這種約束下,爲了可以不斷的隨時從server發送內容到client端,就必須保證server端隨時都有一個待響應的request(注意這與persistent connection不是同一個概念,persistent connection是用來複用HTTP之下的TCP鏈接)。 web

 

如何在現有的HTTP框架內,來得到這麼一個時刻存在於server端的待響應請求呢?這就是COMET技術,具體說有2種方式: websocket

  • 多個HTTP請求不斷接力(long polling)
  • 單個HTTP請求不終止 (HTTP streaming)

 

可是,若是咱們回過頭來仔細想一下HTTP協議的細節,HTTP實際上是創建在TCP之上的,因此當咱們在進行HTTP通訊時,client和server之間已經創建起了一個TCP鏈接,而任何TCP鏈接(從程序員角度來講,就是一個Berkeley socket)都是能夠用來雙向通訊的,那麼爲何不直接利用這個現成的TCP鏈接來實現client和server的雙向通訊呢? 框架

 

沒錯!這就是WebSocket所作的事情! socket

WebSocket鏈接如何創建

咱們創建WebSocket通訊的過程是這樣的: server

  • Step 1 創建TCP鏈接(這一步是一切的基礎,和HTTP同樣)
  • Step 2 經過TCP鏈接,發送HTTP Get 請求,其中包含關鍵的Upgrade: websocket header。
  • Step 3 Server收到HTTP請求後,會把Step 1的TCP鏈接的用戶層協議從HTTP轉變爲WebSocket。至此,HTTP部分就退出舞臺了,WebSocket開始接管一切。

 

 

如何理解WebSocket能夠和HTTP共享80端口?

準確的說,應該是WebSocket能夠分享HTTP正在使用的端口,不必定是80。緣由是WebSocket的initial handshake是一個valid HTTP request,因此除非咱們本身重寫一套解析HTTP handshake的邏輯,不然必須發送到現有的HTTP端口來解析。而僅僅發送到HTTP端口仍是不夠的,咱們還須要在server實現中添加關於WebSocket的邏輯。而後,server根據HTTP協議解析了initial handshake request以後,由server來進行協議切換,把HTTP換成WebSocket。 ip

 

因此,這裏能夠看出,HTTP協議本身並不須要瞭解WebSocket什麼,也不須要知道它什麼時候應該讓位於WebSocket協議,HTTP協議只是規定了HTTP的通訊格式(好比WebSocket所使用的custom header),是server根據HTTP協議規定的格式,發覺了WebSocket的鏈接請求,而後再進行協議切換,server是協議切換邏輯的載體和執行者,當咱們要實現一個WebSocket server,就必須在server代碼中加入如下邏輯: get

  • 識別HTTP格式的WebSocket 請求
  • 協議切換
  • WebSocket的協議模塊

 

 

參考

相關文章
相關標籤/搜索