Как маршрутизатор узнает, куда направить пакет

68

Если к маршрутизатору подключено несколько компьютеров с локальными адресами (192.168.0. #), И каждый компьютер открывает веб-браузер и запрашивает страницу по HTTP, при отправке этих пакетов TCP: 80 маршрутизатор переключает локальный адрес с помощью статический IP-адрес маршрутизатора (т.е. IP-адрес, предоставленный провайдером), поэтому сервер может ответить на соответствующий адрес.

Но как маршрутизатор узнает, на какой компьютер пересылать ответ HTTP, поскольку заголовок TCP не содержит локальный IP-адрес (не так ли?), И все компьютеры используют порт 80?

Это как-то связано с MAC-адресами?

Как именно это работает?

Корнелие Петак
источник

Ответы:

78

Большинство домашних маршрутизаторов используют специальный случай NAT, называемый PAT.

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

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

Например, допустим, у вас есть клиентский компьютер, который переходит на www.google.com. Ваш компьютер (например, 192.168.1.100) ищет этот адрес и устанавливает TCP-соединение с 72.14.204.147 на порту 80 с вашего внутреннего IP-адреса, используя случайный исходный порт.

К вашему компьютеру соединение выглядит так:

192.168.1.100:37641   <-->  72.14.204.147:80

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

PrivateIP        PrivatePort   PublicIP      PublicPort    Remote          RemotePort
-------------    ----------    -----------   -----------   ----------      -----------
192.168.1.100    37641         *10.6.23.5    59273         72.14.204.147   80

* В качестве примера я использовал адрес, начинающийся с 10, но он не является общедоступным. Таблица также несколько упрощена.

Для Google соединение выглядит так:

10.6.23.5:59273   <-->  72.14.204.147:80

Google отправит ответ на 10.6.23.5 через порт 59273. Затем ваш маршрутизатор ищет эту информацию в таблице и пересылает пакет на 192.168.1.100:37641.

Павел
источник
3
Таким образом, чтобы подвести итог, Маршрутизатор использует номера портов, чтобы запомнить, что из внешней локальной сети идет к тому, что внутри сети. Тем не менее, это не объясняет, как www.google.comбы я нашел его, если бы я не отправил ему первоначальный запрос. Другими словами, сообщения могут достигать меня только через маршрутизатор, если я первоначально отправил запрос через маршрутизатор
CodyBugstein
2
@Imray google.com (или что-либо еще в Интернете) не может найти ваш компьютер, если ваш компьютер не инициировал запрос. Вот почему наличие маршрутизатора повышает безопасность.
Джейсон
6
@ Джейсон Это опасный миф. Наличие брандмауэра повышает безопасность. Работа типичного маршрутизатора SoHo состоит в том, чтобы заставить вещи работать, а не мешать им работать. Смотрите здесь для получения дополнительной информации.
Дэвид Шварц
1
@ Джейсон Лучше не удалять свой комментарий, он делает то, что было бы полезно прочитать, а не прочитать.
Барлоп
2
Хороший пример, но означает ли это, что все порты с большим количеством номеров всегда открыты на наших маршрутизаторах?
jiggunjer
1

Маршрутизаторы между локальной сетью и остальной частью Интернета используют технику, называемую NAT.

Просто отрывок из иллюстрированного тома TCP / IP 1 о NAPT, в котором рассказывается о недостатках его простого кузена, Basic NAT:

Базовый NAT выполняет перезапись только IP-адресов. По сути, частный адрес переписывается как публичный, часто из пула или диапазона публичных адресов, предоставляемых провайдером. Этот тип NAT не является самым популярным, потому что он не помогает резко сократить потребность в IP-адресах - количество глобально маршрутизируемых адресов должно равняться или превышать количество внутренних хостов, которые хотят получить доступ к Интернету одновременно. Гораздо более популярный подход, NAPT включает использование идентификаторов транспортного уровня (т. Е. Портов для TCP и UDP, идентификаторов запросов для ICMP), чтобы различать, какой хост на частной стороне NAT связан с конкретным пакетом (см. Рисунок 7- 4). Это позволяет большое количество внутренних хостов (т.е. несколько тысяч) для одновременного доступа к Интернету с использованием ограниченного числа публичных адресов, часто только одного. Мы будем обычно использовать термин NAT для включения как традиционных NAT, так и NAPT, если различие не является важным в конкретном контексте.

CodyBugstein
источник