2010-02-25 4 views
185

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

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

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

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

ответ

267

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

Существует ограничение «64 КБ», которое часто цитируется, но это на каждого клиента на серверный порт и нуждается в уточнении.

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

source_ip source_port destination_ip destination_port 
< client   > < server      > 

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

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

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

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

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

+1

Теоретически вы можете иметь исходящие соединения более 64 тыс., Если вы (а) используете SO_REUSEADDR и (б) предназначаете для разных IP-адресов назначения. Но ограничения памяти ядра, вероятно, остановят вас в первую очередь. – Darron

+0

@ Darron Я думал, что SO_REUSEADDR был привязан к серверам при перезапуске? – Will

+0

Да, это тоже. Он в основном расслабляет ранние проверки конфликтов адресов для новых сокетов. – Darron

13

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

+10

C10k 10 лет и больше не веселится. [Прочитайте это], чтобы увидеть, как C1024K можно решить. – Chandranshu

+5

@Chandranshu - читать что? Я предполагаю, что вы хотели поместить ссылку в комментарии ... – Krease

+0

bump 11 еще пойти ... –

7

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

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