Keep-Alive 是什么?
概觀
默認情況下,HTTP鏈接通常在請求完成之后關閉。這意味着服務端在完成響應的交付之后便關閉了TCP鏈接。為了讓鏈接保持打開,來滿足多請求,可以使用keep-alive 頭信息。
沒有Keep-Alive的情況下,HTTP是怎么工作的
- 1.客戶端需要重新創建一個鏈接和服務器交互,用以接收一個文件。
- 2.客戶端使用一個新的鏈接來向服務器請求HTML文件,這個連接在接收完文件的時候就會被關閉。
- 3.瀏覽器解析HTML文件並檢查完成網頁的展示是否還需要其他文件。(例如css文件,js文件,圖片)
- 4.經過徹底的分析,瀏覽器再重新創建鏈接來請求這每一個文件。
我們需要Keep-Alive
創建多個鏈接可能會降低加載速度,同時也會利用服務器更多資源。我們可以通過啟用Keep-Alive來克服這個問題,通過單個鏈接來傳遞這些文件,如此就避免了重復的創建和關閉新連接。如果沒有啟用Keep-Alive,展示一個網頁的過程可能需要相當長的時間。
如何開啟Keep-Alive
Keep-Alive的啟用是通過在HTTP 頭信息中明確聲明來完成的。以apache web server為例,如果你有權限訪問Apache的配置文件(httpd.conf),你可以在這里打開keep-alive。配置方法見下文。
3個影響Keep-Alive功能的屬性。
Keep-live
使用“KeepAlive On”來啟用,使用“KeepAlive Off”來禁用。開啟之后的響應頭大概如下:
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
Date: Thu, 15 Jan 2017 16:45:29 GMT
Content-Length: 1845
Keep-Alive: timeout=10, max=20
Server: Apache/2.4.9 (Unix) PHP/5.6.2
MaxKeepAliveRequests
用來設置KeepAlive鏈接的最大數量。合適的值取決於實際的情況。
KeepAliveTimeout
這個設置可以防止未使用的鏈接占用太長久。其實就是鏈接需要keep多久的問題。比如設置7到10秒通常就可以了。在流量較高的情況下這個值可能就得設置大一點了,以確保沒有頻繁的TCP鏈接重新啟動。如果這個值設置太小了,那么也許就是去了keep-alive本身的目的了。
Keep-Alive的益處
- 1.減少CPU使用:創建一個新的TCP鏈接會消耗一些資源,例如CPU和內存的使用。使鏈接保持存活的時間長一點可以避免頻繁的創建新鏈接,從而減少資源使用。
- 2.網頁加載速度:使用同一個鏈接來加載多個文件可以是網頁加載的快點。
- 3.HTTPS:https非常消耗資源,所以強烈建議對https開啟keep-alive,並盡可能使用HTTP/2進行一些調整。
如果你使用的是HTTP/1.1,它的實現方式與HTTP/1.0的keek-live不同,HTTP/1.1的鏈接默認是保持活躍的,它假定所有的鏈接都是持久的,除非響應頭中包含:“Connection:close”頭。但是如果不發送“Connection:close”頭並不意味着鏈接會永遠持續,鏈接還是會被關閉的。
spring如何啟動的?這里結合spring源碼描述了啟動過程
SpringMVC是怎么工作的,SpringMVC的工作原理
spring 異常處理。結合spring源碼分析400異常處理流程及解決方法
Mybatis Mapper接口是如何找到實現類的-源碼分析