HTTP持久連接-Keep-Alive

HTTP并行連接可以提高符合頁面的傳輸速度,但并行連接也存在一些缺點:

  • 每個事務都會打開/關閉一條新的連接,會耗費時間和帶寬

  • 由於TCP滿啟動特性的存在,每條新連接的性能都會有所降低

  • 可打開的并行連接數量實際上是有限的

持久連接有一些比并行連接更好的地方。持久連接降低了時延和連接建立的開銷,將連接保持在已調諧狀態,而且減少了打開連接的潛在數量。但是,管理持久連接時要特別小心,不然就會累積出大量的空閑連接,耗費本地以及遠程客戶端和伺服器上的資源。

持久連接與并行連接配合使用可能是最高效的方式。現在,很多Web應用程序都會打開少量的并行連接,其中的每一個都是持久連接。持久連接有兩種類型,比較老的HTTP/1.0+"keep-alive"連接,以及現代的HTTP/1.1"persistent"連接。

Advertisements

註:在HTTP/1.0中,默認的是短連接,沒有正式規定 Connection:Keep-alive操作;在HTTP/1.1中所有連接都是Keep-alive的,也就是默認都是持久連接的(PersistentConnection)

Nginx配置支持關閉持久連接,如下:

location / {keepalive_timeout 0;}

訪問相同url,在Nginx配置keepalive_timeout 0;前,響應頭截圖如下:

Nginx配置keepalive_timeout 0;后,響應頭截圖如下:

使用tcpdump命令解釋說明connection:keep-alive能實現持久連接,減少tcp連接建立:

Advertisements

tcpdump -n host 47.91.132.205 and port 80

圖:connection:keep-alive下三次請求同一url

如上圖,是在connection:keep-alive下請求同一url,tcpdump抓包的結果,不難看出,第一次請求,創建了tcp連接,后兩次請求,都是基於持久連接下直接傳輸數據。

圖:connection:close下兩次請求同一url

如上圖,是在connection:close下請求同一url,tcpdump抓包的結果,不難看出,第一次請求,創建了tcp連接,第二次請求也創建了tcp連接。

注:如果你的客戶端和伺服器之間有「啞代理(盲中繼)」(即並不能有效識別connection頭部的keep-alive,但會向下轉發這個首部信息,從而造成客戶端、服務端都認為代理接受持久連接,但事實上代理在一次TCP連接結束後放棄連接了),可能看不到上述的實操結果。

簡單印象」頭條號每天將不定時發布文章,內容大多為原創性技術相關或技術人的另一面生活,歡迎大家收藏、轉發、評論或點擊右上角的「關注」,支持我的頭條號,也可以直接訪問我的個人博客(http://www.thanks.live)查看最新撰寫的內容。

Advertisements

你可能會喜歡