Firefoxのように複数のタブを持つことをサポートしているWebブラウザでは、異なるWebサイトのドメインに行くタブは、それぞれのドメインに専用のポートを使用していますか?
それとも、ブラウザはすべてのタブ、したがってすべてのドメインを管理するために単一のポートを使用していますか?
61 yoyo_fun 2016-03-20
ブラウザは異なるポートを使って異なるウェブサイトに接続しているのでしょうか?
そうですね
ここでは、Windows 7 での私の現在の Firefox の接続(私は 9 つのタブを開いている)を示す例を示します
Notes:
ローカルのポートが全部違うのがわかります
リモートポートは通常80(HTTP)、443(HTTPS)、8080(HTTP Alternate)のいずれかです
- 他にも多くのポートがウェブサーバをホストするために使用されています。TCPとUDPのポート番号の一覧で
HTTP
を検索すると、いくつかのポートが見つかります
- 他にも多くのポートがウェブサーバをホストするために使用されています。TCPとUDPのポート番号の一覧で
ウェブページをレンダリングする完全なプロセスを以下に説明する。特にステップ5、6、13、15(太字)を参照してください
一般的に、1つのWebページをレンダリングする際には複数の接続を使用しますが、すべての接続が同じリモートアドレスになるわけではありません
これは、ウェブページには他の場所にホストされているリソース(javascriptファイルなど)が含まれていることが多いからです
同じウェブサイトへの複数の接続 (例: stackoverflow.com) もまた、異なるローカルポートを持っています (異なるページをレンダリングする別のタブで別々の接続になっているため)
Webページのレンダリング – ステップバイステップ
Note:
- ステップ5、6、13、15(太字になっている)は、質問に直接関係しています
ネットサーフィンをするとどうなるか考えたことはありますか?それは、思ったほど単純なことではありません
- お好みのブラウザでアドレスバーにURLを入力します
- ブラウザはURLを解析してプロトコル、ホスト、ポート、パスを見つけます
- それはHTTPリクエストを形成します(それは最も可能性の高いプロトコルでした)
- ホストに到達するには、まず人間が読めるホストをIP番号に変換する必要があり、ホストのDNS検索を行うことでこれを行います
- その後、ユーザのコンピュータから指定されたポート(多くの場合は80番ポート)のIP番号にソケットを開く必要があります
- 接続がオープンになると、HTTPリクエストがホストに送信されます
- ホストは指定されたポートを listen するように設定されたサーバソフトウェア (多くの場合 Apache) にリクエストを転送します
- サーバはリクエストを検査し (ほとんどの場合はパスのみ)、リクエストを処理するために必要なサーバプラグインを起動します (使用しているサーバの言語に対応しています、PHP、Java、.NET、Python?)
- プラグインは完全なリクエストへのアクセスを取得し、HTTPレスポンスの準備を開始します
- レスポンスを構築するために、データベースに(ほとんどの場合)アクセスされる。リクエストのパス(またはデータ)のパラメータに基づいて、データベースの検索が行われます
- データベースからのデータは、プラグインが追加することにした他の情報と一緒に、長いテキストの文字列(おそらくHTML)に結合されます
- このプラグインは、そのデータといくつかのメタデータ (HTTP ヘッダの形で) を組み合わせて、HTTP レスポンスをブラウザに送り返します
- ブラウザはレスポンスを受信して、レスポンスの中のHTML(95%の確率で壊れている)を解析します
- 壊れたHTMLからDOMツリーを構築しています
- 新しいリクエストは、HTMLソースにある新しいリソース(通常は画像、スタイルシート、JavaScriptファイル)ごとにサーバーに行われます。ステップ 3 に戻って、各リソースについて繰り返します
- スタイルシートが解析され、それぞれのレンダリング情報が DOM ツリーのマッチするノードにアタッチされます
- Javascriptが解析・実行され、DOMノードが移動し、それに応じてスタイル情報が更新されます
- ブラウザは、DOMツリーと各ノードのスタイル情報に従って、画面上のページをレンダリングします
- 画面にページが表示されています
- 全体の流れが遅すぎてイライラするんだよね
ソース Webページをレンダリングする – ステップバイステップ
56 DavidPostill 2016-03-20
Web サイトへの各接続は、デフォルトの宛先 TCP ポートがプレーン HTTP の場合は 80、HTTPS の場合は 443 で、異なるソケットを使用します。ソケットを一意にするには、送信元 IP アドレス、送信元 TCP ポート、送信先 IP アドレス、送信先 TCP ポートの組み合わせが異なる必要があります
同じコンピュータから同じウェブサイトに複数の接続がある場合(ウェブサイトが1つのIPアドレスしか使用していないと仮定して)、異なるソースのTCPポートを使用する必要があります。この方法では、各接続は一意になります
しかし、HTTP 1.1 の時点では、すべての接続は一定期間持続することに注意する必要があります (特に宣言されていない限り)。これは、同じウェブサイトから複数のリソース (例: css/js ファイル) が要求された場合に、ブラウザで同じ接続を再利用できることを意味します。これは、ブラウザで同じウェブサイトの複数のインスタンスを使用している場合にも適用されます
Windows を使用している場合、netstat -no -p TCP
コマンドを実行すると、すべてのアクティブな TCP ソケットとそれに対応するプロセス ID (ブラウザのものも含む) が表示されます
Unix/Linux (ここでは Debian) の場合、netstat -ntp
または ss -t
コマンドを使うことができます
64 Egon Olieux 2016-03-20
異なる Web サイトへのタブに関しては、TCP では {local IP, local port, target IP, target port} のタプルが一意である限り、ローカルポートが異なることを要求するものは何もありません。同じウェブサイトへのタブの場合は、状況はもっと複雑になります
ブラウザは、他のクライアントソフトウェアと同様に、同じターゲットへの発信接続ごとに異なるローカルポートを使用します。一般的には、画像、CSS、JavaScriptなどの埋め込みリソースを取得するために、任意のウェブサイトへの複数の接続を形成します。また、再利用が可能なように、これらの接続をプールします
なぜなら、(a) 通常はタブごとに単一の接続があるわけではなく、(b) タイミングや認証によってはタブ間で接続が再利用されることがあり、接続を識別することができないため、ローカルポートを識別することもできません
11 Marquis of Lorne 2016-03-20
そうだないや、たぶん。場合による
まず、ブラウザは接続のためにこれらの戦略のいずれかを使用することができます
- 単一の接続(1995年よりも最近のブラウザの可能性は低い)
- タブごとに1つの接続(基本的には#1と同じ
- リソースごとに1つの接続(ナイーブだが、あまりうまくいかない)
- 接続を再利用したキープアライブによる接続のプール
- 何か違うもの(読み方:変なもの)
接続のプールを使用する(接続を再利用する)ことは合理的な前提ですが、ブラウザがどのような戦略を使用するかを知る方法はありません
次に、TCP の動作方法ですが、接続ごとに送信元ポートと送信先ポートがあります。送信元と送信先のアドレス/ポートのペアが接続を定義します。 サーバに接続するためには、常によく知られたポート(80や443など)を使用しますが、もう一方のポートはランダムに選ばれます。このように、接続をどちらの側から見るかによって、1つの可能なポートを持つか、多くの可能なポートを持つかのどちらかになります
このように、同じタブでも(通常は)複数の異なるポートを使用することがありますが、原則として、異なるタブでは(接続がプールされていて、異なるタブの異なるリソースが同じサーバーから読み込まれている場合)同じポートを使用することがあります
質問では送信について明示的に言及しているので、「通常」の場合、ポート番号はどのタブにあるか、または2つの可能性のあるポート(80と443)のうちの1つであるかにかかわらず、同じになります。もちろん、URL に別のポート (8080 など) を明示的に指定することは可能ですが。しかし、それはちょっと珍しいことです
[1] まあ、必ずしもそうとは限りませんが…あまり複雑にしないようにしましょう
6 Damon 2016-03-21