29

https://serverfault.com/questions/296603/understanding-ports-how-do-multiple-browser-tabs-communicate-at-the-same-time

アプリケーションがブラウザと競合することなくポート80/HTTPを使用するにはどうすればよいですか?

複数のクライアントがサーバー上の1つのポート(たとえば80)に同時に接続するにはどうすればよいですか?

上記の質問を読みましたが、答えに一貫性がないようです。

ソケット接続を正確に定義するものを知りたいのですが、それは次のとおりです。

(sockid, source ip, source port, dest ip, dest port)

またはのみ:

(source ip, source port, dest ip, dest port)

2つの異なるプロセス(たとえば、2つの異なるブラウザー)が同じ送信元ポート上のWebサーバーと通信できますか?(宛先ポートはデフォルトで同じになります)

同じブラウザの異なるタブの場合はどうなりますか?

また、回答の1つで述べたように、1つのWebページで複数のサーバー(広告サーバーなど)に同時に接続できます。複数のサーバーに同時に接続する場合、Webブラウザー(Chrome、Firefoxなど)は同じポートを使用して各サーバーに接続しますか、それともサーバーごとに異なるポートを使用しますか?

4

3 に答える 3

92

私はこれが遅いことを知っていますが、スレッドはまだインターネット上にあり、ウェブ上で信頼できる答えがほとんどない一般的な質問であるため、これでも、それに遭遇する可能性のある人にとっては、より完全で簡潔な説明に値します遅い日付。

  1. ブラウザを開いて、たとえばgoogle.comなどのWebサイトを表示します。Webサイトを指定する過程で、コンピュータは「送信元ポート」として使用するポート番号を任意に選択します。この番号は、「ダイナミック、プライベート、またはエフェメラルポート」の先頭である49152を上回りますが、使用可能な最大のポート番号である65535を下回ります。選択したポート番号は、そのブラウザの「インスタンス」に関連付けられています。

  2. 楽しみのために、ブラウザで新しいタブを開き、URL行に「google.com」と入力します。あなたの目標は、あなたが異なるものを探しているので、google.comの2つのインスタンスを実行させることです。次に、コンピュータは、最初のセッションで使用した「送信元」ポートとは異なる、そのセッションの2番目のポート番号を選択します。実際、これを何度も行うことができ、各セッションには、各インスタンスに関連付けられた一意の「ソース」ポートがあります。

  3. パケットはgoogle.comに送信され、すべてのインスタンスの宛先ポート番号はポート80になります。Webサーバーは着信接続要求をポート80で「リッスン」します。開いたgoogle.comとのセッションごとに、コンピュータの観点から見ると、宛先ポートは常にポート80になりますが、1つまたは複数のブラウザでのgoogle.comへの接続のインスタンスごとに、送信元ポートは一意になります1つのブラウザインスタンスで1つの特定のタブを一意に識別します。これは、それらがコンピュータ上でどのように区別されるかです。

  4. google.comが最初のリクエストを取得します。その応答は、送信元ポートとしてポート80を指定します。ここが面白いところです。google.comから受け取った各クエリは、IPアドレスと、google.comに接続したプロセスに関連付けられた特定のポート番号の組み合わせである「ソケット」として扱われます。したがって、たとえば、IPアドレスは165.40.30.12であり、コンピュータがgoogle.comとの通信の4つのインスタンス(たとえば、すべてgoogle.comを開く4つの異なるタブ)の送信元ポートとして使用した送信元ポート番号は61235、62421、58392、および53925。これらの4つの「ソケット」は、165.40.30.12:61235、165.40.30.12:62421、165.40.30.12:58392、および165.40.30.12:53925になります。「IPアドレス:送信元ポート番号」の組み合わせはそれぞれ一意であり、グーグルです。comは、各インスタンスを一意として扱います。google.comは、「ソケット」、つまりIPアドレスとポートの組み合わせに応答して通信します。

  5. コンピュータはgoogle.comから応答を取得し、宛先の「ソケット」として受信したもので並べ替え、ポート番号で解析し、必要に応じてgoogle.comからの応答を適切なブラウザウィンドウまたはタブに割り当てます。毎回正しいウィンドウに正しい応答が表示されるので、問題はありません。

  6. 「しかし、他の誰かが誤って同じポート番号(たとえば、61235)をソース番号に使用したのと同じように使用した場合はどうなりますか?これはgoogle.comを混乱させませんか?」google.comはIPアドレスとポート番号の組み合わせである「ソケット」を追跡しているため、まったくそうではありません。他の誰かが、当然、そして私たちは心から願っていますが、あなたが使用しているものとは異なるIPアドレス、たとえば152.126.11.27を使用しており、IPアドレスとポート番号の組み合わせは一意です-152.126.11.27:61235-によって区別されますポート番号が同じであっても、それらの異なるIPアドレス。

  7. google.comが1000人のユーザーから1000個のクエリを取得するかどうかは関係ありません。すべて、宛先ポート番号としてポート80を使用します(ポートgoogle.comは着信通信をリッスンします)。これらの1000人のユーザーはすべて一意のIPアドレスを持っているためです。 。google.comは、クライアントを一意で追跡します。クライアントは常に一意である必要がありますね。-IPアドレスと「送信元」ポート番号で構成されるソケット番号。それらの1000のクライアントのすべてがなんとかして同じ「ソース」ポート番号を使用することに成功したとしても(最大になる可能性は低い)、それらは依然として異なるIPアドレスを持ち、ソース「ソケット」を他のすべての中で一意にします。

  8. このように説明されているのを見ると、これはすべてかなり単純です。これにより、Webサーバーは常に1つのポート(80)でリッスンし、さまざまなクライアントと区別できることが明確になります。クエリで受け取ったIPアドレスを確認するだけでなく、そのWebサーバーで複数のWebページを開くことができることに気付くまで、最初はすべて一意である必要があると思いますが、送信元ポートで確認します。番号。これらを組み合わせることで、すべてのクエリが一意になります。これがかなり明確であることを願っています。考えてみるとエレガントなシステムですが、理解すればシンプルです。

