S'il y a une limite sur le nombre de ports qu'une machine peut avoir et qu'un socket ne peut se lier qu'à un numéro de port inutilisé, comment les serveurs rencontrant des quantités extrêmement élevées (plus que le nombre de ports max) de requêtes gèrent-ils cela? Cela se fait-il simplement en rendant le système distribué, c'est-à-dire de nombreux serveurs sur plusieurs machines?
Vous comprenez mal les numéros de port: un serveur n'écoute qu'un seul port et peut avoir un grand nombre de sockets ouvertes de clients se connectant à ce seul port.
Au niveau TCP le tuple (IP source, port source, IP de destination, port de destination) doit être unique pour chaque connexion simultanée. Cela signifie qu'un seul client ne peut pas ouvrir plus de 65535 connexions simultanées à un Mais un serveur peut (théoriquement) servir 65535 connexions simultanées par client.
Ainsi, en pratique, le serveur n'est limité que par la quantité de puissance CPU, de mémoire, etc. qu'il doit traiter les demandes, et non par le nombre de connexions TCP au serveur).
Vous vous trompez - l'unicité de la prise est déterminée par quatre facteurs:
Lorsque vous offrez des services réseau, 1. et 2. sont généralement statiques (par exemple IP 10.0.0.1, port 80) mais à moins que vous n'attendiez des milliers de connexions d'un seul client (ou un seul NAT), vous n'allez pas repousser les limites des combinaisons possibles de 3. et 4. avant de manquer de ressources locales.
Ainsi, même si pratiquement un client n'utilisera pas un port déjà utilisé pour une connexion pour ouvrir une connexion vers une adresse IP de destination différente, l'épuisement du numéro de port sera le moindre de vos problèmes pour presque toutes les applications - que ce soit sur le serveur ou côté client.
Le problème est très réel avec NAT passerelles (routeurs) desservant les clients avec un grand nombre de connexions sortantes ouvertes (par exemple, des torrents) - là, vous verrez l'épuisement du numéro de port après le pool de ports disponible pour NAT a été vidé. Dans ce cas, la passerelle NAT n'est pas en mesure de créer des associations supplémentaires, coupant ainsi efficacement les clients d'Internet).
La question était de savoir comment gérer les grands nombres de connexions (> 64 Ko). Les deux méthodes les plus courantes sont:
Ajouter plus de serveurs, ce qui augmente le nombre d'adresses src/dst et de tuples de numéro de port. Il existe plusieurs façons de partager la charge sur plusieurs serveurs; Le round robin DNS en est un; il y en a d'autres
Déployez un "NAT de qualité transporteur" (ce qu'un ami, de manière dérisoire et correcte, à mon avis, appelle un "NAT de qualité inférieure"). Il s'agit essentiellement d'un NAT d'un NAT. Cela a de très mauvaises implications pour les applications, mais c'est ce que font certains grands fournisseurs lorsqu'ils manquent d'espace IPv4 et/ou de numéros de port, et/ou ils ne veulent pas passer à IPv6.