Grundlegendes zu Ports: Wie kommunizieren mehrere Browser-Registerkarten gleichzeitig? [geschlossen]

18

Mir ist heute klar geworden, dass ich im Grunde nicht verstehe, wie Hafenkommunikation funktioniert.

Wenn ich eine Instanz eines Webservers einschalte, der auf Port 80 lauscht, kann dieser auf viele Anfragen von vielen verschiedenen Browser-Registerkarten reagieren, die alle über Port 80 kommunizieren.

Ich kann jedoch nicht zwei Instanzen des Servers starten, die beide Port 80 überwachen, da dies zu einem Portkonflikt führt.

Ich habe dies immer als gegeben angenommen (es kann immer nur ein Prozess an einen bestimmten Port gebunden werden), ohne es jemals wirklich zu überdenken. Gibt es nicht mehrere Prozesse, die über Port 80 kommunizieren? (dh, jede der Registerkarten im Browser ausgeführt?)

Marty Pitt
quelle

Antworten:

24

Grundsätzlich kann immer nur ein Prozess auf einem Port LISTEN (technisch gesehen ist ein Socket für das Abhören reserviert). Ein Port kann jedoch viele Sockets verarbeiten, die Daten übertragen. Ein Socket ist eine Kombination aus lokaler IP / Port und entfernter IP-Adresse / entferntem Port. Sobald der Server die eingehende Verbindung während des Abhörens akzeptiert, öffnet er einen neuen Socket für diese Konversation und übergibt die Verarbeitung an etwas anderes. Anschließend kehrt er zum Abhören zurück.

Mehr dazu hier .

EightBitTony
quelle
Tatsächlich können mehrere Prozesse denselben Port überwachen. Wenn Sie dies zum Beispiel mit mehreren udp-Readern tun, erhalten Sie einen Lastenausgleich auf Kernel-Ebene. Öffnen Sie zuerst die Buchse zum Abhören, dann die Gabel und versuchen Sie es recv()bei jedem Vorgang.
Viraptor
5
@viraptor: Stimmt, aber da UDP verbindungslos ist, gibt es keinen wirklichen Unterschied zwischen "Abhören" und "Empfangen".
Adam Robinson
Dieselbe Idee funktioniert mit TCP, indem der Prozess mit Listening-Socket gegabelt und () auf beiden akzeptiert wird.
Viraptor
Tatsächlich ist ein Socket nur ein "Endpunkt" für die Kommunikation. Ich denke, Sie wollten damit sagen, dass ein verbundener Socket eine Kombination aus lokaler IP / Port und entfernter IP / Adresse / entferntem Port ist. Das Wort " Socket" wird so oft verwendet, dass ich nur schwer herausfinden konnte, wie es tatsächlich heißt
westoque
14

Der Browser verbindet sich von einem zufällig hohen (dh> 1024) Port auf Ihrem Computer mit dem Port 80 eines Remote-Servers. Daher liegt kein Portkonflikt auf Ihrem Computer vor.

Wenn Sie mehrere Registerkarten verwenden, um eine Verbindung zu demselben Remote-Server herzustellen (oder wenn viele Benutzer eine Verbindung zum Server herstellen), werden alle auf denselben Port geschaltet und vom selben Prozess bedient (dh vom Webserver der Site).

Paweł Brodacki
quelle
2
Das ist die richtige Antwort. TCP-Verbindungen haben an beiden Enden eine Portnummer. Beide beteiligten Computer können zwischen der Verbindungswebsite: 80 <-> Browser: 12397 und der unterschiedlichen Verbindungswebsite: 80 <-> Browser: 22958 unterscheiden.
pjc50
7

Der an Port 80 empfangende Server MUSS nicht mehrere Prozesse abwickeln. Einfache TCP-Daemons älterer Jahre konnten jeweils nur eine Verbindung verarbeiten. Sie können dieses Verhalten emulieren, indem Sie ein Programm wie das netcatAbhören eines bestimmten Ports veranlassen und versuchen, zwei Computer damit zu verbinden. Einer steigt ein, der andere springt ohne Verbindung ab. Diese Dämonen sind größtenteils nutzlos, sodass Sie sie nie mehr sehen.

