2009-07-20 3 views
12

Angenommen, zwei Webbrowser laufen auf demselben Computer und greifen auf dieselbe Website zu (mit anderen Worten, auf dieselbe IP-Adresse am selben Port zuzugreifen).Wie unterscheidet der TCP/IP-Stack eines Systems zwischen mehreren Programmen, die sich mit derselben Adresse und demselben Port verbinden?

Wie erkennt das Betriebssystem, welche Pakete von welchem ​​Programm stammen?

Hat jedes Programm ein eindeutiges ID-Feld im TCP-Header? Wenn ja, wie heißt das Feld?

+17

Leute, komm schon. Nur weil es um ein Netzwerkprotokoll geht, heißt das nicht, dass es auf Serverfault gehört! –

+1

Ja, es ist ziemlich viel. – Will

+0

Wahrscheinlicher ist superuser.com, in meinen Gedanken ... –

Antwort

35

Die beiden Programme greifen nicht auf den "gleichen Port" zu. Zu Zwecken von TCP wird eine Verbindung durch das Tupel (src_ip, src_port, dst_ip, dst_port) definiert.

Der Quellport ist normalerweise kurzlebig, dh er wird vom Betriebssystem zufällig zugewiesen. Mit anderen Worten:

Programm A wird:

(my_ip, 10000, your_ip, 80)

Programm B haben:

(my_ip, 10001, your_ip, 80)

So kann das OS sehen, dass die verschiedenen "Verbindungen" sind und die Pakete zu den richtigen Socket-Objekten schieben können.

+0

die richtige Antwort –

+0

Es ist auch erwähnenswert, dass wenn Sie Socket-Operationen während der Entwicklung durchführen (sagen wir, eine Socket-Verbindung in Java zu öffnen), der Quellport automatisch vom System zugewiesen wird. –

+1

Ich habe erwähnt, dass: "Der Quellport ist in der Regel kurzlebig, was bedeutet, dass es zufällig von der OS zugewiesen wird" :-) – Christopher

0
+0

-1? "Ja wirklich?" Was, ich liege falsch? – Will

+0

Warum wurde das abgelehnt? Es ist etwas im Detail, aber es ist nicht falsch und der Link zu Wikipedia wäre nützlich, wenn es nicht eine ziemlich verwirrende Wikipedia-Seite –

+0

Hurf wäre. – Will

4

Die Quellportnummer ist unterschiedlich, auch wenn die Zielportnummer gleich ist. Der Kernel ordnet die Quellportnummer dem Prozess zu.

3

Wenn der Client eine Verbindung zum Ziel öffnet Port 80, verwendet er eine beliebige nicht verwendete Quelle Port auf dem lokalen Rechner, sagen 17824. Der Web-Server antwortet dann auf dem Client, indem er Pakete an den Zielport 17824 senden.

Ein zweiter Client verwendet eine zweite unbenutzte Portnummer, z. B. 17825, sodass die Pakete der beiden Sockets nicht verwechselt werden, da sie auf dem Clientcomputer unterschiedliche Portnummern verwenden.

+1

Nur um zu bemerken, dass es keinen ephemeren Quellport verwenden muss. Es kann angefordert werden, einen bestimmten Sorce-Port zu binden. –

2

Christophers Antwort ist teilweise richtig.

Die Programme A und B haben tatsächlich ein Handle zu einem Socket-Deskriptor, der in der Socket-Implementierung des zugrunde liegenden Betriebssystems gespeichert ist. Pakete werden an diesen zugrundeliegenden Socket geliefert, und dann kann jeder Prozess, der einen Handle zu dieser Socket-Ressource hat, diesen lesen oder schreiben.

Nehmen wir an, Sie schreiben einen einfachen Server auf einem Unix-ähnlichen Betriebssystem wie Linux oder Mac OSX.

Der Server akzeptiert eine Verbindung, bei dem eine Verbindung, die aus Punkt

(src IP, src Port, dest IP, dest Port) 

kommt in der Existenz in der darunterliegenden OS socket layer. Dann verzweigen Sie einen Prozess, um die Verbindung zu handhaben - an diesem Punkt haben Sie jetzt zwei Prozesse mit Handles zum Sockel, die beide lesen/schreiben können.

Normalerweise (immer) wird der ursprüngliche Server sein Handle zum Socket schließen und den gegabelten Prozess damit umgehen lassen.Es gibt viele Gründe dafür, aber derjenige, der für Leute nicht immer offensichtlich ist, ist, dass, wenn der Kindprozess seine Arbeit beendet und den Socket schließt, der Socket offen bleibt und verbunden wird, wenn der Elternprozess noch einen offenen Handle dafür hat.

