目前的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協議的細節,HTTP實際上是創建在TCP之上的,因此當咱們在進行HTTP通訊時,client和server之間已經創建起了一個TCP鏈接,而任何TCP鏈接(從程序員角度來講,就是一個Berkeley socket)都是能夠用來雙向通訊的,那麼爲何不直接利用這個現成的TCP鏈接來實現client和server的雙向通訊呢? 框架
沒錯!這就是WebSocket所作的事情! socket
咱們創建WebSocket通訊的過程是這樣的: server
準確的說,應該是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