Gehören diese 2 Pakete zum selben TCP-Socket?
Nehmen wir an, wir haben zwei Pakete A
und B
.
A
: Hat Quell-IP S1
, Ziel-IP D1
, Quell-Port SP1
, Ziel-PortDP1
B
: Hat Quell-IP S2
, Ziel-IP D1
, Quell-Port SP2
, Ziel-PortDP1
Beide sind TCP. Haben diese beiden Pakete jetzt den gleichen Socket?
Über UDP Ich habe gelesen, dass sein Socket aus der Ziel-IP und der Ziel-Port-Nummer besteht. Wenn dies mit UDP geschehen wäre, würden beide Pakete von demselben Socket empfangen.
Aber dieses Beispiel ist für TCP und hier bin ich mir nicht sicher, ob es auch den gleichen Socket für TCP durchlaufen würde?
Antworten
Erstens kümmert sich TCP nicht um einzelne Pakete. Wenn es sich nur um Datenpakete ohne vorherigen Verbindungsaufbau handelt, werden sie einfach verworfen, ohne dass Sockets erforderlich sind. Ich gehe also davon aus, dass es sich um hergestellte Verbindungen oder um anfängliche Pakete zum Herstellen einer Verbindung handelt. Eine TCP- Verbindung wird mindestens durch das 4-Tupel von (src-ip, src-port, dst-ip, dst-port) definiert. Da diese 4 Tupel in beiden Fällen offensichtlich unterschiedlich sind, werden unterschiedliche Sockel benötigt.
Über UDP Ich habe gelesen, dass sein Socket aus der Ziel-IP und der Ziel-Port-Nummer besteht.
Dies gilt nur für nicht verbundene UDP-Sockets. Bei wieder angeschlossenen UDP-Sockets ist das 4-Tupel relevant.
Über UDP habe ich gelesen, dass ...
Der Hauptunterschied zwischen TCP und UDP besteht darin, dass TCP verbindungsorientiert ist, während UDP zum Übertragen einzelner Pakete verwendet wird.
Ein UDP-Socket verarbeitet alle UDP-Pakete, die an einem bestimmten (Ziel-) Port des Computers ankommen.
Ein TCP-Socket verarbeitet alle Pakete, die zu einer bestimmten TCP-Verbindung gehören.
Haben diese beiden Pakete jetzt den gleichen Socket?
Es ist komplizierter als Sie denken:
Die von Ihnen beschriebene Situation tritt normalerweise auf der "Serverseite" auf (auf dem Computer, der die accept()
API zur Verarbeitung eingehender Verbindungen verwendet, z. B. auf einem Webserver).
Angenommen, zwei Computer (mit Webbrowsern) möchten eine Verbindung zum gleichen Webserver herstellen. Beide Computer haben denselben "Quell-TCP-Port" gewählt. In diesem Fall erfüllen die von den beiden Computern an den Webserver gesendeten Pakete Ihre Bedingung: Nur die Quell-IP-Adresse unterscheidet sich in den von den beiden Computern gesendeten Paketen, während die Ziel-IP-Adresse, der Zielport und der Quellport identisch sind.
Auf der "Serverseite" sind jedoch zwei Sockets an der Verarbeitung einer einzelnen TCP-Verbindung beteiligt :
- Ein Socket, der verwendet
listen()
undaccept()
auf eingehende TCP-Verbindungen wartet. - Für jede eingehende TCP-Verbindung wird ein Socket von zurückgegeben
accept()
.
Wenn ein TCP-Paket das erste Paket einer TCP-Verbindung ist, wird das Paket von dem TCP-Socket "verarbeitet", der eine listen()
am Zielport ausführt .
Dieser Socket kümmert sich weder um die Quell-IP-Adresse noch um den Quell-TCP-Port - genau wie UDP-Sockets. Der Socket verarbeitet alle ersten Pakete von TCP-Verbindungen mit einer bestimmten Ziel-IP-Adresse und einem bestimmten Zielport.
Wenn dieses erste Paket empfangen wird, wird der zweite Socket (der die TCP-Verbindung verarbeitet) erstellt und von der access()
API zurückgegeben.
Dieser Socket verarbeitet eine bestimmte Verbindung (und damit alle weiteren Pakete der TCP-Verbindung).
Da wir im Beispiel zwei verschiedene Verbindungen mit den beiden Computern haben, die über denselben "Quell-TCP-Port" eine Verbindung zu demselben Server herstellen, verarbeiten zwei verschiedene Sockets Pakete, die sich nur im Ziel-TCP-Port unterscheiden.