2012-01-13 85 views
2

發送請求後,HTTP客戶端使用的套接字如何正確關閉?還是必須保持開放(雙向)直至收到完整回覆?如果是這樣,請求體的結束如何由服務器確定?HTTP:發送請求後寫入的關閉套接字?

根據http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.4,關閉套接字不是請求的選項。這對我來說聽起來並不合理 - 如果客戶端在關閉其一半的套接字後不嘗試傳輸任何東西,爲什麼半關閉的TCP連接對服務器來說是個問題?客戶端仍然可以接收數據。

在我看來,關閉套接字的寫入部分將是讓服務器知道請求已完成的一種非常實用的方法。 http://docs.python.org/howto/sockets.html#disconnecting甚至具體提到該用例。

如果這確實是錯誤的做法,那麼有什麼選擇?我是否總是必須發送「Content-length」或使用分塊傳輸來使服務器正確地找到請求的結尾?這對身體未知長度的請求如何工作?

回答

1

Transfer-Encoding: chunked專門設計用於發送身體未知長度的數據,用於請求和響應。數據的結束通過接收有效負載大小爲0的塊來確定。如果您不發送chunked請求,則必須發送Content-Length

+0

因此,它是強制性使用分塊傳輸編碼或發送一個「Content-Length」標頭的請求身體的所有請求?我知道這將是一個明智的做法,但實際上是在標準中的某處指定的嗎? – lxgr 2012-01-13 21:28:24

+0

如果請求具有正文,則必須包含足夠的信息以供服務器確定正文的大小。閱讀RFC 2616第4.3節(消息體)和4.4(消息長度)。 – 2012-01-13 21:55:15

1

你說的是這個?:

關閉連接不能用於指示請求主體的結束,因爲這將留下任何可能性服務器發回一個響應。

我覺得文中談論的是全關,你可以做一半(寫) - 關閉。我不確定這是一種HTTP編譯方式,但我認爲大多數服務器都會接受它。

關於第二個問題,簡單地使用分塊編碼:

所有HTTP /接收實體必須接受「分塊」傳輸編碼(第3.6節)1.1應用程序,從而允許用於該機構消息長度無法預先確定時的消息。

+0

是的,這是我所指的段落。所以你會說,做一個半關閉是安全的嗎?那就是我所希望的;我不想爲簡單的HTTP服務器實現分塊傳輸編碼。 – lxgr 2012-01-13 21:27:23

+0

好吧,我的經驗是,服務器比標準指定的更容忍錯誤(可能與蹩腳的客戶端...)。這聽起來像你正在寫你的服務器和客戶端..在這種情況下,如果你的路徑中沒有HTTP代理,你可以做任何你想做的事情。這是不是一件好事,但它的工作原理;) – 2012-01-14 11:27:16