于 2015-03-14T04:22:29.253 に答える
10

順番に質問をします:

接続は次のように定義されます。

{プロトコル、ローカルIP、ローカルポート、リモートIP、リモートポート}

(送信時にはローカルポートが送信元であり、受信時には宛先であるため、送信元と宛先ではなく、ローカルとリモートと言う方が適切です。)

sockidは、ファイル記述子が開かれたディスク上のファイルにマップされるのと同じように、カーネルの接続にマップされるユーザープロセスの単なる記述子です。

2つの異なるプロセスが同じローカルポートにバインドすることはできません。ただし、2つのプロセスが同じ接続を使用することは可能です。ソケット記述子を親プロセスから子プロセスに継承することも、プロセス間通信を使用してプロセス間で記述子を渡すこともできます。2つのプロセスは、実際には同じ接続を共有しているため、同じポートを使用します。

プロトコルは、異なるリモートサーバーまたはポートに接続するときに同じローカルポートの使用を許可しますが、ほとんどのTCPスタックはこれを許可しません。ローカルポートをバインドするためのAPIは、発信接続に使用する場合でも着信接続をリッスンする場合でも同じであり、ポートがバインドされるまで意図は指定されません。特定のポートでリッスンできるソケットは1つだけなので、APIは、複数のソケットがポートにバインドすることを許可しません(これには特別な例外がありますが、この説明には関係ありません)。その結果、すべての発信接続は異なるローカルポートを使用します。したがって、ブラウザが(同じまたは異なるWebサーバーへの)複数の接続を開くと、それらは異なるローカルポートを持ちます。

于 2012-11-02T06:59:51.117 に答える
-2

私はそれぞれのフォーラムで上記の質問を読みましたが、そこの人々もお互いに同意していないと思います。

あなたがおっしゃったことに関して、私はそれらのいずれにも意見の相違は見られません。

ソケット接続を正確に定義するものを知りたい

(sockid、source ip、source port、dext ip、dest port)

またはのみ

(ソースIP、ソースポート、dext ip、destポート)

後者。前者は想像力の産物です。あなたが引用するスレッドのいずれにも言及されていません。

私が聞きたいのは、2つの異なるブラウザのような2つの異なるプロセスが、同じ送信元ポートでWebサーバーと通信できることです(宛先ポートはデフォルトで同じです)。

それらが同じソースIPにある場合は違います。上記のID定義に違反します。

同じブラウザの異なるタブの場合はどうなりますか。

はい、接続プールのためです。あなたが別々の接続について話しているなら、答えはまだノーです。

また、回答の1つで述べたように、単一のWebページが広告サーバーなどの多くの異なるサーバーに接続しようとします。ChromeやFirefoxも、同じポートで異なるサーバーに接続するか、単一のポートを使用します。

これを説明する必要があります。「同じポート」と「単一ポート」の違いは何ですか?本当の質問ではありません。

于 2012-11-02T09:30:21.317 に答える