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

30019
Kornelije Petak

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

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

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

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

58

2 ответа на вопрос

67
Paul

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

Таким образом, чтобы подвести итог, Маршрутизатор использует номера портов для запоминания того, что снаружи локальной сети идет к тому, что внутри сети. Тем не менее, это не объясняет, каким образом `www.google.com` нашел бы меня, если бы я не отправил ему первоначальный запрос. Другими словами, сообщения могут достигать меня только через маршрутизатор, если я первоначально отправил запрос через маршрутизатор CodyBugstein 10 лет назад 3
AFAIK, NAPT и PAT и IP Masquerading одинаковы в разговорной и технической форме. И это случаи NAT. С NAT есть https://www.rfc-editor.org/rfc/rfc2663.txt традиционный NAT, базовый NAT и NAPT. barlop 10 лет назад 0
@Imray google.com (или что-либо еще в Интернете) не может найти ваш компьютер, если ваш компьютер не инициировал запрос. Вот почему наличие маршрутизатора повышает безопасность. Jason 10 лет назад 2
@ Джейсон Это опасный миф. Наличие * брандмауэра * повышает безопасность. Работа типичного маршрутизатора SoHo состоит в том, чтобы заставить вещи работать, а не мешать им работать. См. [Здесь] (http://security.stackexchange.com/a/8773/4295) для получения дополнительной информации. David Schwartz 10 лет назад 4
@ Дэвид Шварц Я прочитал вашу ссылку, комментарии и чат. Во время обучения это не очень полезно на практике или в контексте этого вопроса. Как вы сами сказали, маршрутизаторы home / SOHO не используют только NAT. Итак, еще раз, если у вас есть маршрутизатор, интернет не будет инициировать запросы с вашего ПК. Jason 10 лет назад 0
@Jason, что «наличие роутера добавляет много безопасности» - опасный миф, хотя иногда это может оказаться правдой. И фактически, ваше конкретное утверждение («не удается найти ваш компьютер, если ваш компьютер не инициировал запрос») является ложным - разрешающий NAT довольно распространен в маршрутизаторах SoHo, потому что он делает намного больше вещей «просто Работа'. David Schwartz 10 лет назад 0
@ Джейсон Лучше не удалять свой комментарий, он делает то, что было бы полезно прочитать, а не прочитать. barlop 9 лет назад 1
Хороший пример, но означает ли это, что все порты с большим количеством номеров всегда открыты на наших маршрутизаторах? jiggunjer 9 лет назад 2
Нет. Часто функция NAT больше зависит от кода брандмауэра в маршрутизаторе, чем от обычной сетевой функции. Порт не будет в состоянии LISTEN или не будет принимать новые соединения, но как только сопоставление будет там, он может разрешить или не разрешить другим входящим пакетам использовать это сопоставление; Более новые системы обычно позволяют принимать пакеты только от той системы, к которой вы инициировали соединение. Несколько исключений из этого правила: 1) Специальная обработка для поддержки FTP-соединений откроет порты; 2) устройства UPnP могут запрашивать входящий порт; 3) Вы вручную настроили переадресацию портов для данного протокола. Paul 9 лет назад 1
Просто добавьте к теме: поскольку вы не можете предсказать, какой публичный порт сгенерирует маршрутизатор, вы не можете общаться между равноправными узлами, даже если удаленный (друг) сообщит вам о своем общедоступном IP-адресе. Вот почему большинство маршрутизаторов имеют конфигурации переадресации портов. Он гарантирует сохранение пакетов, отправленных через эти настроенные порты, без изменений, и, таким образом, зная порт, вы можете иметь P2P-соединение. Удобно, если вам нужно P2P-приложение без сервера для пробивки NAT. Icebone1000 7 лет назад 0
Не было бы возможно, чтобы все устройства имели одинаковый IP-адрес? во всяком случае, важная вещь это порт, верно? Я имею в виду, любой, как маршрутизатор знает MAC-адрес устройств ... Pablito 7 лет назад 0
Хорошее объяснение. Что я не понимаю: почему маршрутизатор генерирует новый PublicPort вместо использования PrivatePort? @Павел gedamial 6 лет назад 0
@gedamial - Технически нет причин, по которым PublicPort и PrivatePort должны различаться, поскольку этот номер порта необходим только для одной внутренней системы за раз. На практике это не дает больших преимуществ для обычного трафика. И для реализации NAT, вероятно, будет проще просто выбрать случайный неиспользуемый порт, а не решать конфликты (две системы с одинаковым номером порта), особенно когда они происходят. В любом случае большинство исходящих подключений за PAT будут использовать случайные высокие порты (эфемерные порты), поэтому вы не сильно выиграете в плане предсказуемости. Paul 6 лет назад 0
Итак, каждый сделанный запрос выбирает новый порт? Это правда, потому что только 64k портов доступны для использования, что говорит мне, что я могу делать только 64k запросов с моего компьютера swayamraina 6 лет назад 0
@swayamraina - То, на что вы ссылаетесь, называется «исчерпание порта», и да, это возможно. На практике это может быть проблемой, только если вы создаете необычно большое количество исходящих соединений или маскируете большие сети под одним внешним IP-адресом. Точное поведение будет зависеть от реализации, но, как правило, по истечении времени таймеров соединения или срыва сеансов TCP порты освобождаются и могут использоваться повторно для разных исходящих соединений. Paul 5 лет назад 0
0
CodyBugstein

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

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

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

Похожие вопросы