Любое приложение может bind()
к любому доступному порту, за исключением портов с низким номером, которые могут требовать административных привилегий. Нет абсолютно никакого принуждения того, какой тип приложения слушает какой номер порта, просто соглашение. Это связано с тем, что сам номер порта является просто 16-битным полем в заголовках пакетов, и у операционной системы нет практического способа узнать, что происходит на уровне приложения.
Как правило, номер порта, который слушает приложение, определяется самим приложением: оно должно решить, какой порт передать вызову bind()
. За пределами приложения вы можете использовать NAT (преобразование сетевых адресов) в маршрутизаторе или брандмауэре, чтобы перенаправить любой номер порта на любой другой номер порта.
Обратите внимание, что порты TCP полностью независимы от портов UDP. Приложение, использующее TCP-порт 12345, не имеет абсолютно никакого отношения к приложению, использующему UDP-порт 12345. Брандмауэр, который разрешает или блокирует один, автоматически не разрешает или не блокирует другой.
К сожалению, этот момент часто путается из-за того, что IANA (хранители неисполненных соглашений о том, какие приложения используют какие номера портов) решила назначить имена служб для портов UDP и TCP, даже если служба использует только один из их.