Keep- Alive: timeout=5, max=100
timeout:過期時間5秒(對應httpd.conf里的參數是:KeepAliveTimeout),max是最多一百次請求,強制斷掉連接
就是在timeout時間內又有新的連接過來,同時max會自動減1,直到為0,強制斷掉。見下面的四個圖,注意看Date的值(前后時間差都是在5秒之內)!
Not reliable(不可靠)
HTTP是一個無狀態協議,這意味着每個請求都是獨立的,Keep-Alive沒能改變這個結果。另外,Keep-Alive也不能保證客戶端和服務器之間的連接一定是活躍的,在HTTP1.1版本中也如此。唯一能保證的就是當連接被關閉時你能得到一個通知,所以不應該讓程序依賴於Keep-Alive的保持連接特性,否則會有意想不到的后果
Keep-Alive和POST
在HTTP1.1細則中規定了在一個POST消息體后面不能有任何字符,還指出了對於某一個特定的瀏覽器可能並不遵循這個標准(比如在POST消息體的后面放置一個CRLF符)。而據我所知,大部分瀏覽器在POST消息體后都會自動跟一個CRLF符再發送,如何解決這個問題呢?根據上面的說明在POST請求頭中禁止使用Keep-Alive,或者由服務器自動忽略這個CRLF,大部分服務器都會自動忽略,但是在未經測試之前是不可能知道一個服務器是否會這樣做。
Keep-Alive 在 Java實現--客戶端
在客戶端,Java抽象了Keep-Alive,和程序員分享離開來,HttpURLConnection類自動實現了Keep-Alive,如果程序員沒有介入去操作Keep-Alive,Keep-Alive會通過客戶端內部的一個HttpURLConnection類的實例對象來自動實現。也就是說,在java中keep-alive是由一個Java類庫來實現的,但在其他類庫中不一定可用。
Keep-Alive 在Java實現--服務器端
在服務器端,Java依然是將Keep-Alive抽象出來,HttpServlet、HttpServletRequest、和HttpServletResponse類自動實現 了Keep-Alive。這種情況下一些由第三方控制的操作是可能的,如在KeepAliveServlet中提到的JavaWebServer,Keep-Alive是否啟用由兩個因素決定,內容長度和輸出大小,如果內容長度是響應的一部分(即這段內容長度輸出后還有內容需要輸出),則Keep-Alive被啟用(當然需要客戶端支持的情況下);如果內容長度未設定,則Servlet會試着計算響應緩沖區長度以確定內容長度,在Javasoft實現中,使用一個4KB的緩沖區(相當於上面說的響應)。也就是說如果內容長度未設定,並且返回數據超過4KB,此時相當於內容長度大於響應長度,而不是響應長度一部分,Keep-Alive就不會被啟用 。