HTTP 的 Keep-Alive模式

一、Keep-Alive模式

  1、  HTTP協議採用“請求-應答”模式,當使用普通模式,即非KeepAlive模式時,每個請求/應答客戶和服務器都要新建一個連接,完成之後立即斷開連接(HTTP協議爲無連接的協議);當使用Keep-Alive模式(又稱持久連接、連接重用)時,Keep-Alive功能使客戶端到服務器端的連接持續有效,當出現對服務器的後繼請求時,Keep-Alive功能避免了建立或者重新建立連接,即在一次TCP連接中可以持續發送多份數據而不會斷開連接。

2、 優缺點:

   通過使用keep-alive機制,可以減少tcp連接建立次數,也意味着可以減少TIME_WAIT狀態連接,以此提高性能和提高httpd服務器的吞吐率(更少的tcp連接意味着更少的系統內核調用,socket的accept()和close()調用)。

    但是,長時間的tcp連接容易導致系統資源無效佔用。配置不當的keep-alive,有時比重複利用連接帶來的損失還更大。所以,正確地設置keep-alive timeout時間非常重要。

3、keepalvie timeout

Httpd守護進程,一般都提供了keep-alive timeout時間設置參數。比如nginx的keepalive_timeout,和Apache的KeepAliveTimeout。這個keepalive_timout時間值意味着:一個http產生的tcp連接在傳送完最後一個響應後,還需要hold住keepalive_timeout秒後,纔開始關閉這個連接。

當httpd守護進程發送完一個響應後,理應馬上主動關閉相應的tcp連接,設置 keepalive_timeout後,httpd守護進程會想說:”再等等吧,看看瀏覽器還有沒有請求過來”,這一等,便是keepalive_timeout時間。如果守護進程在這個等待的時間裏,一直沒有收到瀏覽發過來http請求,則關閉這個http連接。

    1). 當keepalive_timeout時間爲0時,即不啓用Keep-Alive時,一個tcp連接的生命週期:

        在沒有設置 keepalive_timeout 情況下,一個socket資源從建立到真正釋放需要經過的時間是:建立tcp連接 + 傳送http請求 + php腳本執行 + 傳送http響應 + 關閉tcp連接 + 2MSL 。(注:這裏的時間只能做參考,具體的時間主要由網絡帶寬,和響應大小而定)

    2). 當keepalive_timeout時間大於0時,即啓用Keep-Alive時,一個tcp連接的生命週期。

        設置了keepalive_timout時間情況下,一個socket建立到釋放需要的時間是多了keepalive_timeout時間。

    3). 當keepalive_timeout時間大於0,並且在同一個tcp連接發送多個http響應。

        keepalive_timeout是從最後一個響應結束開啓計時。

        當設定了keepalive_timeout,一個socket由建立到釋放,需要時間是:tcp建立 + (最後一個響應時間 – 第一個請求時間) + tcp關閉 + 2MSL。紅色加粗表示每一次請求發送時間、每一次請求腳本執行時間、每一次響應發送時間,還有兩兩請求相隔時間。進一步測試,正在關閉或者TIME_WAIT狀態的tcp連接,不能傳輸http請求和響應。即,當一個連接結束keepalive_timeout計時,服務端守護進程發送第一個FIN標誌ip包後,該連接不能再使用了。

    4). http keep-alivetcp keep-alive

        http keep-alive與tcp keep-alive,不是同一回事,意圖不一樣。http keep-alive是爲了讓tcp活得更久一點,以便在同一個連接上傳送多個http,提高socket的效率。而tcp keep-alive是TCP的一種檢測TCP連接狀況的保鮮機制。tcp keep-alive保鮮定時器,支持三個系統內核配置參數:

    1    echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time    
    2    echo 15 > /proc/sys/net/ipv4/tcp_keepalive_intvl    
    3    echo 5 > /proc/sys/net/ipv4/tcp_keepalive_probes

        keepalive是TCP保鮮定時器,當網絡兩端建立了TCP連接之後,閒置idle(雙方沒有任何數據流發送往來)了tcp_keepalive_time後,服務器內核就會嘗試向客戶端發送偵測包,來判斷TCP連接狀況(有可能客戶端崩潰、強制關閉了應用、主機不可達等等)。如果沒有收到對方的回答(ack包),則會在 tcp_keepalive_intvl後再次嘗試發送偵測包,直到收到對對方的ack,如果一直沒有收到對方的ack,一共會嘗試 tcp_keepalive_probes次,每次的間隔時間在這裏分別是15s, 30s, 45s, 60s, 75s。如果嘗試tcp_keepalive_probes,依然沒有收到對方的ack包,則會丟棄該TCP連接。TCP連接默認閒置時間是2小時,一般設置爲30分鐘足夠了。

        也就是說,僅當nginx的keepalive_timeout值設置高於tcp_keepalive_time,並且距此tcp連接傳輸的最後一個http響應,經過了tcp_keepalive_time時間之後,操作系統纔會發送偵測包來決定是否要丟棄這個TCP連接。一般不會出現這種情況,除非你需要這樣做。

4、keep-alive與TIME_WAIT

    使用http keep-alvie,可以減少服務端TIME_WAIT數量(因爲由服務端httpd守護進程主動關閉連接)。道理很簡單,相較而言,啓用keep-alive,建立的tcp連接更少了,自然要被關閉的tcp連接也相應更少了。

5、使用啓用keepalive的不同。另外,http keepalive是客戶端瀏覽器與服務端httpd守護進程協作的結果。

wKiom1ddBNGh7EVvAACYb0qKglg277.png

二、應用

    HTTP是一個請求<->響應模式的典型範例,即客戶端向服務器發送一個請求信息,服務器來響應這個信息。在早期的HTTP版本中,每個請求都將被創建一個新的客戶端->服務器的連接,在這個連接上發送請求,然後接收請求。這樣的模式有一個很大的優點就是,它很簡單,很容易理解和編程實現;它也有一個很大的缺點就是,它效率很低,因此Keep-Alive被提出用來解決效率低的問題。

    Keep-Alive功能使客戶端到服務器端的連接持續有效,當出現對服務器的後繼請求時,Keep-Alive功能避免了建立或者重新建立連接。市場上 的大部分Web服務器,包括iPlanet、IIS和Apache,都支持HTTP Keep-Alive。對於提供靜態內容的網站來說,這個功能通常很有用。但是,對於負擔較重的網站來說,這裏存在另外一個問題:雖然爲客戶保留打開的連 接有一定的好處,但它同樣影響了性能,因爲在處理暫停期間,本來可以釋放的資源仍舊被佔用。當Web服務器和應用服務器在同一臺機器上運行時,Keep- Alive功能對資源利用的影響尤其突出。

     此功能爲HTTP 1.1預設的功能,HTTP 1.0加上Keep-Aliveheader也可以提供HTTP的持續作用功能。
Keep-Alive: timeout=5, max=100
timeout:過期時間5秒(對應httpd.conf裏的參數是:KeepAliveTimeout),max是最多一百次請求,強制斷掉連接,就是在timeout時間內又有新的連接過來,同時max會自動減1,直到爲0,強制斷掉。



    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章