參考:《HTTP權威指南》
所有HTTP用戶端、伺服器或者代理都可以任意時刻關閉一條TCP傳輸連接配接。但是伺服器永遠無法确定它關閉“空閑”連接配接的那一刻,線上路那一頭的用戶端有沒有資料要發送。
每條HTTP響應都應該有精确的Content-Length首部,用來描述響應主體的尺寸。如果老的HTTP伺服器省略了Content-Length或者包含錯誤的長度訓示,這樣就要一來伺服器發出連接配接關閉來說明資料的真是末尾。
如果一個事務,不管是執行一次還是很多次,得到的結果都相同,這個事務就是幕等的。GET,HEAD,PUT,DELETE,TRACE,OPTIONS方法都具有幕等性。POST方法時非幕等的。要發送一條非幕等請求,就需要等待來自前一條請求的響應狀态。使用者Agent代理可能會讓使用者來選擇是否對請求進行重試,但是一定不能自動重試非幕等方法或序列。大多數浏覽器都會重載一個緩存的POST響應時提供一個對話框,詢問使用者是否希望再次發起事務處理。
正常關閉連接配接
1)完全關閉
将TCP連接配接的輸入和輸出信道都關閉了。入套接字調用close()
2)半關閉
單獨關閉輸入或輸出信道。如,套接字調用shutdown()
當應用程式開始與很多其他類型的HTTP用戶端、伺服器和代理進行對話且開始使用管道化持久連接配接時,使用半關閉連接配接來防止對等實體收到非預期的寫入錯誤。關閉輸入信道比較危險,除非你知道另一端不打算再發送其他資料了。如果另一端向你已關閉的輸入信道發送資料,作業系統就會向另一端的機器回送一條TCP“連接配接被對端重置”的封包。大部分作業系統都會将這種情況作為很嚴重的錯誤處理,删除對端還未讀取的所有緩存資料。
是以,實作正常關閉的應用程式首先應該關閉它們的輸出信道,然後等待連接配接另一端的對等實體關閉它的輸出信道。當兩端都告訴對方它們不會在發送任務資料之後,連接配接就是被完全關閉。然後,無法確定對等實體會實作半關閉,或對其進行檢查,是以想要正常關閉連接配接的應用程式應該先關閉其輸出信道,然後周期性得檢查其輸入信道的狀态。如果在一定時間内對端沒有關閉輸入信道,應用程式可以強制關閉連接配接,以節省資源。