Можно ли обратиться к сокету сервера/клиента в другой сети? (С++)

Я написал серверное/клиентское приложение, которое запускал сначала локально, а затем через Интернет. Поэтому я настроил свой маршрутизатор так, чтобы он принимал данные через порт xxxx и перенаправлял их на мою машину, где работает мой сервер и где он принимает соединения из клиентских сокетов. Итак, все работает нормально, и клиенты могут отправлять сообщения друг другу. Итак, теперь мой вопрос: как возможно, чтобы сервер мог отправлять данные клиентам в других сетях, где переадресация портов не активирована, но когда я пытаюсь сделать это вручную, это не работает.

Я уже пытался найти информацию о том, как TCP сохраняет IP-адреса и порты, а также изучал, как работает концепция Интернета/TCP/UDP, но не нашел ответа на вопрос.

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

Найдите "Пробивка отверстий NAT", и вы найдете такие статьи, как stackoverflow.com/questions/23176800/….

Richard Critten 28.04.2019 01:24

@RichardCritten да, я читал что-то подобное, но разве для этого не нужно, чтобы был размещенный в сети сервер, где клиенты «встречаются»? Или также возможно, что сервер работает на моей машине, и все клиенты подключаются к нему через Интернет? Также каждый раз, когда я искал что-то подобное, не было реальных примеров того, как сделать что-то подобное, были только схемы.

MaestroD 28.04.2019 01:31

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

Ron Maupin 28.04.2019 01:31

@RonMaupin, поэтому сервер может отправлять сообщения клиентам?

MaestroD 28.04.2019 01:32

Предположим, что за NAPT стоит IPv4, тогда да, но помните, что не все так. Я знаю многих людей, которые подключают свои компьютеры напрямую к интернет-провайдеру, поэтому у них есть публичные адреса на их компьютерах и нет NAPT.

Ron Maupin 28.04.2019 01:40
Этот ответ содержит некоторую информацию о NAT/NAPT и недостатках.
Ron Maupin 28.04.2019 01:45

@RonMaupin Было бы теоретически возможно, если бы я просто взял адрес NAPT своего сервера и позволил клиентам подключаться к нему? Таким образом, мне не понадобится переадресация портов? Нравится de.wikipedia.org/wiki/Port_Address_Translation

MaestroD 28.04.2019 01:52

Если ваш сервер адресован с помощью частного адреса, то с ним нельзя напрямую связаться через общедоступный Интернет.

Ron Maupin 28.04.2019 01:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
357
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
Clint -> NAT (router) -> ... -> NAT (router) -> server

Когда клиент отправляет сообщение (это может быть попытка подключения в случае TCP или просто сообщение, если это UDP), его NAT не блокирует его и запоминает, с какого локального адреса: порта оно приходит и на какой адрес: порт идет к: [client address:port, server address:port]. Когда сообщение достигает NAT сервера, NAT знает о вашем сервере, потому что вы настроили «переадресацию портов» и передает сообщение в локальную сеть. Теперь, когда сервер отправляет сообщение обратно клиенту и оно достигает NAT клиента, NAT проверяет свою внутреннюю таблицу, находит запись для этой конкретной server address:port, извлекает client address:port часть и передает ему сообщение. Так что все работает так, как ожидалось.

Вот почему обычно, когда вы открываете браузер и переходите по какой-либо веб-ссылке, вы без проблем получаете ответ сервера с веб-страницей, несмотря на то, что вы находитесь за NAT.

Это упрощенное объяснение, в котором опущены данные о локальном/глобальном адресе и порте.

Перенаправление портов необходимо только для NAPT, а не для базового NAT. Именно NAPT использует адреса (порты) транспортного протокола.

Ron Maupin 28.04.2019 02:00

@RonMaupin: OP упомянул перенаправление портов, и я использовал его в качестве справочного материала для более легкого понимания объяснения. У меня было намерение описать несвязанные понятия для краткости.

Andriy Tylychko 28.04.2019 02:03

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

Ron Maupin 28.04.2019 02:05

@RonMaupin: этот абзац и описанный вариант использования не упоминают/не включают переадресацию портов

Andriy Tylychko 28.04.2019 02:08

Вы упускаете мою мысль. NAT не использует переадресацию портов, потому что ничего не делает с портами. NAPT — это то, что должно использовать переадресацию портов. Я вижу много DMZ, использующих NAT, где для каждого адреса частного сервера есть публичный адрес. Это просто использование NAT, без преобразования портов и переадресации портов. Это просто NAT (преобразование сетевых адресов). Когда вы задействуете порты, это NAPT (преобразование сетевых адресов и портов). Терминология определена в RFC 2663.

Ron Maupin 28.04.2019 02:13

И как долго существует эта запись? Он существует на время соединения или на более длительное время?

MaestroD 28.04.2019 10:07

@RonMaupin, не могли бы вы также объяснить мне разницу между nat и nat, потому что в википедии мне кажется, что nat и nat источника / назначения почти одинаковы.

MaestroD 28.04.2019 10:25

NAT заменяет один или оба (источника и получателя) сетевых адресов (уровня 3) в заголовке пакета. NAPT заменяет один или оба (источника и получателя) адресов сети (уровня 3) и транспортных адресов (уровня 4). Адреса уровня 3 — это адреса IPv4 (в IPv6 нет NAT или NAPT), а адреса уровня 4 — это порты. RFC, на который я ссылался выше, объясняет, как они работают.

Ron Maupin 28.04.2019 17:58

В разделе 4 RFC описываются различные варианты NAT: традиционный NAT (или) исходящий NAT, базовый NAT, трансляция портов сетевых адресов (NAPT), двунаправленный NAT (или) двухсторонний NAT, двойной NAT и многосетевой NAT.

Ron Maupin 28.04.2019 18:05

Другие вопросы по теме