Verwenden Webbrowser unterschiedliche ausgehende Ports für unterschiedliche Registerkarten?

58

Verwenden in einem Webbrowser, der mehrere Registerkarten unterstützt, wie z. B. Firefox, verschiedene Registerkarten, die zu verschiedenen Website-Domänen gehören, für jede Domäne einen eigenen Port ?.

Oder verwendet der Browser einen einzigen Port für die Verwaltung aller Registerkarten und damit aller Domänen?

yoyo_fun
quelle
Browser verwenden beim Herstellen einer Verbindung zu Websites zwei Ports, 80 für http-Verbindungen und 443 für https-Verbindungen. en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
Moab
7
Ich kenne die für die Verbindung zum Server verwendeten Ports, habe mich aber über die Portnummern gewundert, die für die Verbindung vom Client (Host-Computer) verwendet wurden.
yoyo_fun
2
Ich denke, dass der Begriff "ausgehende Ports" ungenau ist. Ports sind bidirektional. Vielleicht könntest du sagen. stattdessen "lokale Ports". Die lokalen Ports werden als Quellports (ausgehende Ports) zum Senden von Anforderungen und als Zielports (eingehende Ports) zum Empfangen von Antworten verwendet.
Ron Maupin
6
Ports werden vom Betriebssystem zugewiesen, und jeder neuen Verbindung wird ein neuer lokaler Port zugewiesen, um sie von allen anderen offenen Verbindungen zu unterscheiden.
Ex Umbris
1
@ExUmbris: Das mag eine vernünftige und einfache Strategie sein, aber TCP-Verbindungen werden durch das Vierfach {lokale IP, lokaler Port, entfernte IP, entfernter Port} identifiziert. Lokaler Port ist für die Eindeutigkeit nicht erforderlich, was gut ist: Der Webserver kann seinen lokalen Port überhaupt nicht für die Eindeutigkeit verwenden. Aus Sicht des Webservers ist die Remote-IP-Adresse auch nicht eindeutig, da sich möglicherweise mehrere Benutzer hinter einem einzelnen Gateway / Proxy befinden.
MSalters

Antworten:

55

Verwenden Browser unterschiedliche Ports, um eine Verbindung zu unterschiedlichen Websites herzustellen?

Ja, das tun sie.

Hier ist ein Beispiel, das meine aktuellen Firefox-Verbindungen (ich habe 9 offene Tabs) unter Windows 7 zeigt:

Bildbeschreibung hier eingeben

Anmerkungen:

  • Sie können sehen, dass die lokalen Ports alle unterschiedlich sind.

  • Die Remote-Ports sind normalerweise 80 (HTTP), 443 (HTTPS) oder 8080 (HTTP Alternate).

  • Der vollständige Prozess zum Rendern einer Webseite wird nachfolgend beschrieben. Siehe insbesondere die Schritte 5, 6, 13 und 15 (fett gedruckt):

    • Im Allgemeinen werden für das Rendern einer einzelnen Webseite mehrere Verbindungen verwendet, von denen sich nicht alle auf dieselbe Remoteadresse beziehen.

    • Dies liegt daran, dass Webseiten häufig Ressourcen enthalten, die an anderer Stelle gehostet werden (Javascript-Dateien usw.).

  • Mehrere Verbindungen zu derselben Website (z. B. stackoverflow.com) weisen auch unterschiedliche lokale Ports auf (da es sich um separate Verbindungen in verschiedenen Registerkarten handelt, die unterschiedliche Seiten darstellen).


Eine Webseite rendern - Schritt für Schritt

Hinweis:

  • Die fettgedruckten Schritte 5, 6, 13 und 15 sind für die Frage direkt relevant.

