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-потоков, которые может обработать ваше ядро.

Spiff
источник
2
Возможно, стоит дать ссылку на en.wikipedia.org/wiki/C10k_problem в этом превосходном ответе.
ChrisInEdmonton
1
Я реализовал TCP-сервер, который может одновременно поддерживать 65 534 соединения с каждого возможного IP-адреса. Он мало что делает - он просто отображает входящий текст с несколькими заменами символов - но он работает на очень маленькой аппаратной платформе. Я не думаю, что он полностью соответствует RFC, но, похоже, он работает довольно хорошо, несмотря на то, что не знает и не заботится о том, сколько TCP-соединений открыто на большинстве его портов.
суперкат
2
Если вам действительно необходимо подключить более 65536 соединений между двумя компьютерами, вы можете настроить машины на использование нескольких IP-адресов. Каждый IP-адрес, который вы добавляете к двум машинам, увеличивает максимальное количество соединений квадратично (по крайней мере, теоретически, вы, скорее всего, сначала столкнетесь с другими проблемами).
Ложь Райан