ポートについて:複数のブラウザータブが同時に通信する方法 [閉まっている]


18

今日、ポートコミュニケーションがどのように機能するかを根本的に理解していないことに気付きました。

ポート80でリッスンしているWebサーバーのインスタンスを起動すると、多くの異なるブラウザタブからの多くのリクエストに応答でき、すべてポート80で通信します。

ただし、ポートの競合が発生するため、ポート80でリッスンするサーバーの2つのインスタンスを起動できません。

私はこれを常に考えていました(特定のポートにいつでもバインドできるプロセスは1つだけです)。実際に考え抜くことはありません。ポート80で通信する複数のプロセスはありませんか?(つまり、ブラウザで実行されている各タブ?)

回答:


24

基本的に、一度に1つのプロセスのみがポートでリッスンできます(技術的には、1つのソケットがリッスン専用です)。ただし、ポートはデータを転送する多くのソケットを処理できます。ソケットは、ローカルIP /ポートとリモートIPアドレス/リモートポートの組み合わせです。そのようにして、サーバーがリッスン中に着信接続を受け入れると、その会話専用の新しいソケットを開き、処理を他の何かに渡し、リッスンに戻ります。

詳細はこちら


実際には、同じポートで複数のプロセスをリッスンさせることができます。たとえば、複数のudpリーダーでこれを行うと、カーネルレベルで負荷分散が行われます。最初にリスニング用のソケットを開き、次にフォークしrecv()て各プロセスで試してください。
viraptor

5
@viraptor:本当ですが、UDPはコネクションレスであるため、「リスニング」と「受信」の間に実際の区別はありません。
アダムロビンソン

同じ考え方がTCPでも機能し、ソケットをリッスンしてプロセスを分岐し、両方でaccepting()します。
-viraptor

実際、ソケットは通信の1つの「エンドポイント」にすぎません。あなたが言いたいことは、接続されたソケットはローカルIP /ポートとリモートIP /アドレス/リモートポートの組み合わせだと思います。ワードソケットはそれほど頻繁に私はそれが実際の記述がありますかを把握することは困難だったことに使用される
westoque

14

ブラウザは、コンピューターのランダムな高(つまり、1024以上)ポートからリモートサーバーのポート80に接続します。したがって、マシンでポートの競合はありません。

多くのタブを使用して同じリモートサーバーに接続する場合(またはサーバーに接続するユーザーが多い場合)、すべて同じポートに移動し、同じプロセス(つまり、サイトのWebサーバー)によって処理されます。


2
これは正解です。TCP接続には、両端にポート番号があります。関係する両方のコンピューターは、接続Webサイト:80 <->ブラウザー:12397と異なる接続Webサイト:80 <->ブラウザー:22958を区別できます。
pjc50

7

ポート80でリッスンしているサーバーは、複数のプロセスを処理できません。長年の単純なTCPデーモンは、一度に1つの接続しか処理できませんでした。この動作をエミュレートするnetcatには、特定のポートでリッスンするようなプログラムを使用して、2つのマシンを接続しようとします。1つが入り、もう1つが接続なしで跳ね返ります。これらのデーモンはほとんど役に立たないので、それらはもう表示されません。

Webサーバーのようなものの場合、ポートで直接リッスンします。覚えておくべきことは、オペレーティングシステムのソケットライブラリの上にあるということです。新しい接続が確立されると、ソケットライブラリは新しいソケットをWebサーバーソフトウェアに渡します。その時点で、Webサーバーソフトウェアにはいくつかのオプションがあります。

1つの可能性は、ソケットオブジェクトを同じプロセス内の新しいスレッドに渡すことです。このソケットを介して通信が発生するたびに、このスレッドが処理します。親プロセスは、特定の時点でアクティブになっているスレッドを仲介します。

別の可能性は、新しいプロセスを起動し、ソケットオブジェクトをプロセスに渡すことです。私が理解しているように、これらの子プロセスとターゲットの間の通信を仲介するのは、オペレーティングシステムのソケットシステム次第です。親プロセスは、ハングしたプロセスの強制終了や他のプロセス間通信など、プロセスを制御できます。

これらのアプローチのどちらがより効率的かは、オペレーティングシステムによって異なります。IIRC、Apacheはどちらのモードでも実行できます。

本質的に、ソケットライブラリはWebサーバーに一定レベルの並列処理を提供します。新しい接続を受け入れながら、アクティブにデータを転送する複数の同時接続を処理できます。

ロード時間を改善するためにWebサーバーへの複数の接続試行をスピンアップできるブラウザーの場合、ブラウザー側にも並列処理が適用されます。これは素晴らしいことです。ブラウザーは、ページの読み込み中にページの状態を追跡し、スピンアップする複数の接続試行はすべてプロセスの一部です。


非常に多くの点で正しいことに対して+1 :)
マイケルローマン

2

事実上、ストリームソケットには2つの「タイプ」があります。一方にはワイルドカードの「もう一方の端」があり、もう一方には特定のhost:portがもう一方の端にあります。

2つのソケットが同じ「this end」および「other end」識別子を持つことはできません(むしろ、そうすべきではありません)。「リッスン」されている(着信接続を受け入れる)ソケットはワイルドカードの「相手側」を持つソケットなので、一度に1つしか存在できません。接続が到着するacceptと、もう一方のホストのhost:portタプルでソケットを返します。


1

あなたの質問は、Cisco CCNAの数年前に自分自身を思い出させてくれます-同じ疑問がありました:)

まず、複数のHTTP接続を確立することは、ブラウザーで開いているタブの量に必ずしも関係しません。たとえば、広告またはGoogleアナリティクスコードを使用してサイトにアクセスすると、1つのタブだけにいるにもかかわらず複数のサイトに接続します。

とにかく、ブラウザーがWebサーバーと通信する場合、Webサーバーに送信されるトラフィックの宛先ポートはポート80であり、ソースポートは乱数です。送信元ポートは、ウェブサーバーに、どのポートで通信する必要があるかを知らせるためのものです。httpで確立された各接続には、コンピューター上で開かれた独自のポートがあります。いくつかのWebサイトを開いた状態でnetstatを実行すると、すぐに意味がわかります。

笑うかもしれませんが、この本はTCP / IPの基本を理解するための優れた高速な方法です。とても助かりました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.