W jaki sposób witryny o dużym natężeniu ruchu obsługują ponad 65535 połączeń TCP?

29

Jeśli istnieje ograniczenie liczby portów, które może posiadać jedna maszyna, a gniazdo może powiązać tylko z nieużywanym numerem portu, w jaki sposób serwery doświadczające bardzo dużych ilości (więcej niż maksymalna liczba portów) żądań sobie z tym poradzą? Czy to po prostu dlatego, że system jest rozproszony, tzn. Wiele serwerów na wielu komputerach?

alh
źródło

Odpowiedzi:

55

Bardzo poważnie źle rozumiesz numery portów: serwer nasłuchuje tylko na jednym porcie i może mieć dużą liczbę otwartych gniazd od klientów łączących się z tym portem.

Na poziomie TCP krotka (źródłowy adres IP, port źródłowy, docelowy adres IP, port docelowy) musi być unikalny dla każdego jednoczesnego połączenia. Oznacza to, że pojedynczy klient nie może otworzyć więcej niż 65535 jednoczesnych połączeń z serwerem. Ale serwer może (teoretycznie) obsługiwać 65535 równoczesnych połączeń na klienta .

Tak więc w praktyce serwer jest ograniczony jedynie ilością mocy procesora, pamięci itp., Która musi obsługiwać żądania, a nie liczbą połączeń TCP z serwerem.

Dennis Kaarsemaker
źródło
Zastanawiam się, jak wpłynie na to NAT klasy operatorskiej
TheLQ
@TheLQ Bez CGN każdy klient nie może otworzyć więcej niż 65535 połączeń z tym samym serwerem, żaden klient nie powinien potrzebować prawie tylu połączeń z tym samym serwerem. Dzięki CGN każdy CGN nie może otworzyć więcej niż 65535 połączeń z tym samym serwerem, musiałyby one być współużytkowane przez wszystkich klientów korzystających z tego CGN. To, czy CGN może jednocześnie otwierać połączenia 65535 z jednym serwerem i 65535 połączenia z innym serwerem, jest szczegółem implementacji, który może być różny dla różnych implementacji CGN.
kasperd
Limit można zwiększyć, dodając więcej adresów IP do CGN lub wdrażając więcej CGN. Ale możesz także wdrożyć podwójny stos. Wtedy połączenia z serwerami z obsługą IPv6 nie będą przechodzić przez CGN, więc nie będą zużywać cennych numerów portów.
kasperd
14

Mylisz się - wyjątkowość gniazda zależy od czterech czynników:

  1. lokalny adres IP
  2. numer portu lokalnego
  3. zdalny adres IP
  4. zdalny numer portu

Oferując usługi sieciowe, 1. i 2. zazwyczaj są statyczne (np. IP 10.0.0.1, port 80), ale chyba że oczekujesz tysięcy połączeń od jednego klienta (lub pojedynczej bramy NAT), nie będziesz naciskał granice dla możliwych kombinacji 3. i 4. zanim zabraknie zasobów lokalnych.

Tak więc, chociaż praktycznie klient nie użyje portu, który jest już używany do połączenia, aby otworzyć połączenie z innym docelowym adresem IP, wyczerpanie numeru portu będzie najmniejszym problemem dla prawie każdej aplikacji - na serwerze lub Strona klienta.

Problem jest bardzo realny w przypadku bram NAT (routerów) obsługujących klientów z dużą liczbą otwartych połączeń wychodzących (np. Torrentów) - tam zobaczysz zmniejszenie numeru portu po opróżnieniu puli portów dostępnej dla NAT. W takim przypadku brama NAT nie może utworzyć żadnych dodatkowych powiązań, co skutecznie odcina klientów od Internetu.

the-wabbit
źródło
2

Pytanie brzmiało, jak obsługiwać duże (> 64k) liczby połączeń. Dwie najczęściej stosowane metody to:

  • Dodanie większej liczby serwerów, co zwiększa liczbę adresów src / dst i krotek numerów portów. Istnieje wiele sposobów podziału obciążenia na wiele serwerów; Okrągły robin DNS to jeden; są inni

  • Wdróż „NAT klasy operatorskiej” (którą przyjaciel szyderczo i poprawnie moim zdaniem określa jako „NAT klasy crummier”). Zasadniczo jest to NAT NAT. Ma to bardzo złe konsekwencje dla aplikacji, ale robią to niektórzy duzi dostawcy, gdy zabraknie miejsca na IPv4 i / lub numerów portów i / lub nie chcą przejść na IPv6.

użytkownik8162
źródło
2
Jeśli przeczytasz więcej niż tytuł, zobaczysz, że to pytanie dotyczy wyczerpania portów, a OP pomylił się co do tego, jak to działa. Jak dokładnie ta odpowiedź dodaje do tego coś nowego?
MDMarra,
2
OP jednoznacznie (i nie tylko w nagłówku) pyta „jak serwery doświadczają bardzo dużych ilości ... żądań”. Pomijając pomyłkę dotyczącą działania gniazd, to ważne pytanie.
user8162
1
Świetna robota polegająca na odcięciu pytania w połowie zdania. Reszta tym zdaniu mówi: (more than the max port number).
MDMarra,
2
Być może przegapiłeś część, w której stwierdziłam, że OP nie rozumie mechaniki gniazd. Uważam, że przekroczenie portów 64k jest ważnym tematem do dyskusji; Przepraszam, jeśli się nie zgadzasz, ale to BYŁO pytanie i że BYŁO to, na co udzieliłem kilku odpowiedzi. Zapytałeś, jak to reaguje; właśnie tak.
user8162,
3
To połowa pytania. Najważniejsze pytanie - jak potwierdza ostatnie zdanie PO - brzmi: jak przełamać barierę 64k.
user8162,