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

236

En supposant des performances infinies du matériel, une boîte Linux peut-elle prendre en charge> 65536 connexions TCP ouvertes?

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 façon unique une connexion TCP; cela implique-t-il que plus de 65 000 connexions peuvent être prises en charge si plusieurs de ces paramètres sont libres. par exemple des connexions à un seul numéro de port 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?

fadedbee
la source

Réponses:

350

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

Il existe une limite de «64 Ko» qui est souvent citée, mais qui est par client et par port de serveur , et doit être clarifiée.

Chaque paquet TCP / IP possède essentiellement quatre champs d'adressage; ceux-ci sont:

source_ip source_port destination_ip destination_port
< client            > < server                      >

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

Si un client a plusieurs connexions au même port sur la même destination, alors trois de ces champs seront identiques - uniquement source_port varient que 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 avec un port hôte donné est de 64 Ko.

Cependant, plusieurs clients peuvent chacun avoir jusqu'à 64 Ko de connexions sur le port d'un serveur, et si le serveur a plusieurs ports ou l'un ou l'autre est multi-hébergé, vous pouvez le multiplier davantage.

La vraie limite est donc les descripteurs de fichiers. Chaque connexion de socket individuelle reçoit 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 elle est configurable, par exemple avec sysctl .

Les limites réalistes dont on se vante pour les boîtiers normaux sont d'environ 80 Ko, par exemple les serveurs de messagerie Jabber à thread unique.

Volonté
la source
3
Vous pouvez théoriquement avoir plus de 64 000 connexions sortantes si vous (a) utilisez SO_REUSEADDR et (b) ciblez des adresses IP de destination différentes. Mais les limites de mémoire du noyau vous arrêteront probablement en premier.
Darron
4
La limite sysctl est pour l'ensemble du système, non? Il existe également une limite configurable avec ulimit, qui limite le nombre maximal de descripteurs de fichiers pour un processus. C'est par défaut beaucoup moins de 300K, généralement 1024.
pacoverflow
1
Une petite technicité: une machine cliente peut également avoir plusieurs adresses IP attribuées à partir d'un routeur. Ceux-ci peuvent tous être attribués à un seul MAC, ou cette machine peut avoir plusieurs interfaces réseau physiques pour des adresses IP supplémentaires. L'OP a spécifié 1 IP, mais il est important pour les autres de ne pas exclure davantage d'adresses IP.
Todd
2
@Will Magnifiquement expliqué !! Très utile ... Je voudrais donner +100 votes positifs ... merci :-)
Tom Taylor
1
Sachez que tcp_fin_timeout bloque le même socket (source, cible, combinaison de ports) pendant 60 secondes supplémentaires par défaut, ce qui réduit considérablement le nombre de connexions TCP réellement disponibles entre deux systèmes, si les connexions sont déconnectées et reconnectées fréquemment. Ce problème peut être minimisé en permettant de réutiliser (tcp_tw_reuse = 1) les sockets dans l'état TIME_WAIT (pas toujours pris en charge) ou en brisant la norme TCP / IP en réduisant ce délai à une valeur inférieure (fonctionne généralement bien de toute façon).
fgwaller
17

Si vous envisagez d'exécuter un serveur et d'essayer de décider du nombre de connexions pouvant être servies à partir d'une machine, vous voudrez peut-être en savoir plus sur le problème C10k et les problèmes potentiels impliqués dans le service simultané de nombreux clients.

Spaceghost
la source
14
C10k a 10 ans et n'est plus amusant. [Lisez ceci] pour voir comment le C1024K peut être abordé.
Chandranshu
@Chandranshu - vouliez-vous dire metabrew.com/article/… ?
Mikko Rantalainen
1
@MikkoRantalainen - oui. Je pense qu'il existe de meilleurs repères disponibles maintenant. Les gars de Phoenix l'ont déjà poussé à 2 millions de connexions simultanées.
Chandranshu
3
@Chandranshu - il y a une démo Dell avec 12M de connexions: mrotaru.wordpress.com/2013/06/20/…
Mikko Rantalainen
1
Il y a quelques années: Intel Atom D2700, 2 Go de RAM, 1,2 M de connexions simultanées. Les seuls problèmes que j'ai rencontrés concernaient les boîtes Windows dans le cadre du test; ceux-ci montaient régulièrement le ventre en essayant de faire la boîte Intel Atom ...
Klaws
12

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 (local address, source port, destination address, destination port)tuples (~ 2 ^ 64 par adresse locale).

Il faudrait bien sûr beaucoup de mémoire pour conserver l'état de toutes ces connexions, et je pense que vous devrez configurer certaines règles iptables pour empêcher la pile TCP du noyau d'être perturbée et / ou de répondre en votre nom.

bouleau
la source