HTTP Keep-Alive詳解[轉]

HTTP是一個 請求<->響應模式的典型範例,即客戶端向服務器發送一個請求信息,服務器來響應這個信息。在老的HTTP版本中,每一個請求都將被建立一個新的 客戶端->服務器的鏈接,在這個鏈接上發送請求,而後接收請求。這樣的模式有一個很大的優勢就是,它很簡單,很容易理解和編程實現;它也有一個很大的缺點就是,它效率很低,所以Keep-Alive被提出用來解決效率低的問題。
Keep-Alive功能使客戶端到服務器端的鏈接持續有效,當出現對服務器的後繼請求時,Keep-Alive功能避免了創建或者從新創建鏈接。市場上 的大部分Web服務器,包括iPlanet、IIS和Apache,都支持HTTP Keep-Alive。對於提供靜態內容的網站來講,這個功能一般頗有用。可是,對於負擔較重的網站來講,這裏存在另一個問題:雖然爲客戶保留打開的連 接有必定的好處,但它一樣影響了性能,由於在處理暫停期間,原本能夠釋放的資源仍舊被佔用。當Web服務器和應用服務器在同一臺機器上運行時,Keep- Alive功能對資源利用的影響尤爲突出。 此功能爲HTTP 1.1預設的功能,HTTP 1.0加上Keep-Aliveheader也能夠提供HTTP的持續做用功能。
Keep-Alive: timeout=5, max=100
timeout:過時時間5秒(對應httpd.conf裏的參數是:KeepAliveTimeout),max是最多一百次請求,強制斷掉鏈接
就是在timeout時間內又有新的鏈接過來,同時max會自動減1,直到爲0,強制斷掉。見下面的四個圖,注意看Date的值(先後時間差都是在5秒以內)!

HTTP/1.0
在HTTP/1.0版本中,並無官方的標準來規定Keep-Alive如何工做,所以實際上它是被附加到HTTP/1.0協議上,若是客戶端瀏覽器支持Keep-Alive,那麼就在HTTP請求頭中添加一個字段  Connection: Keep-Alive,當服務器收到附帶有Connection: Keep-Alive的請求時,它也會在響應頭中添加一個一樣的字段來使用Keep-Alive。這樣一來,客戶端和服務器之間的HTTP鏈接就會被保持,不會斷開(超過Keep-Alive規定的時間,意外斷電等狀況除外),當客戶端發送另一個請求時,就使用這條已經創建的鏈接
HTTP/1.1
在HTTP/1.1版本中,官方規定的Keep-Alive使用標準和在HTTP/1.0版本中有些不一樣,默認狀況下所在HTTP1.1中全部鏈接都被保持,除非在請求頭或響應頭中指明要關閉:Connection: Close  ,這也就是爲何Connection: Keep-Alive字段再沒有意義的緣由。另外,還添加了一個新的字段Keep-Alive:,由於這個字段並無詳細描述用來作什麼,可忽略它

Not reliable(不可靠)java

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就不會被啓用 。測試

相關文章
相關標籤/搜索