+0

Ich denke, dass einige moderne serverseitige Programme 'fork' und' exec' für jede eingehende Verbindung sind. Ein einzelner Thread kann viele gleichzeitige Verbindungen verarbeiten und ist viel effizienter. Dieser Kommentar beschreibt eine bestimmte Methode der Implementierung. – lavinio

+2

Eigentlich versucht dieser Kommentar das Missverständnis zu klären, dass der Socket ausschließlich zu einem Prozess gehört und dass das OS Pakete an einen bestimmten Prozess "liefert". Der Socket gehört zum Betriebssystem und der Prozess hat Zugriff auf die zugrunde liegende Betriebssystemressource. –

+1

@lavinio Deshalb sagte Robert "fork" und nicht "fork and exec" – artistoex

0

Die IP-Adresse wird verwendet, um den Computer zu identifizieren, und der Port wird verwendet, um den Prozess (die Anwendung) innerhalb des Computers zu identifizieren. Wenn ein Port von einem Prozess verwendet wird, können andere Prozesse ihn nicht mehr verwenden. Wenn also ein Paket an diesen Port gesendet wird, kann nur der Besitzer dieses Ports mit diesem Paket umgehen.

+0

Während dies im Grunde richtig ist (es gibt einige kleine Vorbehalte gegenüber gegabelten Prozessen, die den gleichen Socket verwenden, weil es vor der Verzweigung erstellt wurde), bin ich nicht sicher, was es im Vergleich zu den Antworten, die hier seit einer Weile sind, hinzufügt. Im Allgemeinen ist es eine gute Idee, sicherzustellen, dass eine neue Antwort auf eine alte Frage neue, wertvolle Einblicke liefert - und ich bin nicht davon überzeugt, dass diese Antwort das tut. –

0

Verbindungen werden durch ein Paar von Endpunkten identifiziert. - Endpunkt bedeutet (IP, Port)

2

Zunächst ist ein "Port" nur eine Nummer. Alles, was eine "Verbindung zu einem Port" wirklich darstellt, ist ein Paket, dessen Nummer in seinem Headerfeld "Zielport" angegeben ist.

Jetzt gibt es zwei Antworten auf Ihre Frage, eine für Stateful-Protokolle und eine für Stateless-Protokolle.

Für ein statusloses Protokoll (dh UDP) gibt es kein Problem, da "Verbindungen" nicht existieren - mehrere Personen können Pakete an den gleichen Port senden, und ihre Pakete werden in welcher Reihenfolge auch immer ankommen. Niemand ist jemals in dem "verbundenen" Zustand.

Für ein statusbehaftetes Protokoll (wie TCP) wird eine Verbindung durch ein 4-Tupel identifiziert, das aus Quell- und Ziel-Ports sowie Quell- und Ziel-IP-Adressen besteht. Wenn also zwei verschiedene Maschinen mit demselben Port auf einer dritten Maschine verbunden sind, gibt es zwei unterschiedliche Verbindungen, da sich die Quell-IPs unterscheiden. Wenn derselbe Computer (oder zwei hinter NAT oder auf andere Weise die gleiche IP-Adresse) zweimal mit einem einzelnen entfernten Ende verbunden wird, werden die Verbindungen nach Quellport unterschieden (der im Allgemeinen ein zufälliger Port mit hoher Nummer ist).

Einfach gesagt, wenn ich zweimal von meinem Client eine Verbindung zum gleichen Webserver herstelle, haben die beiden Verbindungen unterschiedliche Quellports von meiner Perspektive und Zielports vom Webserver. Es gibt also keine Mehrdeutigkeit, obwohl beide Verbindungen die gleichen Quell- und Ziel-IP-Adressen haben.

Ports sind eine Möglichkeit, IP-Adressen zu multiplexen, sodass verschiedene Anwendungen dasselbe IP-Adresse/Protokoll-Paar abhören können. Wenn eine Anwendung nicht ihr eigenes übergeordnetes Protokoll definiert, gibt es keine Möglichkeit, einen Port zu multiplexen. Wenn zwei Verbindungen, die dasselbe Protokoll verwenden, identische Quell- und Ziel-IPs und identische Quell- und Zielports haben, müssen sie dieselbe Verbindung sein.

Verwandte Themen