У меня есть приличное понимание практического использования портов и как они работают. Однако у меня есть несколько вопросов, которые я хотел бы прояснить.

  1. Что произойдет, если мы отправим запрос без указания порта для сокета сервера?
  2. Есть ли способ настроить машину так, чтобы вместо того, чтобы процесс прослушивал определенный порт, у меня все запросы, отправленные на мой IP-адрес, обрабатывались одним и тем же процессом? В этом случае клиент может опустить порт в запросе.
  3. Исходя из вопроса 2, если я просто хочу запустить какой-нибудь сервер на чем-то вроде Raspberry Pi, могу ли я иметь его так, чтобы мой IP-адрес перенаправлялся на мой RPi, который обрабатывает все входящие сетевые запросы с использованием одного и того же сервера? ? То есть люди просто подключаются к IP-адресу, без номера порта, чтобы подключиться к моему серверу.

3 ответа3

3

Почему мы должны указывать номер порта в дополнение к IP при отправке запроса?

Потому что протокол TCP (и UDP) требует этого. Это часть спецификации протокола.

Что произойдет, если мы отправим запрос без указания порта для сокета сервера?

Что ж, если вы не укажете номер порта, вероятно, в этой части вызова API будут нули. Порт 0 является зарезервированным портом, и некоторые реализации используют его для обозначения порта, динамически выделяемого системой.

Есть ли способ настроить машину так, чтобы вместо того, чтобы процесс прослушивал определенный порт, у меня все запросы, отправленные на мой IP-адрес, обрабатывались одним и тем же процессом?

Нет, если вы используете протоколы транспортного уровня TCP или UDP или какие-либо протоколы прикладного уровня, построенные на них. Такие как HTTP

В некоторых операционных системах в качестве части ОС используется один процесс, но он защищает соединения с конкретными приложениями.

Могу ли я иметь его так, чтобы мой IP-адрес маршрутизировал мой RPi

Вы можете настроить маршрутизатор для маршрутизации всех входящих запросов на подключение к вашему RPI

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

Не используя стандартные протоколы, такие как HTTP.

Я думаю, что невозможно использовать стандартные API, такие как Berkely Sockets. Я полагаю, что вы могли бы с некоторыми усилиями использовать другой или новый протокол транспортного уровня вашего собственного устройства. Вам понадобятся довольно веские причины, чтобы пойти ко всем этим неудобствам.

2

Что произойдет, если мы отправим запрос без указания порта для сокета сервера?

Вы не можете, сокет является портом IP + по определению. Причина существования портов заключается в том, что несколько программ на машине могут отправлять / получать трафик, а порты используются для различения процессов на обоих концах.

Есть ли способ настроить машину так, чтобы вместо того, чтобы процесс прослушивал определенный порт, у меня все запросы, отправленные на мой IP-адрес, обрабатывались одним и тем же процессом?

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

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

если я просто хочу запустить какой-нибудь сервер на чем-то похожем на Raspberry Pi, могу ли я иметь его так, чтобы мой IP-адрес перенаправлялся на мой RPi, который обрабатывает все входящие сетевые запросы с использованием одного и того же сервера?

Ситуация по умолчанию на большинстве стандартных жилых маршрутизаторов такова, что ваш маршрутизатор игнорирует любой трафик, отправляемый извне.

Почти на всех таких маршрутизаторах вы можете выполнять переадресацию портов, которая указывает вашему маршрутизатору переадресовывать входящий трафик с определенного порта на конкретную систему в вашей частной сети за маршрутизатором.

Вы также можете указать маршрутизатору пересылать любой незапрошенный входящий трафик на определенный IP-адрес в вашей частной сети за маршрутизатором. Это называется DMZ.

1

Порты необходимы для протоколов, которые позволяют нескольким процессам взаимодействовать между серверами. Это больше, чем практическое соображение.

Хорошо известные службы имеют назначенные порты: DNS = 53, HTTP = 80, HTTPS = 443, SMTP = 25, Telnet = 23, SSH = 22, FTP = 20 и 21 и т.д. Для таких хорошо известных служб нет необходимости указывать порт, если они работают на порте, назначенном службе. Назначенные порты перечислены в /etc /services на платформах Unix /Linux.

  1. Для TCP и UDP вы не можете устанавливать соединения без порта. Заголовок содержит поля для портов источника и назначения. В этих полях всегда будет значение, даже если оно равно нулю.
  2. Можно захватить все пакеты, поступающие на интерфейс. Вот как работают такие инструменты, как tcpdump.
  3. Как отмечено в 1, все входящие запросы будут иметь номер порта. Маршрутизаторы SOHO обычно поддерживают DMZ и перенаправляют все входящие запросы, которые не маршрутизируются иначе, на IP-адрес, назначенный DMZ. В большинстве случаев вам просто нужно перенаправить порт (ы), необходимые для службы, на сервер (ваш Raspberry Pi). Это позволит вам иметь несколько Raspberry Pis с разными сервисами.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .