一、什么是http協議
HTTP是一個應用層協議,無狀態的,端口號為80。主要的版本有1.0/1.1/2.0.
- HTTP/1.* 一次請求-響應,建立一個連接,用完關閉;
- HTTP/1.1 串行化單線程處理,可以同時在同一個tcp鏈接上發送多個請求,但是只有響應是有順序的,只有上一個請求完成后,下一個才能響應。一旦有任務處理超時等,后續任務只能被阻塞(線頭阻塞);
- HTTP/2 並行執行。某任務耗時嚴重,不會影響到任務正常執行
二、什么是websocket
Websocket是html5提出的一個協議規范,是為解決客戶端與服務端實時通信。本質上是一個基於tcp,先通過HTTP/HTTPS協議發起一條特殊的http請求進行握手后創建一個用於交換數據的TCP連接。
WebSocket優勢: 瀏覽器和服務器只需要要做一個握手的動作,在建立連接之后,雙方可以在任意時刻,相互推送信息。同時,服務器與客戶端之間交換的頭信息很小。
三、什么是長連接、短連接
- 短連接:
連接->傳輸數據->關閉連接
HTTP是無狀態的,瀏覽器和服務器每進行一次HTTP操作,就建立一次連接,但任務結束就中斷連接。
也可以這樣說:短連接是指SOCKET連接后發送后接收完數據后馬上斷開連接。
- 長連接、
連接->傳輸數據->保持連接 -> 傳輸數據-> 。。。 ->關閉連接。
長連接指建立SOCKET連接后不管是否使用都保持連接,但安全性較差。
四、http和websocket的長連接區別
HTTP1.1通過使用Connection:keep-alive進行長連接,HTTP 1.1默認進行持久連接。在一次 TCP 連接中可以完成多個 HTTP 請求,但是對每個請求仍然要單獨發 header,Keep-Alive不會永久保持連接,它有一個保持時間,可以在不同的服務器軟件(如Apache)中設定這個時間。這種長連接是一種“偽鏈接”
websocket的長連接,是一個真的全雙工。長連接第一次tcp鏈路建立之后,后續數據可以雙方都進行發送,不需要發送請求頭。
keep-alive雙方並沒有建立正真的連接會話,服務端可以在任何一次請求完成后關閉。WebSocket 它本身就規定了是正真的、雙工的長連接,兩邊都必須要維持住連接的狀態。
1. 短連接
三次握手,每次都需要授權等信息,一次request,一次response以后關閉連接
三次握手,當經過第一次授權后,發起一次request,回復一次response,保持連接keep-alive的時間,這期間內可以發起多次通信,時間到達后關閉連接,需要注意的是每次發起一次通信后,keep-alive的時間會重新計時;
http 1.0中:HTTP客戶端與服務器請求響應模式如下圖所示;短連接
三次握手,每次都需要授權等信息,一次request,一次response以后關閉連接
2 .長連接
HTTP 1.1規定了默認保持長連接(HTTP persistent connection ,也有翻譯為持久連接),數據傳輸完成了保持TCP連接不斷開(不發RST包、不四次握手),等待在同域名下繼續用這個通道傳輸數據;相反的就是短連接。開啟長連接使用就是header投中的keep-alive屬性
三次握手,當經過第一次授權后,發起一次request,回復一次response,保持連接keep-alive的時間,這期間內可以發起多次通信,時間到達后關閉連接,需要注意的是每次發起一次通信后,keep-alive的時間會重新計時;
說明:Keep-Alive功能使客戶端到服務器端的連接持續有效,當出現對服務器的后繼請求時,Keep-Alive功能避免了建立或者重新建立連接。
3.心跳、輪詢、長輪詢
3.1 心跳機制:
心跳機制的原理很簡單:客戶端每隔N秒向服務端發送一個心跳消息,服務端收到心跳消息后,回復同樣的心跳消息給客戶端。如果服務端或客戶端在M秒(M>N)內都沒有收到包括心跳消息在內的任何消息,即心跳超時,我們就認為目標TCP連接已經斷開了。
3.2 輪詢:
短輪詢:瀏覽器發起一個“詢問”請求,服務器無論有無新數據,都立即響應(有就返回新數據,沒有就返回一個表示’空’的自定義數據格式),一個HTTP連接結束。
3.3長輪詢:長輪詢的經典實現 —— Comet:基於 HTTP 長連接的“服務器推”技術
瀏覽器發起一個“詢問”請求,當沒有新數據時,服務器端並不立即響應,而是等待數據,當有新數據產生時,才向瀏覽器響應,一個HTTP連接結束。
3.3 補充: 當服務端沒有數據更新的時候,連接會保持一段時間周期知道數據或者狀態改變或者過期,依次減少無效的客戶端和服務端的交互
3.3 補充: 當服務端數據變更頻繁的話,這種機制和定時輪詢毫無區別
4.WebSocket模式客戶端與服務器請求響應模式如下圖:
一次握手:通信一次后記錄授權信息,服務器端可以主動多次發送消息
一次握手:通信一次后記錄授權信息,服務器端可以主動多次發送消息
