Firefoxなどの複数のタブの使用をサポートするWebブラウザーでは、異なるWebサイトドメインに移動する異なるタブは、各ドメイン専用のポートを使用しますか?
または、ブラウザはすべてのタブ、したがってすべてのドメインを管理するために単一のポートを使用しますか?
Firefoxなどの複数のタブの使用をサポートするWebブラウザーでは、異なるWebサイトドメインに移動する異なるタブは、各ドメイン専用のポートを使用しますか?
または、ブラウザはすべてのタブ、したがってすべてのドメインを管理するために単一のポートを使用しますか?
回答:
はい、彼らがやります。
Windows 7での現在のFirefox接続(9つの開いているタブがあります)を示す例を次に示します。
ノート:
ローカルポートがすべて異なっていることがわかります。
通常、リモートポートは80(HTTP)、443(HTTPS)、または8080(HTTP Alternate)です。
HTTP
上のTCPとUDPのポート番号の一覧それらのいくつかのために。Webページをレンダリングする完全なプロセスを以下に説明します。特にステップ5、6、13、および15(太字)を参照してください。
一般に、単一のWebページのレンダリングでは複数の接続が使用されますが、そのすべてが同じリモートアドレスに接続されるわけではありません。
これは、Webページに他の場所でホストされているリソース(javascriptファイルなど)が含まれていることが多いためです。
同じ Webサイト(stackoverflow.comなど)への複数の接続にも、異なるローカルポートがあります(異なるページでレンダリングされる異なるタブの個別の接続であるため)。
注意:
Webサーフィンをするとどうなるか考えたことはありますか?見た目ほど簡単ではありません。
- 好みのブラウザのアドレスバーにURLを入力します。
- ブラウザはURLを解析して、プロトコル、ホスト、ポート、およびパスを見つけます。
- HTTPリクエストを形成します(ほとんどの場合プロトコル)
- ホストに到達するには、最初に人間が読めるホストをIP番号に変換する必要があり、ホストでDNSルックアップを行うことでこれを行います
- 次に、指定されたポート(ほとんどの場合ポート80)で、ユーザーのコンピューターからそのIP番号へのソケットを開く必要があります。
- 接続が開かれると、HTTP要求がホストに送信されます
- ホストは、指定されたポートでリッスンするように構成されたサーバーソフトウェア(ほとんどの場合Apache)に要求を転送します
- サーバーはリクエスト(多くの場合、パスのみ)を検査し、リクエストの処理に必要なサーバープラグインを起動します(使用するサーバー言語、PHP、Java、.NET、Pythonに対応)。
- プラグインは完全なリクエストにアクセスし、HTTPレスポンスの準備を開始します。
- 応答を作成するには、データベースにアクセスします(ほとんどの場合)。要求のパス(またはデータ)のパラメーターに基づいて、データベース検索が行われます
- データベースからのデータは、プラグインが追加することを決定した他の情報とともに、長いテキスト文字列(おそらくHTML)に結合されます。
- プラグインは、そのデータをいくつかのメタデータ(HTTPヘッダーの形式)と組み合わせ、HTTP応答をブラウザーに送り返します。
- ブラウザーは応答を受信し、応答内のHTML(95%の確率で破損している)を解析します
- DOMツリーは壊れたHTMLから構築されます
- HTMLソースにある新しいリソース(通常、画像、スタイルシート、JavaScriptファイル)ごとにサーバーに新しいリクエストが行われます。手順3に戻り、リソースごとに繰り返します。
- スタイルシートが解析され、それぞれのレンダリング情報がDOMツリーの一致するノードに添付されます
- JavaScriptが解析および実行され、DOMノードが移動され、それに応じてスタイル情報が更新されます
- ブラウザは、DOMツリーと各ノードのスタイル情報に従って画面にページをレンダリングします
- 画面にページが表示されます
- プロセス全体が遅すぎることに悩まされます。
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
コマンドを使用できます。
netstat -n
ですが、LinuxやMac OSを含むほとんどのオペレーティングシステムで動作するはずです。
netstat -n -o
どのプロセスがどの接続を作成したかを確認するために使用できます。または、SysInternalのtcpviewを実行して、プロセス名、アイコン、およびすべてを含むGUIのリストを表示できます。
異なるWebサイトへのタブに関して、タプル{ローカルIP、ローカルポート、ターゲットIP、ターゲットポート}が一意である限り、TCPにはローカルポートが異なることを必要とするものは何もありません。同じWebサイトへのタブの場合、状況ははるかに複雑です。
ブラウザは、他のクライアントソフトウェアと同様に、同じターゲットへの発信接続ごとに異なるローカルポートを使用します。一般に、画像、CSS、JavaScriptなどの埋め込みリソースを取得するために、任意のWebサイトへの複数の接続を形成します。また、再利用の可能性のためにそれらの接続をプールします。
同じウェブサイトの異なるタブが個別の接続を使用するかどうかを言うことはできません。なぜなら、(a)通常、タブごとに単一の接続はなく、(b)タイミングと認証に応じて、接続はタブ間で再利用。また、接続を識別することはできないため、ローカルポートを識別することもできません。
まず、ブラウザは接続に次の戦略のいずれかを使用できます。
接続のプールを使用する(および接続を再利用する)ことは合理的な仮定ですが、ブラウザが使用する戦略を知る方法はありません。
第二に、TCPの動作方法では、すべての接続に送信元ポートと宛先ポートがあります。送信元と宛先のアドレス/ポートのペアが接続を定義します。
必ず[1]使用周知(それはそのアドバタイズアドレスにリッスンする)サーバに接続するためのポート(例えば、80又は443)が、他のポートがランダムに選択されます。したがって、接続をどちらの側から見るかに応じて、1つまたは多数の可能なポートがあります。
したがって、同じタブはその端でいくつかの異なるポートを使用する可能性があります(通常は使用します)が、原則として異なるタブは(接続がプールされ、異なるタブの異なるリソースが同じサーバーからロードされる場合)同じポートを使用する可能性があります。
質問では、「通常」の場合、明示的に発信について言及しているため、ポート番号は、どのタブにあるか、または2つの可能なポート(80および443)のいずれかに関係なく同じです。もちろん、URLで別のポート(8080など)を明示的に要求することもできます。ただし、それはまれなことです。