TCP/IP是個協議組,可分爲三個層次:網絡層、傳輸層和應用層。html
在網絡層有IP協議、ICMP協議、ARP協議、RARP協議和BOOTP協議。前端
在傳輸層中有TCP協議與UDP協議。web
在應用層有:TCP包括FTP、HTTP、TELNET、SMTP等協議;UDP包括DNS、TFTP等協議。瀏覽器
基於http協議的長鏈接減小了請求,減小了創建鏈接的時間,可是每次交互都是由客戶端發起的,客戶端發送消息,服務端才能返回客戶端消息。由於客戶端也不知道服務端何時會把結果準備好,因此客戶端的不少請求是多餘的,僅是維持一個心跳,浪費了帶寬。安全
發送 http 請求後服務端若是沒有返回則鏈接是一直連着的,等服務端有東西要「推送」給瀏覽器時,至關於給以前發送的這個 http 請求回了一個 http 響應。而後這個保持的時間比較長的 http 鏈接就斷了。而後瀏覽器再次發送一個 http 請求,服務器端再 hold 住不返回,等待有東西須要「推送」給瀏覽器時,再給這個 http 請求一個響應,而後斷開鏈接。循環往復。一旦瀏覽器不給服務器發送 http 請求,那麼服務器是不能主動給瀏覽器推送消息的,由於根本沒有連着的鏈接給你推。服務器
WebSocket 則不一樣,它握手後創建的鏈接是不會斷的(除了意外狀況和程序主動掐斷)。不須要瀏覽器在每次收到服務器推送的消息後再發起請求。並且服務器端能夠隨時給瀏覽器推送消息,不須要等瀏覽器發 http 請求,由於 WebSocket 的鏈接一直在沒斷。websocket
(客戶端和服務端均可能發生):率先發生主動關閉的一方所在的操做系統的socket端口和句柄被用盡(TIME-WAIT階段),系統沒法再發起新的鏈接,解決方案是能夠採用長鏈接(或者把TIME-WAIT的時間設置的短一點,也能夠擴大端口範圍)網絡
輪詢 :客戶端以必定的時間間隔向服務端發出請求,以頻繁請求的方式來保持客戶端和服務器端的同步。併發
缺點:當客戶端以固定頻率向 服務器發起請求的時候,服務器端的數據可能並無更新,服務端在沒有數據更新的時候也要返回數據,這樣會帶來不少無謂的網絡傳輸,因此這是一種很是低效的實時方案。socket
長輪詢:長輪詢是對定時輪詢的改進和提升,目地是爲了下降無效的網絡傳輸。當前端向後臺發請求,後臺數據若是尚未更新則不返回,直到後臺數據更新了再返回給前端,前端收到後臺返回的數據後才發下一次請求。在無消息的狀況下不會頻繁的請求。可是請求在後臺一直懸掛,鏈接長時間保持,浪費資源。
這兩種模式有一個共同的缺點,就是除了真正的數據部分外,服務器和客戶端還要大量交換 HTTP header,信息交換效率很低。(WebSocket就能很好的解決這個問題,不管是在性能仍是數據傳輸量的大小方面)
流 :技術方案一般就是在客戶端的頁面使用一個隱藏的窗口向服務端發出一個長鏈接的請求。服務器端接到這個請求後做出迴應並不斷更新鏈接狀態以保證客戶端和服務 器端的鏈接不過時。經過這種機制能夠將服務器端的信息源源不斷地推向客戶端。
缺點:這種機制在用戶體驗上有一點問題,須要針對不一樣的瀏覽器設計不一樣的方案來改進 用戶體驗,同時這種機制在併發比較大的狀況下,對服務器端的資源是一個極大的考驗。
HTML5開始提供的一種瀏覽器與服務器進行全雙工通信的網絡技術,屬於應用層協議。它基於TCP傳輸協議,並複用HTTP的握手通道。
WebSocket複用了HTTP的握手通道。具體指的是,客戶端經過HTTP請求與WebSocket服務端協商升級協議。協議升級完成後,後續的數據交換則遵守WebSocket的協議。
步驟:
首先,客戶端發起協議升級請求。能夠看到,採用的是標準的HTTP報文格式,且只支持GET
方法。
GET / HTTP/1.1 Host: localhost:8080 Origin: http://127.0.0.1:3000 Connection: Upgrade //表示要升級協議 Upgrade: websocket //表示要升級到websockect Sec-WebSocket-Version: 13 Sec-WebSocket-Key: w4v7O6xFTi36lq3RNcgctw==
服務端返回內容以下,狀態代碼101
表示協議切換。
HTTP/1.1 101 Switching Protocols Connection:Upgrade Upgrade: websocket Sec-WebSocket-Accept: Oy4NRAQ13jhfONC7bP8dTKb4PTU=
主要做用在於提供基礎的防禦,減小惡意鏈接、意外鏈接。
Sec-WebSocket-Key/Sec-WebSocket-Accept 的換算,只能帶來基本的保障,但鏈接是否安全、數據是否安全、客戶端/服務端是否合法的 ws客戶端、ws服務端,其實並無實際性的保證。
參考: