Quel est le nombre maximum théorique de connexions TCP ouvertes qu’une machine Linux moderne peut avoir?

En supposant une performance infinie du matériel, une machine Linux peut-elle supporter> 65536 d’ouvrir des connexions TCP?

Je comprends que le nombre de ports éphémères (<65536) limite le nombre de connexions d’une adresse IP locale à un port sur une adresse IP distante.

Le tuple (ip local, port local, ip distant, port distant) est ce qui définit de manière unique une connexion TCP; Cela signifie-t-il que plus de 65 000 connexions peuvent être sockets en charge si plusieurs de ces parameters sont gratuits? Par exemple, connexions à un numéro de port unique sur plusieurs hôtes distants à partir de plusieurs adresses IP locales.

Y a-t-il une autre limite de 16 bits dans le système? Nombre de descripteurs de fichiers peut-être?

Un seul port d’écoute peut accepter plusieurs connexions simultanément.

Il y a une limite «64K» qui est souvent citée, mais c’est par client par port de serveur , et doit être clarifiée.

Chaque paquet TCP / IP a essentiellement quatre champs pour l’adressage; ceux-ci sont:

source_ip source_port destination_ip destination_port < client > < server > 

Dans la stack TCP, ces quatre champs sont utilisés comme une clé composée pour faire correspondre les paquets aux connexions (par exemple, les descripteurs de fichiers).

Si un client possède de nombreuses connexions au même port sur la même destination, trois de ces champs seront identiques – seul le port source_port varie pour différencier les différentes connexions. Les ports sont des nombres de 16 bits. Par conséquent, le nombre maximal de connexions qu’un client donné peut avoir sur un port hôte donné est de 64 Ko.

Cependant, plusieurs clients peuvent avoir jusqu’à 64 Ko de connexions sur le port de certains serveurs, et si le serveur possède plusieurs ports ou est multi-hébergé, vous pouvez le multiplier davantage.

La vraie limite est donc les descripteurs de fichiers. Chaque connexion de socket individuelle se voit atsortingbuer un descripteur de fichier. La limite est donc vraiment le nombre de descripteurs de fichiers que le système a été configuré pour autoriser et les ressources à gérer. La limite maximale est généralement supérieure à 300 Ko, mais est configurable, par exemple, avec sysctl .

Les limites réalistes dont on peut se vanter pour les boîtes normales sont autour de 80K, par exemple les serveurs de messagerie Jabber mono-threadés.

Si vous envisagez d’exécuter un serveur et d’essayer de déterminer le nombre de connexions pouvant être traitées à partir d’un seul ordinateur , vous pouvez consulter le problème relatif à C10k et les problèmes potentiels liés au service simultané de nombreux clients.

Si vous avez utilisé un socket brut ( SOCK_RAW ) et implémenté le protocole TCP en mode utilisateur, je pense que la réponse est limitée dans ce cas uniquement par le nombre de tuples ( (local address, source port, destination address, destination port) (~ 2 ^ 64 par adresse locale).

Garder l’état de toutes ces connexions demande beaucoup de mémoire, et je pense que vous devrez configurer des règles iptables pour éviter que la stack TCP du kernel ne soit perturbée et / ou ne réponde en votre nom.