Bei so etwas wie einem Webserver wird der Port direkt abgehört. Beachten Sie, dass es sich über der Socket-Bibliothek des Betriebssystems befindet. Wenn eine neue Verbindung hergestellt wird, übergibt die Socket-Bibliothek den brandneuen Socket an die Webserver-Software. Zu diesem Zeitpunkt verfügt die Webserver-Software über einige Optionen.

Eine Möglichkeit besteht darin, dass das Socket-Objekt im selben Prozess an einen neuen Thread übergeben wird. Wann immer Kommunikation über diesen Socket stattfindet, wird dieser Thread damit umgehen. Der übergeordnete Prozess vermittelt, welche Threads zu einem bestimmten Zeitpunkt aktiv sind, was eine Menge sein kann.

Eine andere Möglichkeit besteht darin, dass ein neuer Prozess gestartet und das Socket-Objekt an den Prozess übergeben wird. Soweit ich weiß, liegt es nun am Socket-System des Betriebssystems, die Kommunikation zwischen diesen untergeordneten Prozessen und ihren Zielen zu vermitteln. Der übergeordnete Prozess hat immer noch eine gewisse Kontrolle über die Prozesse, z. B. das Beenden von blockierten Prozessen und andere prozessübergreifende Kommunikationen.

Welcher dieser Ansätze effizienter ist, hängt vom Betriebssystem ab. IIRC, Apache kann in beiden Modi ausgeführt werden.

Im Wesentlichen bietet die Socket-Bibliothek eine parallele Verarbeitungsebene für den Webserver. Es kann mehrere gleichzeitige Verbindungen verarbeiten, die aktiv Daten übertragen, und gleichzeitig neue Verbindungen akzeptieren.

Für einen Browser, der mehrere Verbindungsversuche zu einem Webserver ausführen kann, um die Ladezeiten zu verbessern, gilt Parallelität auch auf der Browserseite. Dies ist eine gute und wunderbare Sache. Der Browser verfolgt den Status der Seite beim Laden, und die mehrfachen Verbindungsversuche, die er startet, sind alle Teil des Prozesses.

sysadmin1138
quelle
+1 für so viele Arten von Recht :)
Michael Lowman
2

Es gibt zwei Arten von Stream-Sockets. Einer hat einen Platzhalter "anderes Ende", einer hat einen bestimmten Host: Port für das andere Ende.

Keine zwei Sockets können (oder sollten) die gleichen "this end" - und "other end" -Kennungen haben. Der Socket, der "abgehört" wird (der eingehende Verbindungen annimmt), hat das Platzhalterzeichen "anderes Ende", sodass immer nur einer vorhanden sein kann. Sobald die Verbindung hergestellt acceptist, wird ein Socket mit einem Host: Port-Tupel für das andere Ende zurückgegeben.

Vatine
quelle
1

Ihre Frage erinnert mich an mich selbst vor ein paar Jahren, bevor Cisco CCNA - die gleichen Zweifel hatte :)

Zunächst einmal ist das Herstellen mehrerer HTTP-Verbindungen nicht unbedingt an die Anzahl der Registerkarten gebunden, die Sie in Ihrem Browser geöffnet haben. Wenn Sie beispielsweise eine Website mit Anzeigen oder Google Analytics-Code besuchen, stellen Sie eine Verbindung zu mehreren Websites her, obwohl Sie sich nur auf einem Tab befinden.

Wenn Ihr Browser mit dem Webserver kommuniziert, ist der Zielport des an den Webserver gesendeten Verkehrs Port 80, während der Quellport eine Zufallszahl ist. Der Quellport soll dem Webserver mitteilen, über welchen Port er an Sie zurückmelden soll. Für jede über http hergestellte Verbindung ist auf Ihrem Computer ein eigener Port geöffnet. Versuchen Sie, netstat mit ein paar geöffneten Websites auszuführen, und Sie werden sofort sehen, was ich meine.

Sie werden vielleicht lachen, aber dieses Buch ist eine großartige und schnelle Möglichkeit, die Grundlagen von TCP / IP zu verstehen. Es hat mir sehr geholfen.

Amivit
quelle