Haben Sie jemals darüber nachgedacht, was passiert, wenn Sie im Internet surfen? Es ist nicht so einfach, wie es scheint:

  1. Sie geben eine URL in die Adressleiste Ihres bevorzugten Browsers ein.
  2. Der Browser analysiert die URL, um das Protokoll, den Host, den Port und den Pfad zu finden.
  3. Es bildet eine HTTP-Anfrage (das war höchstwahrscheinlich das Protokoll)
  4. Um den Host zu erreichen, muss er zuerst den von Menschen lesbaren Host in eine IP-Nummer umwandeln, und dies erfolgt durch eine DNS-Suche auf dem Host
  5. Dann muss auf dem angegebenen Port ein Socket vom Computer des Benutzers zu dieser IP-Nummer geöffnet werden (am häufigsten Port 80).
  6. Wenn eine Verbindung geöffnet ist, wird die HTTP-Anforderung an den Host gesendet
  7. Der Host leitet die Anforderung an die Serversoftware (meistens Apache) weiter, die so konfiguriert ist, dass sie den angegebenen Port überwacht
  8. Der Server prüft die Anforderung (meist nur den Pfad) und startet das zur Verarbeitung der Anforderung erforderliche Server-Plugin (entsprechend der von Ihnen verwendeten Serversprache, PHP, Java, .NET, Python?).
  9. Das Plugin erhält Zugriff auf die vollständige Anforderung und beginnt mit der Vorbereitung einer HTTP-Antwort.
  10. Um die Antwort zu konstruieren, wird (höchstwahrscheinlich) auf eine Datenbank zugegriffen. Eine Datenbanksuche wird basierend auf Parametern im Pfad (oder in den Daten) der Anforderung durchgeführt
  11. Daten aus der Datenbank werden zusammen mit anderen Informationen, die das Plugin hinzufügen möchte, zu einer langen Textfolge (wahrscheinlich HTML) zusammengefasst.
  12. Das Plugin kombiniert diese Daten mit einigen Metadaten (in Form von HTTP-Headern) und sendet die HTTP-Antwort zurück an den Browser.
  13. Der Browser empfängt die Antwort und analysiert den HTML-Code (der mit einer Wahrscheinlichkeit von 95% fehlerhaft ist) in der Antwort
  14. Ein DOM-Baum wird aus dem fehlerhaften HTML-Code erstellt
  15. Für jede neue Ressource, die in der HTML-Quelle gefunden wird (normalerweise Bilder, Stylesheets und JavaScript-Dateien), werden neue Anforderungen an den Server gestellt. Kehren Sie zu Schritt 3 zurück und wiederholen Sie diesen Vorgang für jede Ressource.
  16. Stylesheets werden analysiert und die Rendering-Informationen in jedem werden an den entsprechenden Knoten in der DOM-Struktur angehängt
  17. Javascript wird analysiert und ausgeführt, und DOM-Knoten werden verschoben und die Stilinformationen werden entsprechend aktualisiert
  18. Der Browser rendert die Seite auf dem Bildschirm entsprechend dem DOM-Baum und den Stilinformationen für jeden Knoten
  19. Sie sehen die Seite auf dem Bildschirm
  20. Sie ärgern sich, dass der gesamte Prozess zu langsam war.

Quelle Eine Webseite rendern - Schritt für Schritt

DavidPostill
quelle
63

Jede Verbindung zu einer Website verwendet einen anderen Socket mit dem Standardziel-TCP-Port 80 für einfaches HTTP und 443 für HTTPS. Damit der Socket eindeutig ist, muss die Kombination aus Quell-IP-Adresse, Quell-TCP-Port, Ziel-IP-Adresse und Ziel-TCP-Port unterschiedlich sein.

Wenn Sie mehrere Verbindungen zu derselben Website haben (vorausgesetzt, die Website verwendet nur 1 IP-Adresse), muss ein anderer Quell-TCP-Port verwendet werden. Auf diese Weise ist jede Verbindung einzigartig.

Es ist jedoch zu beachten, dass ab HTTP 1.1 alle Verbindungen für einen bestimmten Zeitraum bestehen bleiben (sofern nicht anders angegeben). Dies bedeutet, dass dieselbe Verbindung von Ihrem Browser wieder verwendet werden kann, wenn mehrere Ressourcen von derselben Website angefordert werden (z. B. CSS / JS-Dateien). Dies gilt auch, wenn Sie mehrere Instanzen derselben Website in Ihrem Browser haben.

