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

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

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

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

решение1

Почему при отправке запроса необходимо указывать не только 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.

решение3

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

Известные службы имеют назначенные порты: 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 Pi, запускающих разные сервисы.

Связанный контент