Ponad 65536 połączeń TCP w systemie Linux

11

Utknąłem, próbując skonfigurować więcej niż 65536 wychodzących połączeń TCP z systemu Linux (RedHat5).

Skonfigurowałem już zarówno skrzynki wychodzące, jak i akceptujące, aby umożliwić wystarczającą liczbę deskryptorów plików.

Nie sądzę, że po stronie akceptującej występuje problem - mam wiele pól docelowych, każde z wieloma adresami IP i używam wielu portów.

Z drugiej strony nie sądzę, że osiągam limit adresu IP - używam wielu adresów IP i portów (otwieram połączenia z portów 30 000 - 60 000 dla każdego z kilku adresów IP).

Czy brakuje mi parametru dostrajania jądra systemu Linux? A może jakiś podstawowy limit w TCP?

Błąd polega na tym, że moja aplikacja do otwierania połączeń jest zawieszona w wywołaniu connect ().

Dzięki za pomoc NickB

NickB
źródło
Jaki limit osiągnąłeś? Jaki był błąd, gdy osiągnąłeś ten limit?
nos
connect () zawiesza się.
NickB
1
Co znajduje się pomiędzy twoim adresem źródłowym a docelowym? Czy prawdopodobnie wypełniasz tabelę NAT jakiegoś urządzenia?

Odpowiedzi:

10

Oto blog, na którym ktoś dostał> 1 000 000 outbounds z pudełka.

  • Richard Jones, MetaBrew.com, 2008-11-04, Aplikacja Comet dla miliona użytkowników z Mochiweb, część 3 , sekcja Zwiększanie jej do 1 miliona (zarchiwizowane tutaj )

W części 1 ustawiliśmy zakres na „1024 65535” - co oznacza, że ​​dostępne są 65535-1024 = 64511 nieuprzywilejowanych portów. Niektóre z nich będą wykorzystywane przez inne procesy, ale nigdy nie uzyskamy ponad 64511 połączeń klienckich, ponieważ zabraknie portów.

...

Przywołajmy zatem 17 nowych adresów IP z zamiarem utworzenia 62 000 połączeń z każdego z nich - co daje nam w sumie 1 054 000 połączeń

StackzOfZtuff
źródło
Dzięki! To działa dla mnie. W szczególności ustawienia sysctl z metabrew.com/article/… pozwoliły mi skonfigurować ponad 65 536 połączeń TCP.
NickB
1

Protokół TCP używa tylko 16 bitów dla portu docelowego i źródłowego. Nie będzie możliwości otwarcia więcej niż 65536 portów jednocześnie - nawet w systemie Linux.


źródło
3
Dotyczy to tylko jednego adresu IP. Jeśli używasz więcej niż jednego, każdy adres IP powinien mieć 65536 wolnych portów.
Job
1
poprawnie, port lokalny jest wymagany dla każdego połączenia wychodzącego. IIRC, żadnych już używanych portów nie można użyć do tych połączeń. na przykład jeśli korzystasz z usługi telnet / ftp / http, porty o numerach 21/23/80 nie są dostępne jako porty lokalne.
KevinDTimm
1
Możesz także mieć wiele połączeń z tym samym portem.
gtrak
@Job - Tak, ponieważ TCP jest ułożone na IP - Mówię tylko o jednym adresie IP.
4
Każde połączenie jest identyfikowane przez krotkę składającą się ze zdalnego adresu i portu oraz lokalnego adresu i portu. Możliwe jest więc> 65536 połączeń przychodzących z różnych hostów zdalnych. > 65536 połączeń wychodzących z jednego interfejsu na hoście nie jest możliwe i i tak będziesz ograniczony do nieco mniejszego, ponieważ zawsze będą używane niektóre porty.
Len Holgate
0

W tym kontekście „pojedynczy interfejs” oznacza pojedynczą sieć z przypisanym pojedynczym adresem IP. Każde wychodzące połączenie TCP jest powiązane z osobnym portem, więc twój przykład nie jest możliwy.

Len Holgate
źródło