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

StackOverflow https://stackoverflow.com/questions/2332741

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

source_ip source_port destination_ip destination_port
< client            > < server                      >

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

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

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

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top