Как пакеты IP-ответа достигают своего адресата внутри частной локальной сети?

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

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

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

Надеюсь, кто-то может дать мне пару подсказок или связать меня с некоторой информацией, которая могла бы объяснить это. Благодарю.

EDIT: Я думаю, я должен уточнить. Пример того, что я прошу, будет примерно таким:
1. Компьютер внутри локальной сети с одним внешним IP пытается загрузить веб-страницу с веб-сервера за пределами этой локальной сети (в основном в Интернете)
2. Веб-сервер отвечает и отправляет веб-страницу обратно на этот компьютер.

Что меня смущает, так это то, как маршрутизатор знает, какой компьютер отправляет входящие данные (при условии, что маршрутизатор подключен к локальной сети с несколькими компьютерами) без предварительной переадресации портов.

Хотя вопрос был полностью охвачен. Я чувствую, что этот процесс лучше всего описывать шаг за шагом.

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

Поэтому, когда я запрашиваю страницу superuser.com которая будет генерировать много IP-пакетов. Давайте посмотрим на одну.

IP-пакет
Источник: 192.168.1.12 (мой IP)
Пункт назначения: 64.34.119.12 (superuser.com)

Теперь моя система, скорее всего, настроена аналогично той, о которой идет речь. У меня есть собственный IP-адрес ( 192.168.1.12 ), маска подсети ( 255.255.255.0 ) и шлюз по умолчанию ( 192.168.1.1 ). Теперь, поскольку поле « Место назначения» в моем IP-пакете указывает на сеть, отличную от моей, она отправляется на мой основной шлюз (а не непосредственно на компьютер).

Но как пакет может попасть в шлюз по умолчанию, если пункт назначения куда-то совсем другой?

Ethernet

Это легко, потому что для этого мы используем адресацию протокола Ethernet. Мы просто устанавливаем IP-адрес назначения в IP-пакет и MAC-адрес нашего шлюза по умолчанию в качестве адресата в Ethernet-кадре .

Теперь убедитесь, что наш шлюз по умолчанию получает пакет для superuser.com . Ура!

Теперь шлюз имеет наш пакет и может отправить его прямо на своем пути. Но чтобы убедиться, что он получит ответ, сначала нужно заменить адрес источника пакета (иначе superuser.com попытается отправить ответ на какое-то (возможно) несуществующее устройство с моим IP-адресом в их сети. Не очень приятно.)
Поэтому мой маршрутизатор разместит свой публичный IP-адрес в поле « Источник» :

IP-пакет
Источник: 92.69.127.243 (мой публичный IP)
Пункт назначения: 64.34.119.12 (superuser.com)

Теперь эта же игра продолжается и продолжается со всеми маршрутизаторами в мире, пока пакет, наконец, не прибудет на superuser.com и не будет создан ответ.

Ответ

Ответ IP-пакет
Источник: 64.34.119.12 (superuser.com)
Назначение: 92.69.127.243 (мой публичный IP)

Хорошо, ответ дошел до моего маршрутизатора, что теперь? Как мой маршрутизатор теперь знает, чтобы отправить ответ на 192.168.1.12 ?

TCP

Ну, это действительно работает, потому что мы только посмотрели на IP и Ethernet части сообщения. Что делает эту работу частью TCP.

Вы, скорее всего, знаете, что веб-серверы обычно работают на порту 80 . IP не имеет понятия портов . Это происходит из TCP . В TCP мы имеем (как в IP) порт источника и назначения .

Мой TCP-пакет для superuser.com
Источник: 192.168.1.12 (мой IP)
Исходный порт: 11111 (порт моего компьютера)
Пункт назначения: 64.34.119.12 (superuser.com)
Порт назначения: 80

Когда ваш маршрутизатор отправляет этот первоначальный пакет (который адресован superuser.com на порту 80 ), он поставит там новый порт источника (например, 12345 ).
И это важная часть! Он запомнит эту замену!

Пакет TCP моего маршрутизатора на superuser.com
Источник: 92.69.127.243 (мой публичный IP)
Исходный порт: 12345 (порт, который мой маршрутизатор)
Пункт назначения: 64.34.119.12 (superuser.com)
Порт назначения: 80

Таким образом, пакет ответа, полученный маршрутизатором, выглядит следующим образом:
Ответ TCP-пакета от superuser.com
Источник: 64.34.119.12 (superuser.com)
Порт источника: 80
Назначение: 92.69.127.243 (мой публичный IP)
Порт назначения: 12345 (порт мой маршрутизатор)

