Каково теоретическое максимальное количество открытых TCP-соединений, которое может иметь современная коробка Linux - PullRequest
209 голосов
/ 25 февраля 2010

При условии бесконечной производительности оборудования, может ли коробка Linux поддерживать> 65536 открытых TCP-соединений?

Я понимаю, что количество эфемерных портов (<65536) ограничивает количество соединений от одного локального IP до одного порта на одном удаленном IP. </p>

Кортеж (локальный IP, локальный порт, удаленный IP, удаленный порт) - это то, что однозначно определяет TCP-соединение; Означает ли это, что более 65K соединений могут поддерживаться, если более одного из этих параметров свободны. например подключения к одному номеру порта на нескольких удаленных хостах с нескольких локальных IP-адресов.

Есть ли еще одно 16-битное ограничение в системе? Возможно, число файловых дескрипторов?

Ответы [ 3 ]

313 голосов
/ 25 февраля 2010

Один порт прослушивания может принимать более одного подключения одновременно.

Существует часто упоминаемое ограничение в 64 КБ, но оно составляет на клиента на порт сервера и требует уточнения.

Каждый пакет TCP / IP имеет в основном четыре поля для адресации; это:

source_ip source_port destination_ip destination_port
< client            > < server                      >

Внутри стека TCP эти четыре поля используются в качестве составного ключа для сопоставления пакетов с соединениями (например, дескрипторы файлов).

Если клиент имеет много подключений к одному и тому же порту в одном и том же пункте назначения, тогда три из этих полей будут одинаковыми - только source_port различается для различения разных подключений. Порты представляют собой 16-разрядные числа, поэтому максимальное количество подключений, которое может иметь любой данный клиент к любому заданному порту хоста, составляет 64 КБ.

Однако несколько клиентов могут иметь до 64 КБ подключений к порту какого-либо сервера, и если сервер имеет несколько портов или является многодомным, вы можете умножить это далее.

Таким образом, реальное ограничение - дескрипторы файлов. Каждому отдельному соединению сокетов присваивается дескриптор файла, поэтому ограничение - это действительно количество дескрипторов файлов, которые система сконфигурировала для разрешения и ресурсов для обработки. Максимальный предел обычно превышает 300 КБ, но его можно настроить, например, с sysctl .

Реалистичные ограничения, которыми можно похвастаться для обычных боксов, составляют около 80 КБ, например однопоточные серверы обмена сообщениями Jabber.

17 голосов
/ 07 сентября 2010

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

11 голосов
/ 11 ноября 2013

Если вы использовали необработанный сокет (SOCK_RAW) и повторно внедрили TCP в пользовательском пространстве, я думаю, что ответ в этом случае ограничен только числом (local address, source port, destination address, destination port) кортежей (~ 2 ^ 64 на локальный адрес).

Конечно, потребовалось бы много памяти, чтобы сохранить состояние всех этих соединений, и я думаю, что вам придется установить некоторые правила iptables, чтобы стек TCP ядра не расстраивался и / или не отвечал от вашего имени.

...