HTTP Keep-Alive是什麼?如何工作?
HTTP Keep-Alive
在http早期,每個http請求都要求開啟一個tpc socket連線,並且使用一次之後就斷開這個tcp連線。
使用keep-alive可以改善這種狀態,即在一次TCP連線中可以持續傳送多份資料而不會斷開連線。通過使用keep-alive機制,可以減少tcp連線建立次數,也意味著可以減少TIME_WAIT狀態連線,以此提高效能和提高httpd伺服器的吞吐率(更少的tcp連線意味著更少的系統核心呼叫,socket的accept()和close()呼叫)。
但是,keep-alive並不是免費的午餐,長時間的tcp連線容易導致系統資源無效佔用。配置不當的keep-alive,有時比重複利用連線帶來的損失還更大。所以,正確地設定keep-alive timeout時間非常重要。
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 |
sleep(60); //為了便於分析測試,會根據測試進行調整 |
2 |
echo "www.example.com" ; |
1. 當keepalive_timeout時間為0時,即不啟用Keep-Alive時,一個tcp連線的生命週期:
01 |
#tcpdump
-n host 218.1.57.236 and port 80 |
02 |
20:36:50.792731
IP 218.1.57.236.43052 > 222.73.211.215.http: S 1520902589:1520902589(0) win 65535 |
03 |
20:36:50.792798
IP 222.73.211.215.http > 218.1.57.236.43052: S 290378256:290378256(0) ack 1520902590 win 5840 |
04 |
20:36:50.801629
IP 218.1.57.236.43052 > 222.73.211.215.http: . ack 1 win 32768 |
05 |
06 |
20:36:50.801838
IP 218.1.57.236.43052 > 222.73.211.215.http: P 1:797(796) ack 1 win 32768 |
07 |
20:36:50.801843
IP 222.73.211.215.http > 218.1.57.236.43052: . ack 797 win 59 |
08 |
09 |
20:37:50.803230
IP 222.73.211.215.http > 218.1.57.236.43052: P 1:287(286) ack 797 win 59 |
10 |
20:37:50.803289
IP 222.73.211.215.http > 218.1.57.236.43052: F 287:287(0) ack 797 win 59 |
11 |
20:37:50.893396
IP 218.1.57.236.43052 > 222.73.211.215.http: . ack 288 win 32625 |
12 |
20:37:50.894249
IP 218.1.57.236.43052 > 222.73.211.215.http: F 797:797(0) ack 288 win 32625 |
13 |
20:37:50.894252
IP 222.73.211.215.http > 218.1.57.236.43052: . ack 798 win 59 |
- 第1~3行建立tcp三次握手,建立連線。用時8898μs
-
相關推薦
no