Jaka jest teoretycznie maksymalna liczba otwartych połączeń TCP, jakie może posiadać nowoczesny system Linux


236

Zakładając, że wydajność sprzętu jest nieskończona, czy Linux może obsługiwać> 65536 otwierać połączenia TCP?

Rozumiem, że liczba efemerycznych portów (<65536) ogranicza liczbę połączeń z jednego lokalnego adresu IP do jednego portu na jednym zdalnym adresie IP.

Krotka (lokalny adres IP, port lokalny, zdalny adres IP, port zdalny) jest tym, co jednoznacznie definiuje połączenie TCP; oznacza to, że ponad 65 000 połączeń może być obsługiwanych, jeśli więcej niż jeden z tych parametrów jest wolny. np. połączenia z jednym numerem portu na wielu zdalnych hostach z wielu lokalnych adresów IP.

Czy w systemie jest inny limit 16 bitów? Może liczba deskryptorów plików?

Odpowiedzi:


350

Pojedynczy port nasłuchujący może akceptować więcej niż jedno połączenie jednocześnie.

Często przywoływany jest limit „64 KB”, ale dotyczy on jednego klienta na port serwera i wymaga wyjaśnienia.

Każdy pakiet TCP / IP ma zasadniczo cztery pola adresowania; to są:

source_ip source_port destination_ip destination_port
< client            > < server                      >

Wewnątrz stosu TCP te cztery pola są używane jako klucz złożony, aby dopasować pakiety do połączeń (np. Deskryptory plików).

Jeśli klient ma wiele połączeń z tym samym portem w tym samym miejscu docelowym, wówczas trzy z tych pól będą takie same - source_portzmienia się tylko w celu rozróżnienia różnych połączeń. Porty są liczbami 16-bitowymi, dlatego maksymalna liczba połączeń, które dany klient może mieć z danym portem hosta, wynosi 64 KB.

Jednak wielu klientów może mieć do 64 KB połączeń z portem jakiegoś serwera, a jeśli serwer ma wiele portów lub jedno z wielu adresów, możesz to jeszcze bardziej pomnożyć.

Tak więc prawdziwym ograniczeniem są deskryptory plików. Każde pojedyncze połączenie z gniazdem ma deskryptor pliku, więc limitem jest tak naprawdę liczba deskryptorów plików, na które system został skonfigurowany, aby umożliwić obsługę zasobów. Maksymalny limit wynosi zwykle ponad 300 KB, ale można go konfigurować np. Za pomocą sysctl .

Realistyczne limity, jakie można się pochwalić w przypadku zwykłych urządzeń, to około 80 000, na przykład jedno-wątkowe serwery wiadomości Jabber.


3
Teoretycznie możesz mieć więcej niż 64 tys. Połączeń wychodzących, jeśli (a) używasz SO_REUSEADDR i (b) kierujesz na różne docelowe adresy IP. Ale limity pamięci jądra prawdopodobnie najpierw Cię zatrzymają.
Darron,

4
Limit sysctl dotyczy całego systemu, prawda? Istnieje również limit konfigurowalny z ulimit, który ogranicza maksymalną liczbę deskryptorów plików dla procesu. Jest to domyślnie dużo mniej niż 300
KB

1
Drobna technika: do komputera klienckiego można również przypisać wiele adresów IP z routera. Wszystkie mogą być przypisane do jednego adresu MAC lub ten komputer może mieć wiele fizycznych interfejsów sieciowych dla dodatkowych adresów IP. OP określił 1 adres IP, ale ważne jest, aby inni nie wykluczali więcej adresów IP.
Todd

2
@Will pięknie wyjaśnione !! Bardzo pomocny ... Chciałbym przekazać +100 głosów pozytywnych ... dziękuję :-)
Tom Taylor

1
Należy pamiętać, że tcp_fin_timeout blokuje domyślnie to samo gniazdo (źródło, cel, kombinacja portów) na kolejne 60 sekund, co znacznie zmniejsza liczbę faktycznie dostępnych połączeń tcp między dwoma systemami, jeśli połączenia są często rozłączane i ponownie łączone. Problem ten można zminimalizować, umożliwiając ponowne użycie (tcp_tw_reuse = 1) gniazd w stanie TIME_WAIT (nie zawsze obsługiwane) lub przez złamanie standardu TCP / IP w celu zmniejszenia tego limitu czasu do niższej wartości (zwykle i tak działa dobrze).
fgwaller,

17

Jeśli zastanawiasz się nad uruchomieniem serwera i próbujesz zdecydować, ile połączeń można obsłużyć z jednego komputera, możesz przeczytać o problemie z C10k i potencjalnych problemach związanych z obsługą wielu klientów jednocześnie.


14
C10k ma 10 lat i nie jest już zabawny. [Przeczytaj], aby zobaczyć, jak można rozwiązać problem z C1024K.
Chandranshu,

@Chandranshu - miałeś na myśli metabrew.com/article/… ?
Mikko Rantalainen,

1
@MikkoRantalainen - tak. Myślę, że są teraz dostępne lepsze testy porównawcze. Faceci z Phoenix już pchnęli go do 2 milionów jednoczesnych połączeń.
Chandranshu,

3
@Chandranshu - jest demo Dell z połączeniami 12M: mrotaru.wordpress.com/2013/06/20/...
Mikko Rantalainen

1
Jeszcze kilka lat temu: Intel Atom D2700, 2 GB pamięci RAM, 1,2 mln jednoczesnych połączeń. Jedyne problemy, jakie miałem, dotyczyły okien Windows podczas pracy testowej; te regularnie podskakiwały podczas próby wykonania DoS the Intel Atom box ...
Klaws

12

Jeśli użyłeś surowego gniazda ( SOCK_RAW) i ponownie zaimplementowałeś TCP w przestrzeni użytkownika, myślę, że w tym przypadku odpowiedź jest ograniczona tylko liczbą (local address, source port, destination address, destination port)krotek (~ 2 ^ 64 na adres lokalny).

Utrzymanie stanu wszystkich tych połączeń wymagałoby oczywiście dużej ilości pamięci, i myślę, że musiałbyś skonfigurować pewne reguły iptables, aby powstrzymać stos TCP TCP w jądrze i nie reagować w Twoim imieniu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.