61

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

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

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

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

2 ответа2

70

Большинство домашних маршрутизаторов используют специальный случай 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.

0

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .