ブラウザに 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 要求の具体的な定義はないようです。これが、途中で終了と呼ばれる理由です。