LINUX.ORG.RU

лимит на кол-во файловых/сокетных дескрипторов

 


0

2

привет.

извесно, что номер порта описывается 16ти битным целым. таким образом, при попытке создать подключение(man 2 connect), у нас просто нет возможности указать значение больше 0xffff.

вопрос в том, что, допустим, мы не поключаемся, а аксептим(man 2 accept). в таком случае, номер порта в структуре 'sockaddr' не несет какой-либо важной информации, в отличии от IP, и, таким образом, это значение можно было бы вообще не учитывать, ну, или, генерить его каким-то рандомным образом, пусть даже с повторами.

т.е., сам вопрос заключается в том, могу ли я используя 'accept()', принять подключения для более чем 0xffff сокетов?

второй вопрос в том, что, к примеру, у меня два аксептора, один из которых слушает 'localhost', а второй - внешний адрес. в этом случае, суммарное кол-во открытых сокетов так же будет ограничиваться 0xffff?

спасибо.

★★★

принять подключения для более чем 0xffff сокетов?

Если подключения с разных ip-адресов, то можно.

второй вопрос в том, что, к примеру, у меня два аксептора, один из которых слушает 'localhost', а второй - внешний адрес. в этом случае, суммарное кол-во открытых сокетов так же будет ограничиваться 0xffff?

Нет, не будет.

mky ★★★★★ ()
Ответ на: комментарий от mky

спасибо большое за ответ, но пзволь еще вопрос, уточняющий: т.е., я правильно понимаю, что ограничение в 0xffff привязывается к одному IP? таким образом, если у меня 10ть внешних IP и десять аксепторов, то я, в пределах одного приложения могу принять 0xffff*10 коннектов?

и корректирующий вопрос: т.к. аксепт привязывается к паре ip:port, то десять аксепторов на один IP но разные порты, не позволят мне принять 0xffff*10 коннектов?

спасибо.

niXman ★★★ ()
Ответ на: комментарий от niXman

таким образом, если у меня 10ть внешних IP и десять аксепторов, то я, в пределах одного приложения могу принять 0xffff*10 коннектов?

И если 10 ip, то accept может быть один, но на адрес 0.0.0.0.

то десять аксепторов на один IP но разные порты, не позволят мне принять 0xffff*10 коннектов?

Почему не позволят? accept создаёт сокет, идентифицируемый двумя парами ip:port (адреса на стороне сервер и на стороне клиента).

mky ★★★★★ ()
Ответ на: комментарий от mky

accept создаёт сокет, идентифицируемый двумя парами ip:port (адреса на стороне сервер и на стороне клиента).

так, получается, два варианта как получить больше чем 0xffff коннектов: 1)N ip-адресов и один аксептор. тогда 0xffff*N, 2)N аксепторов для одного IP но N портов.

все верно?

niXman ★★★ ()
Ответ на: комментарий от niXman

аксепт привязывается к паре ip:port, то десять аксепторов на один IP но разные порты, не позволят мне принять 0xffff*10 коннектов?

В отдельных процессах

Elyas ★★★★★ ()

Одно TCP соединение это точка в четырёхмерном пространстве {локальный IP, локальный порт, удалённый IP, удалённый порт}. Все 4 координаты абсолютно равноправны с точки зрения их "вклада" в соединение, так что скомбинировав их в любой удобной, например, пропорции 100*10*100*10, можно без принципиальных затруднений открыть миллион соединений (даже на IPv4, не говоря уж о 6), но, конечно ограничения числа дескрипторов на процесс и общего числа дескрипторов в VFS придётся поднимать соответственно.

d_a ★★★★★ ()
Ответ на: комментарий от d_a

запутался %)

допустим, у меня один ip. я создаю десять аксепторов на этот ip, но на десять разных портов. что я получу в данном случае?

спасибо.

niXman ★★★ ()
Ответ на: комментарий от niXman

Ограничение на количество файловых дескрипторов независимо от количества доступных портов или адресов.

Elyas ★★★★★ ()
Ответ на: комментарий от niXman

Клиент с одного ip-адреса сможет установить 10*0xffff коннектов с сервером (при условии, что клиент(ы) знает, что нужно подключаться на разные порты).

Ну и нужно поднять /proc/sys/fs/nr_open, /proc/sys/fs/file-max и /etc/security/limits.conf. И памяти не забыть, каждый сокет занимает, ЕМНИП, несколько сотен байт в структурах ядра.

mky ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.