http keepalive
在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連接。
我寫了一個腳本,方便測試
<?phpsleep(60); //為了便于分析測試,會根據測試進行調整echo "www.iis7.com";?>
1.當keepalive_timeout時間為0時,即不啟用Keep-Alive時,一個tcp連接的生命周期
#tcpdump -n host 218.1.57.236 and port 80
20:36:50.792731 IP 218.1.57.236.43052 > 222.73.211.215.http: S 1520902589:1520902589(0) win 6553520:36:50.792798 IP 222.73.211.215.http > 218.1.57.236.43052: S 290378256:290378256(0) ack 1520902590 win 584020:36:50.801629 IP 218.1.57.236.43052 > 222.73.211.215.http: . ack 1 win 3276820:36:50.801838 IP 218.1.57.236.43052 > 222.73.211.215.http: P 1:797(796) ack 1 win 3276820:36:50.801843 IP 222.73.211.215.http > 218.1.57.236.43052: . ack 797 win 5920:37:50.803230 IP 222.73.211.215.http > 218.1.57.236.43052: P 1:287(286) ack 797 win 5920:37:50.803289 IP 222.73.211.215.http > 218.1.57.236.43052: F 287:287(0) ack 797 win 5920:37:50.893396 IP 218.1.57.236.43052 > 222.73.211.215.http: . ack 288 win 3262520:37:50.894249 IP 218.1.57.236.43052 > 222.73.211.215.http: F 797:797(0) ack 288 win 3262520:37:50.894252 IP 222.73.211.215.http > 218.1.57.236.43052: . ack 798 win 59
第1~3行建立tcp三次握手,建立連接。用時8898μs
第4~5行通過建立的連接發送第一個http請求,服務端確認收到請求。用時5μs
第5~6行,可以知道腳本執行用時60s1387μs,與php腳本相符。
第6、8行服務端發送http響應。發送響應用時90166μs。
第7行,表明由服務端守護進程主動關閉連接。結合第6、8行,說明http響應一旦發送完畢,服務端馬上關閉這個tcp連接
第7、9、10說明tcp連接順序關閉,用時90963μs。需要注意,這里socket資源并沒有立即釋放,需要等待2MSL時間(60s)后才被真正釋放。
新聞熱點
疑難解答