Аналогия с погрузочным доком Томми отличная.
Служба может прослушивать только один порт (и да, listen(2)
- это имя системного вызова, при котором служба привязывается к порту), и порт может иметь не более одной службы, прослушивающей его. Если вы хотите прослушивать два порта (например, запустить HTTP-сервер на портах 80 и 8080), то вам нужно запустить два процесса, по одному для каждого порта.
Номера портов не зарезервированы в любом смысле - вам разрешено иметь почтовый сервер, прослушивающий порт 80, и веб-сервер на порту 25, но это будет довольно запутанным для всех. Но порты связаны со службами двумя способами:
- Существуют «общеизвестные номера» для услуг (и за списком следит Управление по присвоению номеров в Интернете). Это не оговорки как таковые, но они эффективные маркеры «оставайся чистыми». Эти номера также можно найти в файле
/etc/services
на компьютерах с Unix.
- Протокол, такой как HTTP или SMTP, обычно в своем RFC объявляет порт по умолчанию для протокола - для HTTP это порт 80, а для порта SMTP 25. Все это означает, что, например, клиент HTTP попытается подключиться к порту 80 на удаленной машине, если не указано иное.
По крайней мере, в Unix номера портов ниже 1024 являются привилегированными, поскольку только процессы, работающие от имени пользователя root, могут связываться с ними. Это не ограничение, наложенное TCP, а специфичная для Unix вещь (изначально она была задумана как очень легкая мера безопасности).
Результатом всего этого является то, что, например, если вы хотите иметь несколько веб-серверов на компьютере (или на любом другом сервисе), вы можете, если вы запускаете их, одновременно говоря им прослушивать разные порты. Это можно сделать с помощью параметра командной строки при запуске службы или записи в файле конфигурации.
У вас может быть веб-служба на порте 80 (root должен был бы запустить ее), а также некоторые другие службы на основе HTTP на порту 8080 или 9000. Первый будет адресован как http://example.org/, другой - как http://example.org:8080/. Поскольку порт 80 является задокументированным по умолчанию для HTTP, ваш веб-браузер (или любой другой клиент, который вы использовали) автоматически выберет порт 80 в первом случае.
Кстати, эти цифры 8080 и 9000 не имеют значения - это просто «традиционные» непривилегированные номера портов, которые можно использовать для альтернативных веб-сервисов; поскольку они непривилегированы, любой пользователь без полномочий root может запустить службу, прослушивающую там, если там уже нет службы.