假設,我在瀏覽器中輸入一個 URL,瀏覽器提交了 HTTP 請求。遠端 HTTP 伺服器接受請求並啟動一個長任務來處理該請求。
如果我在請求完成之前終止該請求(例如,按 Esc 或在 Firefox 中),該請求如何關閉?瀏覽器是否會將此中止請求傳達給伺服器(我認為不會)?
假設不是,完成長任務後,伺服器將如何處理結果?無論如何它都會將其發送回來嗎?如果是的話,會發生什麼事?它能到達我的電腦嗎?還是中途迷路了?
這只是出於我的好奇心。
謝謝你的時間 :)
答案1
好吧,這完全取決於伺服器在做什麼。通常,在嘗試發送之前,它不會「檢測」終止的請求。此時,腳本將從 Web 伺服器取得 user_abort 訊息(在 php 中,您可以使用 告訴它忽略使用者中止ignore_user_abort(true);
)。如果不嘗試向客戶端發送數據,伺服器就無法知道請求已中止。
當它嘗試向已關閉的 TCP 連線發送請求時,會發生什麼完全取決於伺服器軟體。 Apache 的工作方式如下:如果在動態腳本處理時發送的資料仍然存在,它將告訴腳本有關中止的信息,並讓它按照自己的需要進行處理(PHP 預設會終止)。如果腳本完成,或者它是靜態文件請求,它將忽略關閉的連接並返回。
答案2
我認為這應該被認為是電力之類的事情。收費。當某些連線終止時,正在傳送的資料是收費的,它就會消失,因為沒有可用於該特定傳輸的偵聽套接字。只有當有套接字時,才會發生一些通訊。
例子:
我們點擊http://localhost
了 apache2 httpd。假設它沒有運行。瀏覽器開啟一個套接字,向連接埠 80(預設)發送一條訊息,並查看是否有任何回應。由於 apache 未運作而沒有偵聽器,因此該 ping 請求根本無法獲得任何回應。至少 200 次就可以了,或者任何形式的握手都可以。那麼我們的 ping 會發生什麼變化呢? http 發送一些東西:例如GET http://localhost 80
...等等。GET http://localhost 80
?它只是一次充電,然後就會消失。
這只是我的信念,我們應該先參考傳輸控制協定為了更清楚。只有這樣,我們才能了解Internet協定以及隨後的http的行為方式。最終,對於過早終止的 http 請求,似乎沒有具體的定義。這就是為什麼它被稱為提前終止。