Я написал серверное/клиентское приложение, которое запускал сначала локально, а затем через Интернет. Поэтому я настроил свой маршрутизатор так, чтобы он принимал данные через порт xxxx и перенаправлял их на мою машину, где работает мой сервер и где он принимает соединения из клиентских сокетов. Итак, все работает нормально, и клиенты могут отправлять сообщения друг другу. Итак, теперь мой вопрос: как возможно, чтобы сервер мог отправлять данные клиентам в других сетях, где переадресация портов не активирована, но когда я пытаюсь сделать это вручную, это не работает.
Я уже пытался найти информацию о том, как TCP сохраняет IP-адреса и порты, а также изучал, как работает концепция Интернета/TCP/UDP, но не нашел ответа на вопрос.
Поэтому, прежде всего, я хотел знать это, прежде чем я реализую свой сервер без переадресации портов, и было бы также полезно, если бы вы могли привести примеры кода для С++ в Windows, если у вас есть какие-либо идеи, чтобы я мог устанавливать такие соединения без переадресации портов и внешних хосты серверов в Интернете.
@RichardCritten да, я читал что-то подобное, но разве для этого не нужно, чтобы был размещенный в сети сервер, где клиенты «встречаются»? Или также возможно, что сервер работает на моей машине, и все клиенты подключаются к нему через Интернет? Также каждый раз, когда я искал что-то подобное, не было реальных примеров того, как сделать что-то подобное, были только схемы.
Перенаправление портов необходимо только для NAPT. По сути, он помещает настроенную вручную запись в таблицу NAT. Это произойдет автоматически, когда трафик будет исходить изнутри.
@RonMaupin, поэтому сервер может отправлять сообщения клиентам?
Предположим, что за NAPT стоит IPv4, тогда да, но помните, что не все так. Я знаю многих людей, которые подключают свои компьютеры напрямую к интернет-провайдеру, поэтому у них есть публичные адреса на их компьютерах и нет NAPT.
@RonMaupin Было бы теоретически возможно, если бы я просто взял адрес NAPT своего сервера и позволил клиентам подключаться к нему? Таким образом, мне не понадобится переадресация портов? Нравится de.wikipedia.org/wiki/Port_Address_Translation
Если ваш сервер адресован с помощью частного адреса, то с ним нельзя напрямую связаться через общедоступный Интернет.





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 использует адреса (порты) транспортного протокола.
@RonMaupin: OP упомянул перенаправление портов, и я использовал его в качестве справочного материала для более легкого понимания объяснения. У меня было намерение описать несвязанные понятия для краткости.
"без проблем, несмотря на то, что вы находитесь за NAT." Но вы можете быть за NAT и все будет работать корректно без проброса портов. Это NAPT, который требует переадресации портов.
@RonMaupin: этот абзац и описанный вариант использования не упоминают/не включают переадресацию портов
Вы упускаете мою мысль. NAT не использует переадресацию портов, потому что ничего не делает с портами. NAPT — это то, что должно использовать переадресацию портов. Я вижу много DMZ, использующих NAT, где для каждого адреса частного сервера есть публичный адрес. Это просто использование NAT, без преобразования портов и переадресации портов. Это просто NAT (преобразование сетевых адресов). Когда вы задействуете порты, это NAPT (преобразование сетевых адресов и портов). Терминология определена в RFC 2663.
И как долго существует эта запись? Он существует на время соединения или на более длительное время?
@RonMaupin, не могли бы вы также объяснить мне разницу между nat и nat, потому что в википедии мне кажется, что nat и nat источника / назначения почти одинаковы.
NAT заменяет один или оба (источника и получателя) сетевых адресов (уровня 3) в заголовке пакета. NAPT заменяет один или оба (источника и получателя) адресов сети (уровня 3) и транспортных адресов (уровня 4). Адреса уровня 3 — это адреса IPv4 (в IPv6 нет NAT или NAPT), а адреса уровня 4 — это порты. RFC, на который я ссылался выше, объясняет, как они работают.
В разделе 4 RFC описываются различные варианты NAT: традиционный NAT (или) исходящий NAT, базовый NAT, трансляция портов сетевых адресов (NAPT), двунаправленный NAT (или) двухсторонний NAT, двойной NAT и многосетевой NAT.
Найдите "Пробивка отверстий NAT", и вы найдете такие статьи, как stackoverflow.com/questions/23176800/….