ネットワークはなぜ繋がるのかを読ませていただきました。 そこで質問があります。 サーバーがFINを送るまで、ブラウザに受信データは渡らないのでしょうか? p133にFIN1のパケットを受け取ったACK番号をサーバー側に送り返したら、アプリケーションがデータを取りに来るのを待ちます という文があったので質問させていただきました。
匿名希望さん、 弊著お読みいただきありがとうございます。
さて、FINの動作ですが、 その前に、129〜131ページにある 「2.3.7 HTTPレスポンスメッセージを受信」 という箇所をもう一度読んでみてください。
何かデータを送信したアプリケーションは 送信後、readを実行して 相手からの届いたデータを渡すよう、OSに依頼するはずです。 そして、OSは届いたデータをアプリケーションに渡します。 もし、データが届いていなければ、 データが届くのを待って、届いた時にアプリケーションに渡します。
つまり、アプリケーションはreadを実行することで、 届いたデータを受け取れる、ということです。 FINを待つ必要はありません。
少し補足します。 データを受信した後の動きはどうなるか、という点です。
普通、データを受信したクライアントは 次のデータを受け取るために、再度readを実行します。 そして、データを受け取ったら、再度readする、また受け取る、readする という具合に、データが終わるまで、この動作を継続します。
133ページは、 このようなデータ受信動作が続いた後に FINが来ることを想定しています。 つまり、アプリケーションがデータを受け取りに来たところに FINが届く、ということです。
なお、133ページには、 FINが届いた後でreadが実行されるように書いてありますが、 クライアントの動作速度が速い場合は、 FINが届く前にreadが実行されるかもしれません。 その場合は、OSはデータの到着を待ち、 届いたのがFINであれば、データ終了をアプリケーションに通知します。
コメント
readを実行すればデータを受け取れます。FINを待つ必要はありません。
匿名希望さん、
弊著お読みいただきありがとうございます。
さて、FINの動作ですが、
その前に、129〜131ページにある
「2.3.7 HTTPレスポンスメッセージを受信」
という箇所をもう一度読んでみてください。
何かデータを送信したアプリケーションは
送信後、readを実行して
相手からの届いたデータを渡すよう、OSに依頼するはずです。
そして、OSは届いたデータをアプリケーションに渡します。
もし、データが届いていなければ、
データが届くのを待って、届いた時にアプリケーションに渡します。
つまり、アプリケーションはreadを実行することで、
届いたデータを受け取れる、ということです。
FINを待つ必要はありません。
少し補足します。
データを受信した後の動きはどうなるか、という点です。
普通、データを受信したクライアントは
次のデータを受け取るために、再度readを実行します。
そして、データを受け取ったら、再度readする、また受け取る、readする
という具合に、データが終わるまで、この動作を継続します。
133ページは、
このようなデータ受信動作が続いた後に
FINが来ることを想定しています。
つまり、アプリケーションがデータを受け取りに来たところに
FINが届く、ということです。
なお、133ページには、
FINが届いた後でreadが実行されるように書いてありますが、
クライアントの動作速度が速い場合は、
FINが届く前にreadが実行されるかもしれません。
その場合は、OSはデータの到着を待ち、
届いたのがFINであれば、データ終了をアプリケーションに通知します。