
Dies ist eine hypothetische Frage, die mir nur helfen soll, besser zu verstehen, wie TCP-Ports funktionieren.
Angenommen, ich habe mehrere Ethernet-Karten auf meinem Rechner und sie sind an verschiedene Subnetze angeschlossen. Wenn ich jetzt über TCP eine Verbindung zu einem Remote-Rechner herstellen möchte, ohne lokale Adresse/Port zu binden, ermittelt der Kernel die IP-Adresse und den Port für mich.
Nach meinem Verständnis wählt der Kernel die IP-Adresse auf Grundlage der primären IP der Schnittstelle, wobei die Schnittstelle gemäß der Routing-Tabelle ausgewählt wird.
Für den TCP-Port-Teil findet der Kernel einen unbenutzten (flüchtigen) Port für mich. Die Frage ist, behält der Kernel die verwendeten TCP-Ports anhand der IP-Adresse oder NICHT? Das heißt, wenn ich den Port verwendet habe ( a.b.c.d:12345
nehmen wir an, das ist die IP von Schnittstelle A) und nun ein Paket von Schnittstelle B ausgehen soll, kann ich dann verwenden e.f.g.h:12345
(nehmen wir an, das ist die IP von Schnittstelle B)?
Mir fallen Argumente für beide Möglichkeiten ein. Da eine hergestellte TCP-Verbindung durch das 4-Tupel aus lokaler/entfernter IP/Port identifiziert wird, scheint die Antwort zu sein yes
: Ich kann den Port 12345
erneut verwenden. Der Kernel kennt jedoch die Routing-Informationen (also die Schnittstelle, also die Quell-IP) bei der Vorbereitung der TCP-Schicht nicht, sodass es für den Kernel unmöglich wäre, einen IP-abhängigen freien TCP-Port auf der TCP-Schicht zuzuweisen, bevor er zur IP-Schicht übergeht.
Die Kernelfunktioninet_csk_get_port
durchsucht die hinfo->bhash
Tabelle, die nur Portnummern für Hash-Schlüssel verwendet. Bedeutet das, dass temporäre Ports global eindeutig sind? Und wenn das stimmt, klingt das nach einer (kleinen) Ressourcenverschwendung für Maschinen mit mehreren Netzwerkkarten. Habe ich hier wichtige Fakten übersehen? Ich hoffe, jemand kann mir dabei helfen, das zu klären. Danke!