Comment les sites à fort trafic desservent-ils plus de 65535 connexions TCP?

29

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? Est-ce que cela se fait simplement en distribuant le système, c'est-à-dire de nombreux serveurs sur plusieurs machines?

alh
la source

Réponses:

55

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 serveur. Mais un serveur peut (théoriquement) servir 65535 connexions simultanées par client .

Ainsi, dans la 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.

Dennis Kaarsemaker
la source
Je me demande comment le NAT de classe transporteur affectera cela
TheLQ
@TheLQ Sans CGN, chaque client ne peut pas ouvrir plus de 65 535 connexions au même serveur, aucun client ne devrait avoir besoin de presque autant de connexions au même serveur. Avec CGN, chaque CGN ne peut pas ouvrir plus de 65535 connexions au même serveur, celles-ci doivent être partagées entre tous les clients utilisant ce CGN. La question de savoir si le CGN peut ouvrir simultanément des connexions 65535 à un serveur et 65535 à un autre serveur est un détail d'implémentation, qui peut varier entre différentes implémentations CGN.
kasperd
La limite peut être augmentée en ajoutant plus d'adresses IP au CGN ou en déployant plus de CGN. Mais vous pouvez également simplement déployer une double pile. Ensuite, les connexions aux serveurs prenant en charge IPv6 ne passeront pas par le CGN, donc ils ne consommeront pas de précieux numéros de port.
kasperd
15

Vous vous trompez - l'unicité de la prise est déterminée par quatre facteurs:

  1. l'adresse IP locale
  2. le numéro de port local
  3. l'adresse IP distante
  4. le numéro de port distant

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 d'une seule passerelle NAT), vous n'allez pas pousser le limites pour les 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 les passerelles NAT (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 que 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.

le-wabbit
la source
2

La question était de savoir comment gérer les grands nombres de connexions (> 64k). 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 qu'ils ne veulent pas passer à IPv6.

user8162
la source
2
Si vous lisez plus que le titre, vous verrez que cette question concerne l'épuisement des ports et que l'OP s'est trompé sur la façon dont cela fonctionne. Comment cette réponse ajoute-t-elle exactement quelque chose de nouveau à cela?
MDMarra
2
L'OP demande explicitement (et pas seulement dans le titre) "comment les serveurs connaissent-ils des quantités extrêmement élevées ... de demandes". Laissant de côté la confusion sur le fonctionnement des sockets, c'est une question valable.
user8162
1
Excellent travail pour couper la question au milieu de la phrase. Le reste de cette phrase dit: (more than the max port number).
MDMarra
2
Peut-être que vous avez manqué la partie où j'ai stipulé que l'OP ne comprend pas la mécanique des douilles. Je suis d'avis que comment dépasser 64 k ports est un sujet de discussion valable; Je suis désolé si vous n'êtes pas d'accord, mais c'était LA question et c'était pour cela que j'ai fourni quelques réponses. Vous avez demandé comment cela répondait; c'est comme ça.
user8162
3
C'est la moitié de la question. La question plus large - comme le soutient la dernière phrase du PO - est de savoir comment briser la barrière des 64k.
user8162