Muss der TCP-Quellport pro Host eindeutig sein?

10

Ich habe erfahren, dass eine TCP-Verbindung durch das Tupel identifiziert wird (Quell-IP, Quell-Port, Ziel-IP, Ziel-Port). Theoretisch sollte es daher möglich sein, dass ein Client von Host1: Port1 eine Verbindung zu Server1: Port1 herstellt und gleichzeitig ein anderer Client (der auf Host1 ausgeführt wird) von Host1: Port1 zu Server2: Port1.

Ich habe ein bisschen in Java getestet und bisher scheint es möglich.

Ich habe jedoch mehrmals gelesen, dass der Quellport für die Hostadresse eindeutig sein muss, was im Grunde bedeuten würde, dass es eine feste Grenze von höchstens 65536 gleichzeitigen ausgehenden TCP-Verbindungen gibt. Ist das wahr?

Update: Hier ist mein Java-Code. Dies scheint zu funktionieren, und netstat -t zeigt deutlich zwei aktive ausgehende Verbindungen von Port 9990 (eine zu 9997, eine zu 9998). Zumindest unter einem modernen Linux scheint es möglich zu sein?

Socket s1 = new Socket();
s1.setReuseAddress(true);
SocketAddress saremote = new InetSocketAddress("localhost",9999);
SocketAddress salocal = new InetSocketAddress("localhost",9990);
s1.bind(salocal);
s1.connect(saremote);


Socket s2 = new Socket();
s2.setReuseAddress(true);
SocketAddress saremote2 = new InetSocketAddress("localhost",9998);
SocketAddress salocal2 = new InetSocketAddress("localhost",9990);
s2.bind(salocal2);
s2.connect(saremote2);

Und die netstat-t-Ausgabe (abgeschnitten):

tcp6       0      0 localhost:9990          localhost:9998          CONNECTED 
tcp6       0      0 localhost:9990          localhost:9999          CONNECTED 
lxgr
quelle
"Wenn Sie nach den Obergrenzen gut gestalteter Systeme fragen, tun Sie es mit ziemlicher Sicherheit falsch "
Chris S

Antworten:

16

Es ist keine TCP-Anforderung. In Bezug auf TCP muss nur die Kombination aus Quell-IP, Quell-Port, Ziel-IP und Ziel-Port eindeutig sein. In der Praxis bieten die meisten TCP-APIs jedoch keine Möglichkeit, mehr als eine Verbindung mit demselben Quellport herzustellen, es sei denn, sie haben unterschiedliche Quell-IP-Adressen.

David Schwartz
quelle
2
Danke, das beantwortet den theoretischen Teil meiner Frage vollständig! Ich muss es einfach für jede TCP-Implementierung versuchen, denke ich.
lxgr
5

Das ist das Maximum in der Praxis, es ist normalerweise niedriger. Beispielsweise verwendet Linux den net.ipv4.ip_local_portKernel-Parameter, um die Ports zu definieren, die für ausgehende Verbindungen verwendet werden. Das ist normalerweise so etwas wie

sysctl net.ipv4.ip_local_port_range 32768 to 61000

Sie können die verfügbare Anzahl mit sysctl erhöhen, z

sysctl -w net.ipv4.ip_local_port_range="10000 64000"

oder Sie können /etc/sysctl.conf mit denselben Informationen bearbeiten

net.ipv4.ip_local_port_range = 10000 65535

Alle Beispiele, die ich gefunden habe, zeigen, dass der Mindestwert ebenfalls 1024 beträgt.

user9517
quelle
1

Zusätzlich zu Iains Antwort (oben), dass möglicherweise nur 10.000 Ports für ausgehende Verbindungen von Ihrem Kernel zugelassen sind, sind Sie theoretisch mindestens auf einen Satz von XX, XXX-Ports pro IP-Adresse auf dem Adapter beschränkt. Da 127.1 für die Außenwelt nicht verfügbar ist und sich im lokalen Netzwerk befindet, haben Sie für jede andere IP-Adresse ( extern ) eine Reihe von ausgehenden Ports innerhalb Ihres 65K-Portbereichs.

Das Ausgangslimit ist also wirklich:

  With 1 IP Address: XX,XXX (or 2 x XX,XXX on internal network)
  With 2 IP addresses: 2 x XX,XXX (or 3 x XX,XXX on internal network)
  With 3 IP addresses: 3 x XX,XXX (or 4 x XX,XXX on internal network)
  etc.

Damit dies funktioniert, müssen Sie die Antwort auf diesen Thread lesen .

Djangofan
quelle
0

Ja. Das ist wahr.

Ports sollen und die Apps mit dem Netzwerk verbunden werden.

Sie können nicht mehr als 65553-Anwendungen über TCP und 65535 über UDP auf demselben Host verbinden. Betriebssysteme verwalteten die Ports normalerweise dinamykal und wiesen jeder App, die eine Verbindung zum Netzwerk herstellt, einen zu.

Wenn sich beim Eintreffen eines Netzwerkpakets zwei Anwendungen am selben Port befinden, kann der Computer nicht wissen, an welche App die Daten gesendet werden sollen. Wenn Sie beispielsweise Messenger und Skype am selben Port haben, wird Ihre Messenger-Nachricht in Skype angezeigt und umgekehrt :)

Ricardo Polo
quelle
Ich denke, die Frage betraf nicht die Obergrenze für die Anzahl der Abhöranwendungen - die, wie Sie hervorheben, durch die Anzahl der eindeutigen Portnummern begrenzt ist -, sondern die Anzahl der gleichzeitig betriebenen Sockets. Webserver haben oft Dutzende von Sockets, die alle an ihren einzelnen Port 80 oder 443 adressiert sind. Wenn viele Server auf einem Host dies getan haben, gibt es keinen Grund, warum die Anzahl der offenen Sockets 2 ^ 32 nicht überschreiten darf.
Brandon Rhodes
0

Obwohl ein System möglicherweise eine Begrenzung der Anzahl offener TCP-Verbindungen hat, gibt es normalerweise keine Einschränkung hinsichtlich der verwendeten Portnummern. Eine gute TCP-Implementierung muss jedoch verhindern, dass dasselbe Socket-Paar zweimal verwendet wird. (Socket = IP-Adresse + Port). Ein Port wird jedoch einem Prozess zugewiesen, um das Stehlen von Verbindungen zu verhindern, und die übliche Methode besteht darin, einen freien Port für einen empfangenden oder einen ausgehenden Port anzufordern. Dies verhindert doppelte ausgehende Sockets und damit doppelte Verbindungen. Wenn diese Methode nicht verwendet wird, muss die Anwendung selbst verhindern, dass doppelte Verbindungen erstellt werden.

Papou
quelle
3
Wie fügt dies etwas Neues hinzu, das die Antworten bereits zu dieser alten Frage gepostet haben?
Chris S