今日、私は基本的にポートコミュニケーションの仕組みを理解していないことに気付きました。
ポート80でリッスンしているWebサーバーのインスタンスを起動すると、ポート80を介して通信するさまざまなブラウザータブからの多くのリクエストに応答できます。
ただし、ポートの競合が発生するため、どちらもポート80でリッスンしているサーバーの2つのインスタンスを起動できません。
私は常にこれを与えられたものとして考えてきました(特定のポートにバインドできるのは常に1つのプロセスだけです)。 (つまり、ブラウザで実行されている各タブ?)
基本的に、一度に1つのポートでリッスンできるプロセスは1つだけです(技術的には、1つのソケットがリスニング専用です)。ただし、ポートはデータを転送する多くのソケットを処理できます。ソケットは、ローカルIP /ポートとリモートIPアドレス/リモートポートの組み合わせです。このようにして、サーバーが受信中に受信接続を受け入れると、サーバーはその会話専用の新しいソケットを開き、処理を他の何かに引き渡してから、受信に戻ります。
詳細はこちら 。
ブラウザは、コンピュータのランダムな高(つまり、> 1024)ポートからリモートサーバーのポート80に接続します。したがって、マシンでポートの競合は発生しません。
多くのタブを使用して同じリモートサーバーに接続している場合(またはサーバーに接続しているユーザーが多い場合)、すべてのタブが同じポートに移動し、同じプロセス(つまり、サイトのWebサーバー)によってサービスが提供されます。
ポート80でリッスンしているサーバーは、複数のプロセスを処理する必要がありません。単純なTCP長年のデーモンは一度に1つの接続しか処理できませんでした。netcat
のようなプログラムを特定のポートでリッスンし、2つの接続を試行することで、この動作をエミュレートできますこれらのデーモンはほとんど役に立たないので、もう目にすることはありません。
Webサーバーのようなものでは、ポートで直接リッスンしています。覚えておくべきことは、それがオペレーティングシステムのソケットライブラリの上にあるということです。新しい接続が確立されると、ソケットライブラリは新しいソケットをWebサーバーソフトウェアに渡します。その時点で、Webサーバーソフトウェアにはいくつかのオプションがあります。
1つの可能性は、同じプロセスの新しいスレッドにソケットオブジェクトを渡すことです。このソケットを介して通信が発生すると、このスレッドがそれを処理します。親プロセスは、どのスレッドが常にアクティブであるかを仲介します。
別の可能性は、それが新しいプロセスを起動し、ソケットオブジェクトをプロセスに渡すことです。私が理解しているように、これらの子プロセスとそのターゲット間の通信を仲介するのは、オペレーティングシステムのソケットシステム次第です。親プロセスは、ハングしているプロセスの強制終了や他のプロセス間通信などのプロセスを制御できます。
これらのアプローチのどちらがより効率的かは、オペレーティングシステムによって異なります。 IIRC、Apacheはどちらのモードでも実行できます。
本質的に、ソケットライブラリはWebサーバーにあるレベルの並列処理を提供します。新しい接続を受け入れながら、データをアクティブに転送する複数の同時接続を処理できます。
ロード時間を改善するためにWebサーバーへの複数の接続試行をスピンアップできるブラウザーの場合、ブラウザー側にも並列処理が適用されます。これはすばらしいことです。ブラウザーは、ページの読み込み中にページの状態を追跡し、起動する複数の接続試行はすべてプロセスの一部です。
事実上、ストリームソケットには2つの「タイプ」があります。 1つはワイルドカード「もう一方の端」を持ち、もう1つはもう一方の端に特定のHost:portを持ちます。
2つのソケットが同じ「this end」と「other end」の識別子を持つことはできません(むしろ、そうする必要があります)。 「リッスンする」(着信接続を受け入れる)ソケットは、ワイルドカードの「もう一方の端」を備えているため、一度に1つしか存在できません。接続が到着すると、accept
が実行され、もう一方の端のHost:portタプルを持つソケットが返されます。
あなたの質問は、Cisco CCNAの数年前の自分を思い出させます-同じ疑問がありました:)
まず、複数のHTTP接続を確立することは、ブラウザで開いているタブの数に必ずしも関連しているわけではありません。たとえば、広告やGoogleアナリティクスコードのあるサイトにアクセスすると、1つのタブにあるだけで複数のサイトに接続することになります。
とにかく、ブラウザーがWebサーバーと通信する場合、Webサーバーに送信されるトラフィックの宛先ポートはポート80で、送信元ポートはランダムな番号です。送信元ポートは、Webサーバーにどのポートに通信する必要があるかを知らせるためのものです。 httpで確立された接続ごとに、コンピューター上で独自のポートが開かれます。いくつかのWebサイトを開いた状態でnetstatを実行してみてください。そうすれば、すぐに私の意味がわかります。
あなたは笑うかもしれませんが、 this 本は、TCP/IPの基本を理解するための優れた高速な方法です。それは私を大いに助けました。