En supposant que les performances matérielles soient infinies, une machine Linux peut-elle prendre en charge plus de 65 536 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 (adresse IP locale, port local, adresse IP distante, 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 prises en charge si plusieurs de ces paramètres sont libres? 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 fichier peut-être?
Un seul port d'écoute peut accepter plusieurs connexions simultanément.
Il y a une limite de '64K' qui est souvent citée, mais c'est par client et par port du serveur , et doit être clarifiée.
Chaque paquet TCP/IP a fondamentalement quatre champs pour l'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 fichier).
Si un client a plusieurs connexions au même port sur la même destination, trois de ces champs seront identiques - seul 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 d'hôte donné est de 64K.
Cependant, plusieurs clients peuvent chacun avoir jusqu'à 64K connexions sur le port de certains serveurs. Si le serveur possède plusieurs ports ou si l'un de ces ports est multi-hébergé, vous pouvez le multiplier davantage.
La limite réelle est donc les descripteurs de fichier. Un descripteur de fichier est attribué à chaque connexion de socket. La limite est donc réellement le nombre de descripteurs de fichier pour lesquels le système a été configuré 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 vantées pour les boîtes normales se situent autour de 80 K, par exemple les serveurs de messagerie Jabber à un seul thread.
Si vous envisagez d'exécuter un serveur et d'essayer de décider du nombre de connexions pouvant être desservies par un ordinateur, consultez le document problème C10k et les problèmes potentiels liés au service simultané de nombreux clients.
Si vous avez utilisé un socket brut (SOCK_RAW
) et que vous avez implémenté de nouveau TCP en mode 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).
Bien sûr, il faudrait beaucoup de mémoire pour conserver l’état de toutes ces connexions, et je pense qu’il faudrait configurer certaines règles iptables pour que la pile du noyau TCP ne soit pas perturbée et/ou ne réponde pas. votre nom.