Более 65536 TCP-соединений в Linux


11

Я застрял, пытаясь настроить более 65536 исходящих соединений TCP из коробки Linux (RedHat5).

Я уже настроил как исходящие, так и принимающие поля, чтобы разрешить достаточное количество файловых дескрипторов.

Я не верю, что на принимающей стороне есть проблема - у меня есть несколько целевых окон, у каждого из которых несколько IP-адресов, и я использую несколько портов.

Что касается исходящей стороны, я не верю, что достигаю ограничения на один IP-адрес - я использую несколько IP-адресов и портов (я открываю соединения от портов 30 000 - 60 000 для каждого из нескольких IP-адресов).

Я пропускаю какой-нибудь параметр ядра Linux? Или какой-то фундаментальный предел в TCP?

Сбой в том, что мое приложение для открытия соединений висит в вызове connect ().

Спасибо за любую помощь NickB


Какой лимит вы достигли? В чем была ошибка, когда вы достигли этого предела?
Нос

connect () зависает.
NickB

1
Что находится между вашими IP-адресами источника и назначения? Возможно, вы заполняете таблицу NAT какого-либо устройства?

Ответы:


10

Вот блог, где кто-то получил> 1 000 000 баллов из коробки.

  • Ричард Джонс, MetaBrew.com, 2008-11-04, Comet-приложение на миллион пользователей с Mochiweb, часть 3 , раздел Увеличение до 1 миллиона (Архивировано здесь )

В первой части мы установили диапазон «1024 65535», то есть доступны 65535-1024 = 64511 непривилегированных портов. Некоторые из них будут использоваться другими процессами, но мы никогда не получим более 64511 клиентских подключений, потому что у нас закончатся порты.

...

Итак, давайте создадим 17 новых IP-адресов с намерением установить 62 000 подключений с каждого, что даст нам в общей сложности 1 054 000 подключений.


Спасибо! Это подходит для меня. В частности, настройки sysctl с сайта metabrew.com/article/… позволили мне установить более 65 536 TCP-соединений.
NickB

1

Протокол TCP использует только 16 бит для порта назначения и порта источника. Не будет возможности открыть более 65536 портов одновременно, даже с Linux.


3
Это верно только для одного IP-адреса. Если вы используете более одного, каждый IP-адрес должен иметь 65536 открытых портов.
Работа

1
правильно, для каждого исходящего соединения требуется локальный порт. IIRC, любые порты, которые уже используются, не могут использоваться для этих соединений. так, например, если вы используете telnet / ftp / http, порты с номерами 21/23/80 не доступны как локальные порты.
KevinDTimm

1
Вы также можете иметь несколько подключений к одному и тому же порту.
gtrak

@Job - Да, так как TCP укладывается поверх IP - я говорю только об одном IP-адресе.

4
Каждое соединение идентифицируется кортежем, состоящим из удаленного адреса и порта, а также локального адреса и порта. Так> 65536 входящих подключений с разных удаленных хостов возможно. > 65536 исходящих соединений из одного интерфейса на хосте невозможны, и в любом случае вы будете ограничены несколько меньшим, чем это, поскольку всегда будут использоваться некоторые порты.
Лен Холгейт

0

В этом контексте «единый интерфейс» означает единую сеть, которой назначен один IP-адрес. Каждое исходящее TCP-соединение связано с отдельным портом, поэтому ваш пример невозможен.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.