Зарезервирован ли диапазон портов dymamic в Windows в целом или для каждого целевого порта?

#c# #sockets #networking #tcp #tcpclient

Вопрос:

В клиентском приложении я много раз подключаюсь к одному и тому же серверу, чтобы настроить TCP-сокет.

 TcpClient client = new TCPClient();
...
await client.ConnectAsync(host, outport);
 

Похоже, что мои динамические порты исчерпаны, потому что я получаю « Only one usage of each socket address (protocol/network address/port) is normally permitted «.

Это сообщение немного вводит в заблуждение, но я замечаю, что оно всегда возникает после использования одного и того же количества подключений.

Поэтому я попытался запустить несколько серверов на разных портах. Однако это не имеет значения — первая ошибка возникает после одного и того же количества портов… Теперь я удивлен:

Следует ли учитывать зарезервированный диапазон портов в Windows 10

  1. в общей сложности или
  2. на целевой порт, к которому мы подключаемся?

Я думал, что 2) — это ответ, но, основываясь на моих наблюдениях, я больше не уверен.

Комментарии:

1. Fromcmd.exe >Netstat -a. Запуск как на клиенте, так и на сервере. В выводе перечислены все порты TCP/UDP и их статус. Вы не можете использовать порт, который уже используется с тем же IP-адресом источника и назначения.

2. Вы правильно распоряжаетесь, верно?

Ответ №1:

в целом

Существует только 1 пул эфимерных портов, которые совместно используются всеми сокетами.

См. Следующие статьи MSDN для настройки доступного диапазона эфимерных портов:

Диапазон динамических портов по умолчанию для TCP/IP изменился с Windows Vista и в Windows Server 2008

Устранение неполадок с исчерпанием портов

ОБНОВЛЕНИЕ: Ну, точнее, существует ограниченное количество портов на локальный IP, по крайней мере. Если у вас установлено несколько IP-адаптеров (т. Е. ваш компьютер подключен к нескольким сетям), вы можете привязать несколько сокетов к одному и тому же локальному порту, если они привязаны к разным локальным IP-адресам. Соединение с сокетом однозначно идентифицируется кортежем [Protocol, Local IP, Local Port, Remote IP, Remote Port] . Таким образом, если вы устанавливаете несколько подключений к одному и тому же удаленному IP/порту с использованием одного и того же протокола (в данном случае TCP), то пары локальных IP/портов должны быть уникальными. Таким образом, если все исходящие сокеты привязаны к одному и тому же локальному IP-адресу, это ограничивает доступные локальные порты, которые вы можете использовать. Но если вы используете несколько сокетов на локальных IP-адресах, это расширит доступные локальные порты. Но это будет работать только в вашем случае использования, если эти несколько сетей имеют маршруты к интересующему вас серверу.

Комментарии:

1. Это означает, что я просто не могу использовать более заданного количества параллельных исходящих портов, независимо от того, подключаюсь ли я к одному или нескольким целевым серверам?

2. @MichaelW это правильно. Для начала вам действительно не следует устанавливать так много одновременных соединений. Зачем вам нужно так много соединений и почему вы не можете повторно использовать соединения? Вы пытаетесь провести какой-то стресс-тест сервера?

3. Это симуляция для стресс-теста.