65536 +1 Соединение в системе


35

Для каждой системы в сети имеется 65536 портов , и каждое соединение или отправка / получение будут использовать один из них.

Мой вопрос: что произойдет, если у нас будет 65536 + 1 соединение ?!

Я знаю, что это не происходит нормальным образом, но мне любопытно узнать, как операционные системы справляются с этим.


12
В соединении будет отказано. Но у вас реально будут проблемы задолго до открытия 65535 соединений.
— ChrisInEdmonton

1
@ChrisInEdmonton Нет. Если это исходящее соединение, оно получит ошибку привязки, так как не может выделить локальный порт. Если это входящее соединение, ограничение порта не применяется.
— user207421

если соединение является входящим, вы получите отказанное соединение, если оно является исходящим, ваш вызов сокета вызовет ошибку. Я не ставлю это как ответ, потому что я не уверен.
— Хорхе Альдо

Ответы:


61

Имейте в виду, что система может обрабатывать более 65536 одновременных подключений, поскольку не обязательно каждое из них использует отдельный порт.

Соединение TCP или поток UDP определяется 4-мя кортежами:

(source IP address, source port, destination IP address, destination port)

Таким образом, даже если у вас есть веб-сервер с одним IP-адресом и один пакет программного обеспечения HTTP-сервера, который прослушивает только порт 80, он теоретически может обрабатывать 65536 подключений на каждый подключенный к нему IP-адрес клиента . Итак, 64Ki-соединения с IP-адреса клиента 1, плюс 64Ki-соединения с IP-адреса клиента 2 и т. Д.

Таким образом, протоколы поддерживают, в первом приближении, 2 48 подключений / потоков к одному порту TCP или UDP по одному адресу IPv4. Рассмотрим как TCP, так и UDP вместе, а также адресное пространство IPv4 и космически / комично большое адресное пространство IPv6, и вы можете видеть, что сами протоколы вряд ли когда-либо станут источником ограничения числа одновременных соединений, которые хост может справиться.

Точно так же в протоколах TCP или UDP нет ничего, что мешало бы клиентскому компьютеру использовать один исходный порт на одном IP-адресе для создания нескольких исходящих соединений с различными адресами и портами сервера. Иногда сетевые API данной ОС могут не облегчать эту задачу, но важно помнить, что, скажем, почтенный старый API-интерфейс «[BSD] Sockets» - это всего лишь один API для TCP и UDP. TCP и UDP могут иметь возможности, которые не предоставляются традиционным API Sockets.

Таким образом, число одновременных TCP-соединений или UDP-потоков, которые может обрабатывать данный хост, ограничено не столько номерами портов, сколько системными ресурсами, такими как пространство ОЗУ и время ЦП, которое требуется для отслеживания всех этих соединений и их обслуживания. Также специфические для реализации детали ОС могут накладывать искусственные ограничения. Например, в философии Unix «все является файлом» может существовать файловый дескриптор для каждого соединения TCP или потока UDP. Если ваше ядро ​​Unix имеет ограничение на количество дескрипторов файлов, которое оно может отслеживать, то ограничение дескрипторов файлов является искусственным ограничением на количество одновременных TCP-соединений или UDP-потоков, которые может обработать ваше ядро.


2
Возможно, стоит дать ссылку на en.wikipedia.org/wiki/C10k_problem в этом превосходном ответе.
— ChrisInEdmonton

1
Я реализовал TCP-сервер, который может одновременно поддерживать 65 534 соединения с каждого возможного IP-адреса. Он мало что делает - он просто отображает входящий текст с несколькими заменами символов - но он работает на очень маленькой аппаратной платформе. Я не думаю, что он полностью соответствует RFC, но, похоже, он работает довольно хорошо, несмотря на то, что не знает и не заботится о том, сколько TCP-соединений открыто на большинстве его портов.
— суперкат

2
Если вам действительно необходимо подключить более 65536 соединений между двумя компьютерами, вы можете настроить машины на использование нескольких IP-адресов. Каждый IP-адрес, который вы добавляете к двум машинам, увеличивает максимальное количество соединений квадратично (по крайней мере, теоретически, вы, скорее всего, сначала столкнетесь с другими проблемами).
— Ложь Райан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.