Каково теоретическое максимальное количество открытых TCP-соединений, которые может иметь современный ящик Linux

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

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

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

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

Ответ 1

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

Существует ли ограничение в 64K, которое часто цитируется, но это для каждого клиента на порт сервера и нуждается в уточнении.

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

source_ip source_port destination_ip destination_port
< client            > < server                      >

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

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

Тем не менее, у нескольких клиентов может быть до 64K подключений к некоторому серверному порту, и если у сервера есть несколько портов или он многопользовательский, то вы можете умножить это дальше.

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

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

Ответ 2

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

Ответ 3

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

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