Webブラウザはタブごとに異なる発信ポートを使用しますか?


58

Firefoxなどの複数のタブの使用をサポートするWebブラウザーでは、異なるWebサイトドメインに移動する異なるタブは、各ドメイン専用のポートを使用しますか?

または、ブラウザはすべてのタブ、したがってすべてのドメインを管理するために単一のポートを使用しますか?


ブラウザは、Webサイトへの接続時に2つのポートを使用します。80はhttp接続用、443はhttps接続用です。 en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
モアブ

7
サーバーへの接続に使用されるポートは知っていますが、クライアント(ホストコンピューター)からの接続に使用されるポート番号については疑問でした。
yoyo_fun

2
「発信ポート」という用語は不正確だと思います。ポートは双方向です。たぶんあなたは言うことができます。代わりに「ローカルポート」。ローカルポートは、要求を送信するための送信元(発信)ポート、および応答を受信するための宛先(着信)ポートとして使用されます。
ロンモーピン

6
ポートはOSによって割り当てられ、新しい接続ごとに新しいローカルポートが割り当てられ、開いている他のすべての接続と区別されます。
元Umbris

1
@ExUmbris:それは賢明で単純な戦略かもしれませんが、TCP接続はクワッド{ローカルIP、ローカルポート、リモートIP、リモートポート}によって識別されます。ローカルポートは一意性のために必要ではありません。これは良いことです。Webサーバーは一意性のためにローカルポートをまったく使用できません。また、ウェブサーバーの観点から見ると、複数のユーザーが単一のゲートウェイ/プロキシの背後にいる可能性があるため、リモートIPも一意ではありません。
-MSalters

回答:


55

ブラウザは異なるポートを使用して異なるWebサイトに接続しますか?

はい、彼らがやります。

Windows 7での現在のFirefox接続(9つの開いているタブがあります)を示す例を次に示します。

ここに画像の説明を入力してください

ノート:

  • ローカルポートがすべて異なっていることがわかります。

  • 通常、リモートポートは80(HTTP)、443(HTTPS)、または8080(HTTP Alternate)です。

  • Webページをレンダリングする完全なプロセスを以下に説明します。特にステップ5、6、13、および15(太字)を参照してください。

    • 一般に、単一のWebページのレンダリングでは複数の接続が使用されますが、そのすべてが同じリモートアドレスに接続されるわけではありません。

    • これは、Webページに他の場所でホストされているリソース(javascriptファイルなど)が含まれていることが多いためです。

  • 同じ Webサイト(stackoverflow.comなど)への複数の接続にも、異なるローカルポートがあります(異なるページでレンダリングされる異なるタブの個別の接続であるため)。


Webページのレンダリング-ステップバイステップ

注意:

  • 手順5、6、13、および15(太字)は、質問に直接関連しています。

Webサーフィンをするとどうなるか考えたことはありますか?見た目ほど簡単ではありません。

  1. 好みのブラウザのアドレスバーにURLを入力します。
  2. ブラウザはURLを解析して、プロトコル、ホスト、ポート、およびパスを見つけます。
  3. HTTPリクエストを形成します(ほとんどの場合プロトコル)
  4. ホストに到達するには、最初に人間が読めるホストをIP番号に変換する必要があり、ホストでDNSルックアップを行うことでこれを行います
  5. 次に、指定されたポート(ほとんどの場合ポート80)で、ユーザーのコンピューターからそのIP番号へのソケットを開く必要があります。
  6. 接続が開かれると、HTTP要求がホストに送信されます
  7. ホストは、指定されたポートでリッスンするように構成されたサーバーソフトウェア(ほとんどの場合Apache)に要求を転送します
  8. サーバーはリクエスト(多くの場合、パスのみ)を検査し、リクエストの処理に必要なサーバープラグインを起動します(使用するサーバー言語、PHP、Java、.NET、Pythonに対応)。
  9. プラグインは完全なリクエストにアクセスし、HTTPレスポンスの準備を開始します。
  10. 応答を作成するには、データベースにアクセスします(ほとんどの場合)。要求のパス(またはデータ)のパラメーターに基づいて、データベース検索が行われます
  11. データベースからのデータは、プラグインが追加することを決定した他の情報とともに、長いテキスト文字列(おそらくHTML)に結合されます。
  12. プラグインは、そのデータをいくつかのメタデータ(HTTPヘッダーの形式)と組み合わせ、HTTP応答をブラウザーに送り返します。
  13. ブラウザーは応答を受信し、応答内のHTML(95%の確率で破損している)を解析します
  14. DOMツリーは壊れたHTMLから構築されます
  15. HTMLソースにある新しいリソース(通常、画像、スタイルシート、JavaScriptファイル)ごとにサーバーに新しいリクエストが行われます。手順3に戻り、リソースごとに繰り返します。
  16. スタイルシートが解析され、それぞれのレンダリング情報がDOMツリーの一致するノードに添付されます
  17. JavaScriptが解析および実行され、DOMノードが移動され、それに応じてスタイル情報が更新されます
  18. ブラウザは、DOMツリーと各ノードのスタイル情報に従って画面にページをレンダリングします
  19. 画面にページが表示されます
  20. プロセス全体が遅すぎることに悩まされます。

