291 votes

Quel est le nombre maximal théorique de connexions TCP ouvertes qu'une boîte Linux moderne peut avoir ?

En assumant des performances infinies du matériel, est-ce qu'une boîte Linux peut supporter >65536 connexions TCP ouvertes?

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

Le tuple (IP locale, port local, IP distante, port distant) est ce qui définit de manière unique une connexion TCP; est-ce que cela implique que plus de 65K connexions peuvent être prises en charge si plus d'un de ces paramètres est libre. Par exemple, des connexions à un seul numéro de port sur plusieurs hôtes distants à partir de plusieurs IPs locales.

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

441voto

Will Points 30630

Un seul port d'écoute peut accepter plus d'une connexion simultanément.

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

Chaque paquet TCP/IP a essentiellement quatre champs pour l'adressage. Ceux-ci sont:

source_ip source_port destination_ip destination_port
<----- client ------> <--------- serveur ------------>

À l'intérieur de la pile TCP, ces quatre champs sont utilisés comme une clé composite pour faire correspondre les paquets aux connexions (par exemple les descripteurs de fichiers).

Si un client a de nombreuses connexions au même port sur la même destination, alors trois de ces champs seront les mêmes - seul le source_port varie pour différencier les différentes connexions. Les ports sont des nombres sur 16 bits, donc le nombre maximum de connexions qu'un client donné peut avoir vers un port d'hôte donné est de 64K.

Cependant, plusieurs clients peuvent avoir chacun jusqu'à 64K connexions vers un port de serveur, et si le serveur a plusieurs ports ou est multi-résident, alors vous pouvez multiplier cela davantage.

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

Les limites réalistes vantées pour les boîtes normales sont d'environ 80K par exemple pour les serveurs de messagerie Jabber à thread unique.

4 votes

Vous pouvez théoriquement avoir plus de 64K connexions sortantes si vous (a) utilisez SO_REUSEADDR et (b) ciblez des adresses IP de destination différentes. Mais les limites de la mémoire du noyau vous arrêteront probablement en premier.

1 votes

@Darron Je pensais que SO_REUSEADDR était pour les serveurs qui se lient lorsqu'ils sont redémarrés?

0 votes

Oui, ça aussi. Cela consiste essentiellement à relaxer les vérifications initiales des conflits d'adresse pour les nouveaux sockets.

20voto

Spaceghost Points 2224

Si vous envisagez de mettre en place un serveur et que vous essayez de décider combien de connexions peuvent être gérées à partir d'une seule machine, vous voudrez peut-être lire à propos du problème C10k et des problèmes potentiels liés au fait de servir de nombreux clients simultanément.

19 votes

C10k a 10 ans et n'est plus amusant. [Lire ceci] pour voir comment C1024K peut être abordé.

1 votes

@Chandranshu - vouliez-vous dire metabrew.com/article/… ?

1 votes

@MikkoRantalainen - oui. Je pense qu'il existe désormais de meilleurs benchmarks disponibles. Les gars de Phoenix l'ont déjà poussé à 2 millions de connexions simultanées.

13voto

sbirch Points 331

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

Il faudrait bien sûr beaucoup de mémoire pour garder l'état de toutes ces connexions, et je pense que vous devriez mettre en place certaines règles iptables pour empêcher le stack TCP du noyau de se fâcher et/ou de répondre en votre nom.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X