HTTP リクエストが途中で終了するとどうなりますか?

HTTP リクエストが途中で終了するとどうなりますか?

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

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

いいえ、と仮定すると、長いタスクが完了すると、サーバーはその結果をどうするのでしょうか? とにかく結果を送り返すのでしょうか? 送り返す場合、どうなるのでしょうか? 私の PC まで届くのでしょうか? それとも途中で失われるのでしょうか?

これは単なる好奇心からです。

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

答え1

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

閉じた TCP 接続にリクエストを送信しようとすると、何が起こるかはサーバー ソフトウェアに完全に依存します。Apache は次のように動作します。動的スクリプトの処理中に送信データがまだ残っている場合、スクリプトに中止を通知し、スクリプトが望むように処理できるようにします (PHP はデフォルトで終了します)。スクリプトが完了した場合、または静的ファイル リクエストの場合は、閉じた接続を無視して戻ります。

答え2

それは電気のようなものだと考えるのが妥当だと思います。充電です。何らかの接続が終了すると、送信中のデータは充電され、その特定の転送に使用できるリスニング ソケットがなくなるため、データは消えてしまいます。ソケットがある場合にのみ、何らかの通信が行われます。

例:

apache2 httpd をヒットしますhttp://localhost。実行されていないと仮定します。ブラウザはソケットを開き、ポート 80 (デフォルト) にメッセージを送信して、応答があるかどうかを確認します。apache が実行されていないためリスナーがないため、この ping 要求はまったく応答を受け取りません。少なくとも 200 ok または何らかのハンドシェイクが返されます。その後、ping はどうなるでしょうか。http は、次のような何かを送信します。GET http://localhost 80この行はどうなるでしょうか。GET http://localhost 80単に課金され、消えてしまいます。

これは私の信念に過ぎませんが、まずはTCPより明確にするためです。そうして初めて、インターネット プロトコルとそれに続く http の動作を理解できます。結局のところ、途中で終了した http 要求の具体的な定義はないようです。これが、途中で終了と呼ばれる理由です。

関連情報