Was ist die theoretische maximale Anzahl offener TCP-Verbindungen, die eine moderne Linux-Box haben kann?

236

Kann eine Linux-Box unter der Annahme einer unendlichen Leistung der Hardware> 65536 offene TCP-Verbindungen unterstützen?

Ich verstehe, dass die Anzahl der kurzlebigen Ports (<65536) die Anzahl der Verbindungen von einer lokalen IP zu einem Port auf einer Remote-IP begrenzt.

Das Tupel (lokale IP, lokaler Port, Remote-IP, Remote-Port) definiert eine TCP-Verbindung eindeutig. Bedeutet dies, dass mehr als 65K-Verbindungen unterstützt werden können, wenn mehr als einer dieser Parameter frei ist. zB Verbindungen zu einer einzelnen Portnummer auf mehreren Remote-Hosts von mehreren lokalen IPs.

Gibt es ein weiteres 16-Bit-Limit im System? Anzahl der Dateideskriptoren vielleicht?

Fadedbee
quelle

Antworten:

349

Ein einzelner Überwachungsport kann mehr als eine Verbindung gleichzeitig akzeptieren.

Es gibt ein häufig angegebenes '64K'-Limit, das jedoch pro Client und Server-Port gilt und geklärt werden muss.

Jedes TCP / IP-Paket verfügt grundsätzlich über vier Adressierungsfelder. diese sind:

source_ip source_port destination_ip destination_port
< client            > < server                      >

Innerhalb des TCP-Stapels werden diese vier Felder als zusammengesetzter Schlüssel verwendet, um Pakete mit Verbindungen (z. B. Dateideskriptoren) abzugleichen.

Wenn ein Client viele Verbindungen zu demselben Port am selben Ziel hat, sind drei dieser Felder identisch - source_portvariiert nur , um die verschiedenen Verbindungen zu unterscheiden. Ports sind 16-Bit-Nummern, daher beträgt die maximale Anzahl von Verbindungen, die ein bestimmter Client zu einem bestimmten Host-Port haben kann, 64 KB.

Mehrere Clients können jedoch jeweils bis zu 64 KB Verbindungen zum Port eines Servers haben. Wenn der Server mehrere Ports hat oder einer von beiden mehrfach vernetzt ist, können Sie diesen weiter multiplizieren.

Die eigentliche Grenze sind also Dateideskriptoren. Jede einzelne Socket-Verbindung erhält einen Dateideskriptor. Das Limit ist also die Anzahl der Dateideskriptoren, für die das System konfiguriert wurde, und die Ressourcen, die verarbeitet werden sollen. Die maximale Grenze liegt normalerweise bei über 300 KB, kann jedoch z . B. mit sysctl konfiguriert werden .

Die realistischen Grenzwerte für normale Boxen liegen bei etwa 80 KB, beispielsweise für Jabber-Messaging-Server mit einem Thread.

Wille
quelle
3
Sie können theoretisch mehr als 64.000 ausgehende Verbindungen haben, wenn Sie (a) SO_REUSEADDR verwenden und (b) unterschiedliche Ziel-IP-Adressen als Ziel festlegen. Aber Kernel-Speicherbeschränkungen werden Sie wahrscheinlich zuerst aufhalten.
Darron
4
Das Systemlimit gilt für das gesamte System, oder? Es gibt auch ein mit ulimit konfigurierbares Limit, das die maximale Anzahl von Dateideskriptoren für einen Prozess begrenzt. Das ist standardmäßig viel weniger als 300K, normalerweise 1024.
Pacoverflow
1
Eine kleine technische Besonderheit: Auf einem Client-Computer können auch mehrere IP-Adressen von einem Router zugewiesen werden. Diese können alle einem einzelnen MAC zugewiesen werden, oder dieser Computer kann mehrere physische Netzwerkschnittstellen für zusätzliche IP-Adressen haben. Das OP hat 1 IP angegeben, aber es ist wichtig, dass andere nicht mehr IP-Adressen ausschließen.
Todd
2
@ Will schön erklärt !! Sehr hilfreich ... Möchte +100 Upvotes geben ... danke :-)
Tom Taylor
1
Beachten Sie, dass tcp_fin_timeout denselben Socket (Quelle, Ziel, Portkombination) standardmäßig für weitere 60 Sekunden blockiert, wodurch die Anzahl der tatsächlich verfügbaren TCP-Verbindungen zwischen zwei Systemen erheblich reduziert wird, wenn Verbindungen häufig getrennt und erneut verbunden werden. Dieses Problem kann minimiert werden, indem Sockets im Status TIME_WAIT (nicht immer unterstützt) wiederverwendet werden können (tcp_tw_reuse = 1) oder indem der TCP / IP-Standard gebrochen wird, indem dieses Zeitlimit auf einen niedrigeren Wert reduziert wird (funktioniert normalerweise trotzdem einwandfrei).
Fgwaller
17

Wenn Sie daran denken, einen Server zu betreiben und zu entscheiden, wie viele Verbindungen von einem Computer aus bedient werden können, sollten Sie sich über das C10k-Problem und die potenziellen Probleme bei der gleichzeitigen Bedienung vieler Clients informieren .

Spaceghost
quelle
14
C10k ist 10 Jahre alt und macht keinen Spaß mehr. [Lesen Sie dies], um zu sehen, wie C1024K angegangen werden kann.
Chandranshu
@Chandranshu - meintest du metabrew.com/article/… ?
Mikko Rantalainen
1
@ MikkoRantalainen - ja. Ich denke, es gibt jetzt bessere Benchmarks. Die Jungs von Phoenix haben es bereits auf 2 Millionen gleichzeitige Verbindungen gebracht.
Chandranshu
3
@Chandranshu - es gibt Dell Demo mit 12M Verbindungen: mrotaru.wordpress.com/2013/06/20/…
Mikko Rantalainen
1
Vor einigen Jahren: Intel Atom D2700, 2 GB RAM, 1,2 Millionen gleichzeitige Verbindungen. Die einzigen Probleme, die ich hatte, waren mit den Windows-Boxen in der Testarbeit; Diese gingen regelmäßig auf den Bauch, als sie versuchten, die Intel Atom-Box zu doS ...
Klaws
12

Wenn Sie einen Raw-Socket ( SOCK_RAW) verwendet und TCP im Userland erneut implementiert haben, ist die Antwort in diesem Fall meiner Meinung nach nur durch die Anzahl der (local address, source port, destination address, destination port)Tupel (~ 2 ^ 64 pro lokaler Adresse) begrenzt.

Es würde natürlich viel Speicher benötigen, um den Status all dieser Verbindungen aufrechtzuerhalten, und ich denke, Sie müssten einige iptables-Regeln einrichten, um zu verhindern, dass der Kernel-TCP-Stack verärgert wird und / oder in Ihrem Namen reagiert.

sbirch
quelle