2012-12-20 62 views
0

我只是通過HTTP 1.1的規範就在http://www.w3.org/Protocols/rfc2616/rfc2616.html和跨有關連接http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8節說HTTP和會話

來到「HTTP/1.1和更早版本的HTTP之間的顯著區別在於持久連接是所有HTTP連接的默認行爲,也就是說,除非另有說明,否則客戶端應該假設即使在服務器發生錯誤響應後,服務器也會保持持久連接。服務器可以發出TCP連接關閉的信號,這個信號發生在Connection頭f中(第14.10節)。一旦收到信號,客戶端絕不能在該連接上發送更多的請求。 「

然後,我還通過HTTP狀態管理的章節就在http://tools.ietf.org/html/rfc2965是說,在其第2節

‘目前,HTTP服務器,每個客戶端請求不涉及該請求到前面或後面的請求作出迴應;’

大約需要有在2616持久連接一節也說,持續連接之前的每一次客戶端希望獲取一個網址就必須建立對每一個新的請求一個新的TCP連接。

現在我的問題是,如果我們有在http/1.1中持久連接,如上所述,客戶端不需要爲每個新請求建立一個新的連接。它可以通過同一連接發送多個請求。因此,如果服務器知道每個後續請求都是通過同一個連接傳送的,請求是否來自同一個客戶端,這不是很明顯嗎?因此,這僅僅不足以維持狀態,並且這對於服務器來說理解請求來自同一客戶端就足夠了嗎?在這種情況下,爲什麼需要獨立的國家管理機制?

回答

0

基本上,這是有道理的,但HTTP持久連接用於消除連接處理的管理TCP/IP開銷(例如連接/斷開連接/重新連接等)。這並不是要說通過連接傳輸數據的狀態,這就是你正在談論的內容。

+0

好的,謝謝你的回覆。我理解你的觀點。但實際上它本身就是我的問題,「爲什麼不能說關於數據在連接上移動的狀態呢?看看數據是否通過同一個連接發送,這顯然意味着它是由實際打開conn的同一個客戶端發送的。因此,現在對於每個後續請求(通過同一個conn),已知請求來自同一個客戶端。如果我沒有錯,那是因爲這個原因,我們實際上需要有單獨的狀態管理機制,並且http是一個無狀態協議。 – qre0ct

+0

那麼,客戶端如何通知主機新的數據正在發送? HTTP不是流式數據協議,它是基於連接的。因此,根據定義,每個連接(即使它純粹是一個持久的物理連接上的邏輯連接)需要以標題,正文和結尾開頭。我明白你要去哪裏,並且盡一切辦法,制定你自己的協議。但就目前而言,系統中已經沒有太多的開銷,這就是爲什麼人們不使用其他任何東西:因爲這種方式工作得很好。 – L0j1k

+0

感謝它現在有更好的意義。我現在必須從此開始工作。再次感謝。 – qre0ct