it-swarm.com.de

Wie findet der Server heraus, an welchen Client-Port gesendet werden soll?

So wie ich es verstehe, passiert Folgendes, wenn ein Client eine Verbindungsanfrage stellt:

  1. Der Server wird an eine bestimmte Portnummer gebunden. Die Portnummer ist immer an einen Abhörvorgang gebunden. Da nur der Server auf eingehende Verbindungen wartet, müssen wir nicht auf der Clientseite binden
  2. Der Server überwacht diese Portnummer weiterhin.
  3. Der Client sendet eine connect() Anfrage.
  4. Der Server akzeptiert die Anforderung mit accept(). Sobald der Server die Clientanforderung akzeptiert, weist der Kernel dem Server eine zufällige Portnummer für weitere send() und receive() zu, da nicht dieselbe Portnummer auf dem Server sein kann Wird sowohl zum Senden als auch zum Abhören verwendet, und der vorherige Port wartet immer noch auf neue Verbindungen

Wie findet der Server vor diesem Hintergrund heraus, an welchem ​​Port der Client empfängt? Ich weiß, dass der Client TCP Segmente mit einem Quellport und einem Zielport sendet, sodass der Server den Quellport dieses Segments als Zielport verwendet, aber welche Funktion ruft der Server auf, um zu suchen über diesen Port? Ist es accept()?

26
Subi Suresh

Es ist Teil des Headers TCP (oder UDP usw.) im Paket. Der Server findet es heraus, weil der Client es ihm sagt. Dies ähnelt der Ermittlung der IP-Adresse des Clients (die Teil des IP-Headers ist).

Beispielsweise enthält jedes TCP Paket einen IP-Header (mindestens mit Quell-IP, Ziel-IP und Protokoll [TCP]). Dann gibt es einen TCP Header (mit Quell- und Zielport plus mehr).

Wenn der Kernel ein SYN-Paket (den Beginn einer TCP -Verbindung) mit einer Remote-IP vom 10.11.12.13 (im IP-Header) und einem Remote-Port von 12345 (im TCP] empfängt. _ Header), kennt es dann die Remote-IP und den Port. Es sendet eine SYN | ACK zurück. Wenn eine Bestätigung zurückgegeben wird, gibt der Aufruf listen einen neuen Socket zurück, der für diese Verbindung eingerichtet wurde.

Ein TCP Socket wird durch die vier Werte (Remote-IP, lokale IP, Remote-Port, lokaler Port) eindeutig identifiziert. Sie können mehrere Anschlüsse/Sockets haben, sofern sich mindestens einer davon unterscheidet.

In der Regel sind der lokale Port und die lokale IP für alle Verbindungen zu einem Serverprozess gleich (z. B. befinden sich alle Verbindungen zu sshd auf local-ip: 22). Wenn ein Remote-Computer mehrere Verbindungen herstellt, verwendet jeder einen anderen Remote-Port. Alles außer dem Remote-Port wird also gleich sein, aber das ist in Ordnung - nur einer der vier muss sich unterscheiden.

Sie können z. B. wirehsark verwenden, um das Paket anzuzeigen, und es werden alle Daten für Sie beschriftet. Hier ist der Quellport hervorgehoben (beachten Sie, dass er im decodierten Paket sowie im Hex-Dump unten hervorgehoben ist):

Wireshark showing a TCP SYN packet

33
derobert

Die "Verbindungsanforderung (normalerweise der Systemaufruf connect() des Client-Programms) verursacht einen Drei-Wege-Handshake . Das erste Paket des Beim 3-Wege-Handshake (vom Client zum Server) ist das SYN-Flag gesetzt und enthält die Portnummer TCP, die der Kernel des Client-Programms ihm zuweist.

Sie können dies in einem Artikel über Nmap vs Natural SYN-Pakete sehen. Die Nmap SYN-Paketdecodierung hat den Ausdruck "source.60058> dest.22". Die "legitime SYN-Paket" -Decodierung enthält den Ausdruck "source.35970> dest.80". Die beiden SYN-Pakete teilen dem Remote-Kernel mit, dass die Pakete von TCP Port 60058 bzw. Port 35970 stammen.

2
Bruce Ediger

TCP-Socket ist ein Stream-orientierter Socket. Die beiden Socket-Deskriptoren (die Ihnen und Ihrem Kollegen gehören) sind zuverlässig miteinander verbunden. Sie müssen sich also keine Sorgen um den Client-Port machen - schreiben Sie einfach Ihren Socket-Deskriptor!

Gerne können Sie auch den Namen (2) erhalten, wenn Sie das wirklich wissen möchten (zum Protokollieren vielleicht).

1
b166er

Die Verbindung wird durch ein Tupel definiert (Quell-IP, Quell-Port, Ziel-IP, Ziel-Port). Die Antworten gehen umgekehrt.

0
vonbrand