Итак, теперь он получает этот пакет и видит, что он для порта, который он ранее запомнил, был назначен для операций NAT для IP-адреса 192.168.1.12 (мой IP-адрес).

Ответ TCP-пакета с моего маршрутизатора
Источник: 64.34.119.12 (superuser.com)
Порт источника: 80
Назначение: 192.168.1.12 (мой IP)
Порт назначения: 11111 (порт моего компьютера)

Трансляция сетевых адресов . Вкратце, когда маршрутизатор шлюза частной локальной сети заменяет собственный адрес источника локальной сети своим собственным общедоступным адресом, он каким-то образом модифицирует пакет, например, присваивает уникальный и иначе локально бессмысленный номер порта, который он сопоставляет с исходным узлом локальной сети и исходящим запросом , Он запоминает это сопоставление портов, поэтому, когда ответ возвращается к общедоступному IP / уникальному порту #, он (маршрутизатор) знает, как отменить его обратно на один из его исходных узлов. Также вы можете запускать несколько вкладок, браузеров или экземпляров браузера, а ответы на каждый запрос браузера возвращаются к правильному браузеру и вкладке.

Когда исходный пакет поступает на внешний интерфейс маршрутизатора, он изменяет целевой IP-адрес пакета в соответствии с конфигурацией переадресации портов и передает измененный пакет на внутренний интерфейс маршрутизатора (после обычного ARP, если необходимо)

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

Обратите внимание, что на каждом сетевом уровне есть разные цели.

Переадресация портов обычно выполняется на маршрутизаторе или устройстве, расположенном рядом с ним. Когда устройство в локальной сети отправляет трафик на другое устройство в той же локальной сети, маршрутизатор вообще не задействован. Движение даже не трогает его. Правила пересылки вашего порта не будут влиять на трафик LAN-to-LAN.

Ethernet был спроектирован с топологией «шины», в которой каждый компьютер был физически подключен к той же среде. В то время как современные коммутаторы оптимизируют поток трафика, изучая MAC-адрес на другом конце порта и реплицируя трафик соответственно, топология «шины» все еще остается. Все, что связано со стандартным коммутатором, может «напрямую» достигать чего угодно (при условии, что оно находится в пределах одной подсети) без необходимости «проходить» промежуточное устройство, такое как маршрутизатор.

Вы можете быть смущены, если устройство, к которому вы подключаете все компьютеры, имеет несколько портов локальной сети LAN, а затем один порт «WAN». Эти типы устройств на самом деле являются маршрутизаторами и коммутаторами в одном корпусе.

Итак, внутри вашей локальной сети, если ваш HTTP-сервер имеет адрес 192.168.1.55, чтобы добраться до него внутри вашей локальной сети, вам нужно будет ввести « http://192.168.1.55 » в адресной строке браузера. Маршрутизатор никогда не видит этого. Чтобы достичь этого за пределами вашей локальной сети, вам понадобится ввести внешний IP-адрес, то есть « http://256.99.88.77 : {порт, который вы переадресовали здесь]» или что бы это ни было. Это касается вашего маршрутизатора, функция NAT маршрутизатора работает на нем, а затем маршрутизатор отправляет его на 192.168.1.55.

Вполне просто, когда компьютер внутри частной локальной сети инициирует исходящее соединение, NAT-шлюз автоматически создает для него сопоставление портов. Они примерно совпадают с сопоставлениями портов, которые вы ввели вручную: {public port, private address, private port} и используются примерно одинаково. Самая большая разница с динамическими сопоставлениями заключается в том, что шлюз NAT часто должен произвольно назначать общедоступные порты для сопоставлений, когда ожидаемый номер порта уже используется.

  • Что такое TCP Half Open Connection и TCP half closed connection
  • UDP против TCP, насколько быстрее это?
  • Какие порты используются приложением
  • Обнаружение отключения клиента TCP
  • Java TCP-сокет: передача данных медленная
  • Boost :: Asio: io_service.run () vs poll () или как интегрировать boost :: asio в mainloop
  • Что означают номера, используемые в адресе IPV6?
  • Каков правильный способ чтения из сокета TCP в C / C ++?
  • Это тот же порт, что и клиент и сервер?
  • Изменяется ли порт, когда TCP-соединение принимается сервером?
  • Проверить скрипт оболочки, если удаленный TCP-порт открыт
  • Давайте будем гением компьютера.