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
Antworten:
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.
quelle
Das ist das Maximum in der Praxis, es ist normalerweise niedriger. Beispielsweise verwendet Linux den
net.ipv4.ip_local_port
Kernel-Parameter, um die Ports zu definieren, die für ausgehende Verbindungen verwendet werden. Das ist normalerweise so etwas wieSie können die verfügbare Anzahl mit sysctl erhöhen, z
oder Sie können /etc/sysctl.conf mit denselben Informationen bearbeiten
Alle Beispiele, die ich gefunden habe, zeigen, dass der Mindestwert ebenfalls 1024 beträgt.
quelle
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:
Damit dies funktioniert, müssen Sie die Antwort auf diesen Thread lesen .
quelle
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 :)
quelle
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.
quelle