Unter Windows zeigt der netstat -no -p TCPBefehl alle aktiven TCP-Sockets und ihre entsprechende Prozess-ID an, einschließlich der Ihres Browsers:

Bildbeschreibung hier eingeben

Wenn Sie unter Unix / Linux (in diesem Fall Debian) arbeiten, können Sie den Befehl netstat -ntpoder verwenden ss -t:

Bildbeschreibung hier eingeben

Egon Olieux
quelle
4
Beachten Sie, dass netstat auch Verbindungen ohne Browser anzeigt, z. B. E-Mail-Verbindungen für einen E-Mail-Client oder Nachrichtenverbindungen für einen Nachrichtenleser. Diese Verbindungen werden an verschiedenen Remote-Ports hergestellt.
DavidPostill
Es scheint, als würden Sie davon ausgehen, dass der Fragesteller Windows verwendet, obwohl er kein Betriebssystem erwähnt hat, es sei denn, mir fehlt etwas. Sie können auch angeben, auf welches Betriebssystem Sie sich beziehen, wenn Sie Konsolenbefehle eingeben.
user45623
9
@ user45623: Obwohl der Screenshot ein Windows-Screenshot ist, netstat -nsollte er unter den meisten Betriebssystemen funktionieren, einschließlich Linux und Mac OS.
Heinzi
1
Unter Windows (möglicherweise auch unter anderen Betriebssystemen) können Sie netstat -n -osehen, welcher Prozess welche Verbindung hergestellt hat. Oder Sie können SysInternals tcpview ausführen , um die Liste in einer GUI mit Prozessnamen und -symbolen und allem zu sehen.
Jonathan
Die Frage ist nun, ob Webbrowser Verbindungen von verschiedenen Registerkarten wiederverwenden, wenn sie zu demselben Server führen.
John Dvorak
11

In Bezug auf Tabs zu verschiedenen Websites gibt es in TCP nichts, was einen anderen lokalen Port erfordert, solange das Tupel {lokale IP, lokaler Port, Ziel-IP, Ziel-Port} eindeutig ist. Bei Tabs auf derselben Website ist die Situation viel komplexer.

Der Browser verwendet wie jede andere Client-Software einen anderen lokalen Port für jede ausgehende Verbindung zum gleichen Ziel. Im Allgemeinen werden mehrere Verbindungen zu einer bestimmten Website hergestellt, um eingebettete Ressourcen wie Bilder, CSS, JavaScript usw. abzurufen. Außerdem werden diese Verbindungen für eine mögliche Wiederverwendung zusammengefasst.

Es ist nicht möglich zu sagen, ob verschiedene Tabs auf derselben Website unterschiedliche Verbindungen verwenden, da (a) in der Regel ohnehin keine einzige Verbindung pro Tab vorhanden ist und (b) je nach Zeitpunkt und Authentifizierung möglicherweise Verbindungen bestehen zwischen Tabs wiederverwendet; und da es nicht möglich ist, die Verbindungen zu identifizieren, ist es auch nicht möglich, die lokalen Ports zu identifizieren.

user207421
quelle
Vielen Dank. Was bedeutet "Zusammenlegen" einer Verbindung?
yoyo_fun
Anstatt es zu schließen, geben Sie es in einen Pool zurück und schließen Sie es nur, wenn es für einige Zeit im Leerlauf bleibt. und zuerst in den Pool schauen, bevor eine neue Verbindung zu diesem Ziel hergestellt wird. So wird HTTP Keep-Alive implementiert.
user207421
Ein Pool ist also eine Datenstruktur im Speicher, die geöffnete und noch nicht geschlossene Verbindungen speichert?
yoyo_fun
Das ist richtig, normalerweise eine Karte, die mit der Ziel-IP: port codiert ist.
user207421
2
@EJP: Beachten Sie, dass es für HTTPS nicht sicher ist, die Karte nach Ziel-IP und -Port zu verschlüsseln. Sie müssen auch zwischen Verbindungen zu verschiedenen Hostnamen unterscheiden , obwohl diese zufällig in dieselbe IP und denselben Port aufgelöst werden. Wohl auch ein Browser soll Verbindungen halten für verschiedene Registerkarten trennen , wenn zumindest eine Lasche im Inkognito - Modus ist.
Henning Makholm
6

