前言:
HTTP的長連接和短連接本質上是TCP的長連接和短連接。
HTTP屬於應用層協議,在傳輸層使用TCP協議,在網絡層使用IP協議。
IP協議主要解決網絡路由和尋址問題,TCP協議主要解決如何在IP層之上可靠地傳遞數據包,使得網絡上接收端收到發送端所發出的所有包,並且順序與發送順序一致。TCP協議是可靠的、面向連接的。
當客戶端瀏覽器訪問的某個HTML或其他類型的Web頁中包含有其他的Web資源(如JavaScript文件、圖像文件、CSS文件等),每遇到這樣一個Web資源,瀏覽器就會重新建立一個HTTP會話。
【例如獲取某一頁面的某一資源后還想要獲取同一頁面的其他資源時,但是此時TCP連接已經關閉,所以需要重新TCP連接,然后才可以請求和響應。】
而從HTTP/1.1起,默認使用長連接,用以保持連接特性。使用長連接的HTTP協議,會在響應頭加入這行代碼:
Connection:keep-alive
在使用長連接的情況下,當一個網頁打開完成后,客戶端和服務器之間用於傳輸HTTP數據的TCP連接不會關閉,客戶端再次訪問這個服務器時,會繼續使用這一條已經建立的連接。
Keep-Alive不會永久保持連接,它有一個保持時間,可以在不同的服務器軟件(如Apache)中設定這個時間。實現長連接需要客戶端和服務端都支持長連接。
原理:
HTTP協議既可以實現長連接,也可以實現短連接。
在HTTP/1.0中,默認使用的是短連接。也就是說,瀏覽器和服務器每進行一次HTTP操作,就建立一次連接,但任務結束就中斷連接。如果客戶端訪問的某個HTML或其他類型的web頁中包含有其他的web資源,如JavaScript文件、圖像文件、CSS文件等,當瀏覽器每遇到這樣一個web資源,就會建立一個HTTP會話。HTTP1.0需要在request中增加“Connection: keep-alive”,header才能夠支持長連接。
HTTP1.0 KeepAlive支持的數據交互流程如下:
1)Client發出request,其中該request的HTTP版本號為1.0。同時在request請求頭中包含一個header:“Connection: keep-alive”。【在HTTP/1.0的時候必須在請求頭上加上Connection: keep-alive這個字段,服務端才會知道這是一個長連接請求】
2)web sever收到request中的HTTP協議為1.0及“Connection: keep-alive”就認為是一個長連接請求,其將在response的header中也增加“Conection: keep-alive”。同時不會關閉已建立的TCP連接。
3)Client收到web server的response中包含“Connection: keep-alive”,就認為是一個長連接,不關閉TCP連接。並用該TCP連接再發送request。(跳轉到1))
但從HTTP/1.1起,默認使用長連接,用以保持連接特性。使用長連接的HTTP協議,會在請求頭和響應頭加入這行代碼。Connection: keep-alive。
在使用長連接的情況下,當一個網頁打開完成后,客戶端和服務器之間用於傳輸HTTP數據的TCP鏈接不會關閉,如果客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經建立的連接(HTTP長連接利用同一個TCP連接處理多個HTTP請求和響應)。
Keep-Alive不會永久保持連接,它有一個保持時間,可以在不同的服務器軟件(如Apache)中設定這個時間。實現長連接要客戶端和服務端都支持長連接。長連接中關閉連接通過Connection:closed頭部字段。如果請求或響應中的Connection被指定為closed,表示在當前請求或相應完成后將關閉TCP連接。TCP的keep-alive是檢查當前TCP連接是否活着;HTTP的Keep-Alive是要讓一個TCP連接活久點。
HTTP1.1 Keep-Alive支持的數據交互流程如下:
1)Client發出request,其中該request的HTTP版本號為1.1。
2)web server收到request中的協議為1.1就認為是一個長連接請求【請求頭不需要添加Connection: keep-alive,服務端就認為其請求是長連接】,其將在response的header中也增加“Connection: keep-alive”。同時不會關閉已建立的TCP連接。
3)Client收到 web server的response中包含“Connection:keep-alive”,就認為是一個長連接,不會關閉TCP請求,並用該TCP連接再發送request。(跳轉到 1))
HTTP協議的長連接和短連接,實質上是TCP協議的長連接和短連接。
HTTP長連接的優點:
1)通過開啟和關閉更少的TCP連接,節約CPU時間和內存。
2)通過減少TCP開啟和關閉引起的包的數目,降低網絡阻塞。
HTTP長連接的缺點:
服務器維護一個長連接會增加開銷。
HTTP短連接的優點:
服務器不用為每個客戶端連接分配內存來記憶大量狀態,也不用在客戶端失去連接時去清理內存,節省服務器端資源,以更高效地去處理業務。
HTTP短連接的缺點:
如果客戶請求頻繁,將在TCP的建立和關閉操作上浪費時間和帶寬。