HTTPリクエストが途中で終了した場合はどうなりますか?


13

ブラウザーにURLを入力し、ブラウザーがHTTP要求を送信するとします。リモートHTTPサーバーは要求を受け入れ、要求を処理するための長いタスクを開始します。

リクエストが完了する前に終了した場合(たとえば、Escキーを押すかFirefoxで)、リクエストはどのように閉じられますか?ブラウザはこの中止要求をサーバーに通信しますか(そうではないと思いますか)?

いいえ、長いタスクの完了時に、サーバーは結果をどうしますか?とにかくそれを送り返しますか?もしそうなら、何が起こりますか?私のPCまで届きますか?または途中で迷子になりますか?

これは私の好奇心のためです。

御時間ありがとうございます :)


2
Wiresharkキャプチャを実行しようとしましたか?これにより、あるコンピューターがネットワーク経由で別のコンピューターに送信するものを簡単に確認できます。
-racyclist

回答:


8

まあ、それはすべてサーバーが何をしているかに依存します。通常、送信が試行されるまで、終了した要求を「検出」しません。その時点で、スクリプトはWebサーバーからuser_abortメッセージを取得します(phpでは、ユーザーによる中断を無視するように指示できますignore_user_abort(true);)。クライアントにデータを送信しようとしない限り、サーバーがリクエストが中止されたことを知る方法はありません。

閉じたTCP接続に要求を送信しようとすると、何が起こるかはサーバーソフトウェアに完全に依存しています。Apacheは次のように機能します。送信されたデータが動的スクリプトの処理中にまだ存在する場合、スクリプトにアボートについて通知し、必要に応じて処理させます(PHPはデフォルトで終了します)。スクリプトが終了した場合、または静的ファイル要求の場合、閉じられた接続を無視して戻ります。


-2

電気のようなものを考えるべきだと思います。充電。一部の接続が終了すると、送信中のデータは有料になります。特定の転送に使用できるリッスンソケットがないため、データは消えます。ソケットがある場合のみ、何らかの通信が行われます。

例:

http://localhostapache2 httpdにヒットしました。実行されていないとします。ブラウザはソケットを開き、ポート80(デフォルト)にメッセージを送信し、応答があるかどうかを確認します。Apacheが実行されていないためリスナーが存在しないため、このpingリクエストはまったく応答しません。少なくとも200 okまたはあらゆる種類の握手。それでは、pingはどうなりますか?httpは次のようなものを送信しますGET http://localhost 80。...など。この行はどうなりますか?GET http://localhost 80?それはただの充電であり、消えます。

これは私の信念であり、より明確にするために最初にTCPを参照する必要があります。そうして初めて、インターネットプロトコルとそれに続くhttpの動作を理解できます。最終的に、時期尚早に終了したhttpリクエストの具体的な定義はないようです。これが、早期終了と呼ばれる理由です。


1
おそらく詩的ですが、これは不正確であり、この影響を考慮するのに特に有用な方法ではありません。
ファルコンモモット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.