Ja. Nein, vielleicht. Es hängt davon ab, ob.

Erstens kann ein Browser eine der folgenden Strategien für Verbindungen verwenden:

  1. Einzelverbindung (unwahrscheinlich für einen Browser, der jünger als 1995 ist)
  2. Eine Verbindung pro Tab (im Grunde dasselbe wie # 1, nur etwas besser)
  3. Eine Verbindung pro Ressource (naiv, funktioniert aber nicht so schlecht)
  4. Pool von Verbindungen mit Keep-Alive-Verbindungen, die wiederverwendet werden
  5. Etwas anderes (gelesen als: seltsames Zeug)

Sie haben keine Möglichkeit zu wissen, welche Strategie ein Browser verwendet, obwohl die Verwendung eines Pools von Verbindungen (und die Wiederverwendung von Verbindungen) eine vernünftige Annahme ist.

Zweitens haben Sie, wie TCP funktioniert, für jede Verbindung einen Quell- und einen Zielport. Das Paar aus Quell- und Zieladresse / Port definiert die Verbindung.
Sie verwenden immer [1] einen bekannten Port (z. B. 80 oder 443), um eine Verbindung zum Server herzustellen (auf den er die angegebene Adresse hört), der andere Port wird jedoch zufällig ausgewählt. Abhängig davon, von welcher Seite Sie eine Verbindung betrachten, verfügt sie über einen oder mehrere mögliche Ports.

So das gleiche kann Register (und in der Regel) mehr verschiedenen Ports an seinem Ende verwenden, aber grundsätzlich verschiedene Registerkarten könnte (wenn Verbindungen zusammengefasst werden und verschiedene Ressourcen in verschiedenen Tabs aus dem gleichen Server geladen) verwendet den gleichen Anschluss.

Da in der Frage ausdrücklich auf ausgehende Verbindungen hingewiesen wird, stimmen die Portnummern im "normalen" Fall unabhängig davon, auf welcher Registerkarte sie sich befinden, oder mit einem von zwei möglichen Ports (80 und 443) überein. Obwohl es natürlich möglich ist, explizit nach einem anderen Port (wie 8080) in einer URL zu fragen. Das ist allerdings eher selten.


[1] Nun, nicht immer ... aber machen wir es nicht zu kompliziert.

Damon
quelle
Ein weiterer Faktor ... Der clientseitige Port wird normalerweise vom Betriebssystem und nicht vom Browser ausgewählt. und der clientseitige Port, den der Server sieht, unterscheidet sich möglicherweise von dem, was der Browser sieht, wenn die Verbindung über ein NAT-Gerät hergestellt wird. Die meisten Betriebssysteme weisen die Zuordnung entweder linear oder zufällig innerhalb eines (konfigurierbaren) kurzlebigen Portbereichs zu. Ein Browser kann jedoch denselben Quellport über mehrere Verbindungen zu verschiedenen Servern anfordern. (Und das OP fragt nach Client-Ports, nicht nach Server-Ports.)
David
@david: Es ist schwer zu sagen, welches richtig ist (oder was zu beantworten ist), da das Q ein bisschen mehrdeutig ist, daher mein etwas langwieriger Cover-All-Ausflug. Das OP fragt nach dem ausgehenden Port auf dem Client. "Client" deutet an, dass es sich um den Quellport handelt (in TCP-Begriffen), der frei oder zufällig ausgewählt wurde (von der Implementierung), "ausgehend" bedeutet jedoch, dass es sich tatsächlich um den Zielport handelt, über den wir sprechen. Welches ist viel besser als "Port auf Server" in Laien Worten beschrieben. Ihr Kommentar zu NAT ist vom Server aus korrekt, hat jedoch keine Auswirkungen auf den Client.
Damon