2013-07-03 75 views
4

背景:我試圖讓ApacheBench在我的自定義服務器上工作。我試着發行ab -n 1 -c 1 http://localhost:1337/index.html,我嗅探連接(與wireshark)我看到wayyy不止一個請求被髮送。HTTP 1.0服務器何時關閉連接?

實施例要求:

 
GET /index.html HTTP/1.0 
Host: localhost:1337 
User-Agent: ApacheBench/2.3 
Accept: */* 

(repeats more times than I care to count) 

我假定爲RFC 1945說「除了實驗應用中,目前的做法要求連接之前由每個請求和發送響應之後,由服務器關閉客戶端來建立。 「當我請求一個頁面時,這與ApacheBench一起工作。但是,如果我將請求的數量增加到10,則會收到「由對等方重置連接」。考慮到我關閉了連接,這是有道理的。

但是,我嘗試了與Google相同的過程,並且它在這兩種情況下均正常工作。那麼,我該如何知道何時關閉HTTP 1.0的連接呢?

回答

13

在HTTP 0.9中,服務器始終在發送響應後關閉連接。客戶端收到響應後必須關閉連接的結束。

在HTTP 1.0中,服務器總是關閉發送響應除非客戶端發送的請求Connection: keep-alive報頭和所述服務器發送的響應Connection: keep-alive報頭之後的連接。如果不存在這樣的響應報頭,則客戶端在收到響應後必須關閉連接的結束。

在HTTP 1.1中,服務器不關閉發送響應除非客戶端發送的請求Connection: close標頭或服務器發送的響應Connection: close報頭之後的連接。如果存在這樣的響應頭,則客戶端在收到響應後必須關閉連接的結束。

+0

但正如你所看到的,客戶端沒有發送Keep-Alive標題,所以發生了什麼? – chacham15

+0

如果沒有保持活動狀態(必須在HTTP 1.0中明確請求),則客戶端**必須在收到響應後關閉連接,即使服務器在發送響應後未關閉連接。 –

+0

@RemyLebeau做Chrome的旋轉_loading circle_意味着即使在收到服務器的響應之後,客戶端服務器之間的連接仍然是開放的? – gkiko