Генерируйте случайные номера портов TCP или UDP в любом диапазоне, автоматически пропуская общеизвестные и часто занятые порты служб, чтобы ваши локальные сервисы не конфликтовали.
Номер порта, который, скорее всего, никому больше на вашем компьютере не понадобится. Выберите, сколько портов вам нужно, и диапазон для выбора. Порты общеизвестных служб пропускаются по умолчанию, поэтому полученные номера вряд ли конфликтуют с уже запущенным.
–
Выбор номера порта, который не будет конфликтовать
Как делится пространство портов
Порт TCP или UDP — это 16-битное число, поэтому доступный диапазон — от 0 до 65535. IANA делит это пространство на три части. Порты с 0 по 1023 — системные или общеизвестные, зарезервированные для стандартных служб, таких как HTTP на 80 и SSH на 22; в Unix-подобных системах привязка одного из них обычно требует прав root или явной возможности. Порты с 1024 по 49151 — зарегистрированные, назначаемые по запросу конкретным приложениям — здесь находятся PostgreSQL на 5432 и MySQL на 3306. Порты с 49152 по 65535 — динамический или эфемерный диапазон, зарезервированный для временных клиентских выделений.
Для локального сервиса разработки оптимальным является зарегистрированный диапазон выше 1024, избегающий как привилегированного, так и эфемерного блока. Именно поэтому этот генератор по умолчанию использует 1024 как нижнюю границу. Оставаться ниже 49152 важнее, чем кажется: ваша операционная система берёт из эфемерного диапазона каждый раз, когда программа открывает исходящее соединение, поэтому сервис, размещённый там, может обнаружить свой порт уже занятым после перезагрузки.
Почему помогает пропуск общеизвестных портов
Одна лишь случайность не предотвращает коллизии. Случайный выбор легко может попасть на 3306, 5432, 6379 или 8080, и на рабочей машине разработчика именно эти номера, скорее всего, уже заняты. Используемый здесь список пропуска охватывает классические службы Unix, распространённые базы данных и брокеры сообщений, а также порты, которые популярные фреймворки выбирают по умолчанию, например 3000 для инструментов Node и 8000 или 8080 для локальных HTTP-серверов.
Пропуск обходится почти бесплатно — в пуле по-прежнему десятки тысяч кандидатов — и устраняет самый распространённый источник ошибки «порт уже используется». Если вы намеренно хотите один из этих номеров, отключите опцию, и полный диапазон снова станет доступен.
Имейте в виду, что это вероятностная помощь, а не резервирование. Инструмент не может проверить вашу машину, поэтому не знает, что что-то слушает. Чтобы убедиться, что порт действительно свободен, проверьте его локально с помощью lsof -i :PORT в macOS или Linux, ss -ltnp в современном Linux или netstat -ano | findstr :PORT в Windows.
Порты в контейнерах и CI
Контейнерные среды и CI меняют расчёт. Внутри контейнера пространство портов обычно приватное, поэтому два контейнера могут оба слушать 8080 без конфликта; риск коллизии перемещается на сторону хоста, где опубликованные порты используют одно пространство имён. Выбор случайного порта хоста и сопоставление его с фиксированным портом контейнера — распространённый способ запустить несколько копий одного сервиса бок о бок.
Многие системы CI и инструменты оркестрации решают это иначе, запрашивая у ядра свободный порт: привяжитесь к порту 0, и операционная система назначит неиспользуемый и сообщит, какой именно. Это без гонок и всегда верно, поэтому отдавайте этому предпочтение, когда ваша программа может узнать свой порт во время выполнения. Сгенерированное число, подобное приведённым здесь, — подходящий инструмент, когда нужно стабильное значение для записи в конфигурационный файл, сопоставление docker-compose или командный документ до запуска чего-либо.
Часто задаваемые вопросы
Почему диапазон по умолчанию начинается с 1024?
Порты ниже 1024 привилегированы в Unix-подобных системах и обычно требуют прав root для привязки. Начало с 1024 сохраняет результаты пригодными для обычной учётной записи пользователя.
Стоит ли избегать портов выше 49152?
Обычно да для долгоживущего сервиса. Этот диапазон — то место, откуда операционная система берёт эфемерные клиентские порты, поэтому сервис, размещённый там, может обнаружить свой номер уже занятым после перезапуска.
Проверяет ли это, действительно ли порт свободен?
Нет. Страница работает полностью в вашем браузере и не может проверить вашу систему. Проверьте с помощью `lsof -i :PORT`, `ss -ltnp` или `netstat -ano | findstr :PORT` перед выбором номера.
Какие порты исключает опция пропуска?
Классические службы Unix, распространённые базы данных и брокеры, такие как MySQL, PostgreSQL, Redis, RabbitMQ, MongoDB и Elasticsearch, а также популярные значения по умолчанию фреймворков, как 3000, 8000, 8080 и 8443.
Является ли случайность криптографически безопасной?
Он использует Web Crypto API, когда браузер его предоставляет, с отклоняющей выборкой, чтобы выбор оставался равномерным, и возвращается к Math.random только когда Crypto недоступен.
В чём разница между портом TCP и портом UDP?
Это отдельные пространства по 65536 записей, поэтому TCP 8080 и UDP 8080 не связаны и могут использоваться разными программами одновременно. Номера, которые генерирует этот инструмент, подходят для любого.