一、ajax 輪詢實現原理:ajax 輪詢指客戶端每間隔一段時間向服務端發起請求,保持數據的同步。 優點:可實現基礎(指間隔時間較短)的數據更新。 缺點:這種方法也只是儘量的模擬即時傳輸,但並非真正意義上的即時通訊,很有可能出現客戶端請求時,服務端數據並未更新。或者服務端數據已更新,但客戶端未發起請 ...
一、ajax 輪詢
實現原理:ajax 輪詢指客戶端每間隔一段時間向服務端發起請求,保持數據的同步。
優點:可實現基礎(指間隔時間較短)的數據更新。
缺點:這種方法也只是儘量的模擬即時傳輸,但並非真正意義上的即時通訊,很有可能出現客戶端請求時,服務端數據並未更新。或者服務端數據已更新,但客戶端未發起請求。導致多次請求資源浪費,效率低下。
二、long poll 長輪詢
實現原理:
long poll 指的是客戶端發送請求之後,如果沒有數據返回,服務端會將請求掛起放入隊列(不斷開連接)處理其他請求,直到有數據返回給客戶端。然後客戶端再次發起請求,以此輪詢。在 HTTP1.0 中客戶端可以設置請求頭 Connection:keep-alive,服務端收到該請求頭之後知道這是一個長連接,在響應報文頭中也添加 Connection:keep-alive。客戶端收到之後表示長連接建立完成,可以繼續發送其他的請求。在 HTTP1.1 中預設使用了 Connection:keep-alive 長連接。
優點:減少客戶端的請求,降低無效的網路傳輸,保證每次請求都有數據返回,不會一直占用線程。
缺點:無法處理高併發,當客戶端請求量大,請求頻繁時對伺服器的處理能力要求較高。伺服器一直保持連接會消耗資源,需要同時維護多個線程,伺服器所能承載的 TCP 連接數是有上限的,這種輪詢很容易把連接數頂滿。每次通訊都需要客戶端發起,服務端不能主動推送。
三、iframe 長連接
實現原理:
在網頁上嵌入一個 iframe 標簽,該標簽的 src 屬性指向一個長連接請求。這樣服務端就可以源源不斷地給客戶端傳輸信息。保障信息實時更新。
優點:消息及時傳輸。
缺點:消耗伺服器資源。
四、WebSocket
實現原理:
Websocket 實現了客戶端與服務端的雙向通信,只需要連接一次,就可以相互傳輸數據,很適合實時通訊、數據實時更新等場景。
Websocket 協議與 HTTP 協議沒有關係,它是一個建立在 TCP 協議上的全新協議,為了相容 HTTP 握手規範,在握手階段依然使用 HTTP 協議,握手完成之後,數據通過 TCP 通道進行傳輸。
Websoket 數據傳輸是通過 frame 形式,一個消息可以分成幾個片段傳輸。這樣大數據可以分成一些小片段進行傳輸,不用考慮由於數據量大導致標誌位不夠的情況。也可以邊生成數據邊傳遞消息,提高傳輸效率。
與 HTTP 的區別:
以下是一個 WebSoket 協議的請求響應報文頭,與 HTTP 協議的區別是:
URL是以 ws: 開頭,如果是對應的 HTTPS,則以 wss: 開頭。WebSocket 使用 ws 或 wss 為統一資源標誌符,其中 wss 表示在 TLS 之上的 Websocket。
Status Code:101。該狀態碼表示協議切換。伺服器返回了 101 ,表示沒有釋放 TCP 連接。WebSoket 協議握手階段還是依賴於 HTTP 協議,到數據傳輸階段便切換協議。
Conection:upgrade,表示協議升級。在 HTTP 協議中,該請求頭有兩個值,一個是 close , HTTP/1.0 預設值,表示客戶端或服務端想要關閉連接。另一個是 keep-alive,HTTP/1.1 預設值,表示長連接。
以下頭部欄位是只有 WebSocket 協議才有的欄位。
請求頭:
Sec-WebSocket-Extension:表示客戶端協商的拓展特性。
Sec-WebSocket-Key:是一個 Base64 encode 的密文,由瀏覽器隨機生成,用來驗證是否是 WebSocket 協議。
Sec-WebSocket-Version:表示 WebSocket 協議版本。
響應頭:
Sec-WebSocket-Extension:表示服務端支持的拓展特性。
Sec-WebSocket-Accept:與客戶端的 Sec-WebSocket-Key 相對應,是經過伺服器確認,加密過後的 Sec-WebSocket-Key。
優點:
雙向通信。客戶端和服務端雙方都可以主動發起通訊。
沒有同源限制。客戶端可以與任意服務端通信,不存在跨域問題。
數據量輕。第一次連接時需要攜帶請求頭,後面數據通信都不需要帶請求頭,減少了請求頭的負荷。
傳輸效率高。因為只需要一次連接,所以數據傳輸效率高。
缺點:
長連接需要後端處理業務的代碼更穩定,推送消息相對複雜;
長連接受網路限制比較大,需要處理好重連。
相容性,WebSocket 只支持 IE10 及其以上版本。
伺服器長期維護長連接需要一定的成本,各個瀏覽器支持程度不一;
成熟的 HTTP 生態下有大量的組件可以復用,WebSocket 則沒有,遇到異常問題難以快速定位快速解決。