59

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


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

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

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

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

Ответов: 2

68

Большинство домашних маршрутизаторов используют специальный случай 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 нашел бы меня, если бы я не отправил ему первоначальный запрос. Другими словами, сообщения могут достигать меня только через маршрутизатор, если я первоначально отправил запрос через маршрутизатор (26 июня 14 в 15:15)

AFAIK, NAPT и PAT и IP Masquerading одинаковы в разговорной и технической форме. И это случаи NAT. С NAT существует rfc-editor.org/rfc/rfc2663.txt традиционный NAT, базовый NAT и NAPT. (26 июня '14 в 16:25)

@Imray google.com (или что-либо еще в Интернете) не может найти ваш компьютер, если ваш компьютер не инициировал запрос. Вот почему наличие маршрутизатора повышает безопасность. (22 июля '14 в 18:27)

@ Джейсон Это опасный миф. Наличие брандмауэра повышает безопасность. Работа типичного маршрутизатора SoHo состоит в том, чтобы заставить вещи работать, а не мешать им работать. здесь для получения дополнительной информации. (22 июля '14 в 18:38)

@ Дэвид Шварц Я прочитал вашу ссылку, комментарии и чат. Во время обучения это не очень полезно на практике или в контексте этого вопроса. Как вы сами сказали, маршрутизаторы home/SOHO не используют только NAT. Итак, еще раз, если у вас есть маршрутизатор, Интернет не будет инициировать запросы с вашего ПК. (23 июля '14 в 18:24)

@Jason, что «наличие роутера добавляет много безопасности» - опасный миф, хотя иногда это может оказаться правдой. И фактически, ваше конкретное утверждение («не удается найти ваш компьютер, если ваш компьютер не инициировал запрос») является ложным - разрешающий NAT довольно распространен в маршрутизаторах SoHo, потому что он делает намного больше вещей «просто Работа'. (23 июля '14 в 18:29)

@ Джейсон Лучше не удалять свой комментарий, он делает то, что было бы полезно прочитать, а не прочитать. (11 декабря '14 в 15:42)

Хороший пример, но означает ли это, что все порты с высоким номером всегда открыты на наших маршрутизаторах? (15 февраля '15 в 15:15)

Нет. Часто функция NAT больше зависит от кода брандмауэра в маршрутизаторе, чем от обычной сетевой функции. Порт не будет в состоянии LISTEN или не будет принимать новые соединения, но как только сопоставление будет там, он может разрешить или не разрешить другим входящим пакетам использовать это сопоставление; Более новые системы обычно позволяют принимать пакеты только от той системы, к которой вы инициировали соединение. Несколько исключений из этого правила: 1) Специальная обработка для поддержки FTP-соединений откроет порты; 2) устройства UPnP могут запрашивать входящий порт; 3) Вы вручную настроили переадресацию портов для данного протокола. (16 февраля '15 в 22:40)

Просто добавьте к теме: поскольку вы не можете предсказать, какой публичный порт сгенерирует маршрутизатор, вы не можете общаться между равноправными узлами, даже если удаленный (друг) сообщит вам о своем публичном IP-адресе. Вот почему большинство маршрутизаторов имеют конфигурации «переадресации портов». Это гарантирует, что пакеты, отправленные через эти настроенные порты, останутся неизменными, и, таким образом, зная порт, вы можете иметь P2P-соединение. Удобно, если вам нужно P2P-приложение без сервера для пробивки NAT. (6 апреля '17 в 2:38)

Не было бы возможно, чтобы все устройства имели одинаковый IP-адрес? Во всяком случае, важная вещь это порт, верно? Я имею в виду любой способ, которым маршрутизатор знает MAC-адрес устройств ... (17 апреля '17 в 19:32)

Хорошее объяснение. Что я не понимаю: почему маршрутизатор генерирует новый PublicPort вместо использования PrivatePort? @Paul (11 мая '18 в 18:57)

@gedamial - Технически нет причин, по которым PublicPort и PrivatePort должны различаться, поскольку этот номер порта необходим только для одной внутренней системы за раз. На практике это не дает больших преимуществ для обычного трафика. И для реализации NAT, вероятно, будет проще просто выбрать случайный неиспользуемый порт, а не решать конфликты (две системы с одинаковым номером порта), особенно когда они происходят. В любом случае большинство исходящих подключений за PAT будут использовать случайные высокие порты (эфемерные порты), поэтому с точки зрения предсказуемости вы не сильно выиграете. (3 сентября '18 в 5:30)

Итак, каждый сделанный запрос выбирает новый порт? Это правда, потому что есть только 64 тыс. Портов, доступных для использования, что говорит мне, что я могу делать только 64 тыс. Запросов с моего компьютера (2 ноября '18 в 18:02)

@swayamraina - То, на что вы ссылаетесь, называется «исчерпание порта», и да, это возможно. На практике это может быть проблемой, только если вы создаете необычно большое количество исходящих соединений или маскируете большие сети за одним внешним IP-адресом. Точное поведение будет зависеть от реализации, но, как правило, по истечении времени таймеров соединения или срыва сеансов TCP порты освобождаются и могут повторно использоваться для различных исходящих соединений. (26 ноября '18 в 17:17)
0

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

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

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

Дополнить ответ

Server-Help.Ru - 2019. The website content is licensed CC BY NC SA 4.0. <|> Политика Конфиденциальности