Webページのソースレンダリング-ステップバイステップ


63

Webサイトへの各接続は、プレーンHTTPの場合はデフォルトの宛先TCPポート80、HTTPSの場合は443の異なるソケットを使用します。ソケットが一意であるためには、ソースIPアドレス、ソースTCPポート、宛先IPアドレス、および宛先TCPポートの組み合わせが異なっている必要があります。

同じコンピューターから同じWebサイトに複数の接続がある場合(Webサイトが1つのIPアドレスのみを使用している場合)、異なるソースTCPポートを使用する必要があります。このように、各接続は一意です。

ただし、HTTP 1.1の時点では、すべての接続は一定期間持続していることに注意する必要があります(特に宣言されていない限り)。これは、同じWebサイトからの複数のリソース(css / jsファイルなど)が要求された場合、ブラウザーが同じ接続を再利用できることを意味します。これは、ブラウザに同じWebサイトの複数のインスタンスがある場合にも適用されます。

Windowsを使用している場合、このnetstat -no -p TCPコマンドは、すべてのアクティブなTCPソケットと、ブラウザーのものを含む対応するプロセスIDを表示します。

ここに画像の説明を入力してください

Unix / Linux(この場合はDebian)を使用しているnetstat -ntp場合は、or ss -tコマンドを使用できます。

ここに画像の説明を入力してください


4
netstatには、ブラウザ以外の接続、たとえばメールクライアントのメール接続、ニュースリーダーのニュース接続も表示されることに注意してください。これらの接続は、異なるリモートポート上にあります。
DavidPostill

何かが足りない場合を除き、質問者はWindowsを使用していると仮定しているようですが、オペレーティングシステムについては言及していません。また、コンソールコマンドを提供するたびに、参照しているOSをリストすることも良いことです。
user45623

9
@ user45623:スクリーンショットはWindowsのスクリーンショットnetstat -nですが、LinuxやMac OSを含むほとんどのオペレーティングシステムで動作するはずです。
ハインジ

1
Windows(他のOSの場合もあります)では、netstat -n -oどのプロセスがどの接続を作成したかを確認するために使用できます。または、SysInternalのtcpviewを実行して、プロセス名、アイコン、およびすべてを含むGUIのリストを表示できます。
ジョナサン

問題は、Webブラウザーが同じサーバーに接続している場合、異なるタブからの接続を再利用するかどうかです。
ジョンドヴォルザーク

11

異なるWebサイトへのタブに関して、タプル{ローカルIP、ローカルポート、ターゲットIP、ターゲットポート}が一意である限り、TCPにはローカルポートが異なることを必要とするものは何もありません。同じWebサイトへのタブの場合、状況ははるかに複雑です。

ブラウザは、他のクライアントソフトウェアと同様に、同じターゲットへの発信接続ごとに異なるローカルポートを使用します。一般に、画像、CSS、JavaScriptなどの埋め込みリソースを取得するために、任意のWebサイトへの複数の接続を形成します。また、再利用の可能性のためにそれらの接続をプールします。

