天天看點

HTTP的長連接配接和短連接配接詳解(HTTP 請求頭中的Connection字段) || HTTP響應頭中的connection字段作用詳解

HTTP的長連接配接和短連接配接詳解(HTTP 請求頭中的Connection字段)

前言:

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的建立和關閉操作上浪費時間和帶寬。

HTTP響應頭中的connection字段作用詳解

前言

有的網站會在伺服器運作一段時間後down掉,有不少緣由可能形成這種現象:好比tomcat堆和非堆記憶體設定不足,程式沒能釋放記憶體空間形成記憶體溢出,或者某些程序一直運作沒能釋放,形成cup資源大量消耗。但除了程式自己的緣由,還有多是客服端通路形成的(固然這個用戶端也包含如蜘蛛軟體等搜尋引擎),若是伺服器和用戶端建立的是長連接配接(能夠用"netstat -a"指令檢視網絡通路資訊),這就須要對http響應頭的connection作必定的設定。

解釋

①在http1.1中request headers和reponse headers中都有可能出現一個connection頭字段,此字段的含義是當用戶端和服務端通訊時對于長連接配接如何進行處理。

②在http1.1中,用戶端和服務端都是預設對方支援長連接配接的; 若是用戶端使用http1.1協定,但又不但願使用長連接配接,則須要在請求頭中指明connection的值為close;若是服務端也不想支援長連接配接,則在響應頭中也須要明确說明connection的值為close。

③不論請求頭還是響應頭中包含了值為close的connection,都代表目前正在使用的tcp連接配接在請求處理完畢後會被斷掉。之後用戶端再進行新的請求時就必須建立新的tcp連接配接了。

如何在程式中設定

繼續閱讀