Каково теоретическое максимальное количество открытых TCP-соединений, которое может иметь современная коробка Linux
Предполагая бесконечную производительность от оборудования, может ли коробка Linux поддерживать>65536 открытых TCP-соединений?
Я понимаю, что количество эфемерных портов (<65536) ограничивает количество соединений от одного локального IP до одного порта на одном удаленном IP.
Кортеж (локальный IP, локальный порт, удаленный IP, удаленный порт) - это то, что однозначно определяет TCP-соединение; означает ли это, что может поддерживаться более 65 тыс. соединений, если более одного из этих параметров свободны. например, соединения с одним номером порта на нескольких удаленных хостах с нескольких локальных IP-адресов.
Есть ли еще один 16-битный лимит в системе? Количество файловых дескрипторов возможно?
3 ответа
Один порт прослушивания может принимать более одного подключения одновременно.
Часто упоминается ограничение в 64 КБ, но оно относится к каждому клиенту на порт сервера и требует уточнения.
Каждый пакет TCP/IP имеет в основном четыре поля для адресации; это:
source_ip source_port destination_ip destination_port
< client > < server >
Внутри стека TCP эти четыре поля используются в качестве составного ключа для сопоставления пакетов с соединениями (например, файловыми дескрипторами).
Если у клиента много подключений к одному и тому же порту в одном и том же пункте назначения, то три из этих полей будут одинаковыми - только source_port
варьируется, чтобы дифференцировать различные связи. Порты представляют собой 16-разрядные числа, поэтому максимальное количество подключений, которое может иметь любой данный клиент к любому заданному порту хоста, составляет 64 КБ.
Тем не менее, несколько клиентов могут иметь до 64 КБ подключений к порту какого-либо сервера, и если сервер имеет несколько портов или является многодомным, вы можете увеличить это еще больше.
Таким образом, реальный предел - файловые дескрипторы. Каждому отдельному соединению сокетов присваивается дескриптор файла, поэтому ограничение - это действительно количество дескрипторов файлов, которые система сконфигурировала для разрешения и ресурсов для обработки. Максимальный предел обычно превышает 300 КБ, но его можно настроить, например, с помощью sysctl.
Реальные ограничения для обычных боксов составляют около 80 КБ, например, однопоточные серверы обмена сообщениями Jabber.
Если вы думаете о запуске сервера и пытаетесь решить, сколько соединений можно обслуживать с одного компьютера, вы можете прочитать о проблеме C10k и потенциальных проблемах, связанных с одновременным обслуживанием большого количества клиентов.
Если вы использовали сырой сокет (SOCK_RAW
) и повторно внедрил TCP в userland, я думаю, что ответ ограничен в этом случае только количеством (local address, source port, destination address, destination port)
кортежи (~2^64 на локальный адрес).
Конечно, потребовалось бы много памяти, чтобы сохранить состояние всех этих соединений, и я думаю, что вам нужно будет установить некоторые правила iptables, чтобы стек TCP ядра не расстраивался и / или не отвечал от вашего имени.