同じウェブサイトの異なるタブが個別の接続を使用するかどうかを言うことはできませんなぜなら、(a)通常、タブごとに単一の接続はなく、(b)タイミングと認証に応じて、接続はタブ間で再利用。また、接続を識別することはできないため、ローカルポートを識別することもできません。


ありがとう。接続の「プーリング」とはどういう意味ですか?
yoyo_fun

それを閉じるのではなく、プールに戻し、それが一定のタイムアウト間隔の間アイドル状態のままである場合にのみ閉じます。そのターゲットへの新しい接続を作成する前に、まずプールを調べます。これがHTTPキープアライブの実装方法です。
user207421

プールは、開いた接続とまだ閉じていない接続を格納するメモリ内のデータ構造ですか?
yoyo_fun

それは正しいです。通常は、ターゲットIP:portをキーとするマップです。
user207421

2
@EJP:HTTPSの場合、ターゲットIPとポートでマップにキーを設定することは安全ではないことに注意してください。同じIPとポートに解決する場合でも、異なるホスト名への接続を区別する必要があります。おそらく、少なくとも1つのタブがシークレットモードになっている場合、ブラウザは異なるタブの接続を別々に保つ必要があります。
ヘニングマクホルム

6

はい。いいえ。場合によります。

まず、ブラウザは接続に次の戦略のいずれかを使用できます。

  1. 単一の接続(1995年以降のブラウザでは考えられない)
  2. タブごとに1つの接続(基本的に#1と同じ、ほんの少しだけ良い)
  3. リソースごとに1つの接続(単純ですが、それほど悪くは動作しません)
  4. キープアライブ、再利用接続を備えた接続のプール
  5. 異なるもの(読み方:奇妙なもの)

接続のプールを使用する(および接続を再利用する)ことは合理的な仮定ですが、ブラウザが使用する戦略を知る方法はありません。

第二に、TCPの動作方法では、すべての接続に送信元ポートと宛先ポートがあります。送信元と宛先のアドレス/ポートのペアが接続を定義します。
必ず[1]使用周知(それはそのアドバタイズアドレスにリッスンする)サーバに接続するためのポート(例えば、80又は443)が、他のポートがランダムに選択されます。したがって、接続をどちらの側から見るかに応じて、1つまたは多数の可能なポートがあります。

したがって、同じタブはその端でいくつかの異なるポートを使用する可能性があります(通常は使用します)が、原則として異なるタブ(接続がプールされ、異なるタブの異なるリソースが同じサーバーからロードされる場合)同じポートを使用する可能性があります。

質問では、「通常」の場合、明示的に発信について言及しているため、ポート番号は、どのタブにあるか、または2つの可能なポート(80および443)のいずれかに関係なく同じです。もちろん、URLで別のポート(8080など)を明示的に要求することもできます。ただし、それはまれなことです。


[1]ええと、いつもではありませ ...しかし、複雑になりすぎないようにしましょう。


もう1つの要因...クライアント側のポートは通常、ブラウザではなくOSによって選択されます。接続がNATデバイスを経由する場合、サーバーが見るクライアント側のポートは、ブラウザーが見るものと異なる場合があります。ほとんどのOSは、(設定可能な)一時ポート範囲内で線形またはランダムに割り当てますが、ブラウザー異なるサーバーへの複数の接続で同じソースポートを要求できます。(そして、OPはサーバーポートではなく、クライアントポートについて尋ねています。)
デビッド

@david:Qは少し曖昧であるため、どちらが正しいか(または何に答えるべきか)を判断するのは困難です。OPは、クライアントの発信ポートについて尋ねています。「クライアント」は、(実装によって)自由にまたはランダムに選択されたソースポート(TCPの用語)について話していることを示唆しますが、「発信」は、それが本当に話している宛先ポートであることを示唆しています。これは、素人の言葉で「サーバー上のポート」としてはるかによく説明されています。NATについてのコメントはサーバーから見ると正しいですが、クライアントには影響しません。
デイモン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.