Я думаю, что это очень классический вопрос, но, хотя у меня есть некоторый опыт, у меня больше не хватает словарного запаса, чтобы правильно искать и понимать в Интернете.
Допустим, у меня есть домашняя сеть с 192.168.0.1 (IP.1) и 192.168.0.2 (IP.2), и мы оба играем в Counter Strike, поражая один и тот же внешний сервер.
Как мой домашний маршрутизатор узнает, какой пакет отправится на IP.1? Я часто читаю вещи с NAT и адресами xxx.xxx/y. ** Где записана часть / y в стеке TCP / IP?
Нужен ли для этого абсолютно NAT? Из статьи Википедии я понял, что NAT сделан для оптимизации IP-адресов, когда некоторые компьютеры выключены. Позволяет ли подключить 5 устройств только с одним публичным IP-адресом?
Ответы:
(Для следующего я буду игнорировать любые поиски DNS или действие второго уровня, так как это не относится к истории NAT.)
Любое TCP-соединение состоит из четырех частей:
Вкратце: IP-адрес назначения используется для получения пакета на правильном компьютере, порт назначения используется для передачи пакета на этом компьютере в правильную программу / сеанс. Исходный IP-адрес используется, чтобы знать, куда отправлять любые ответы. То же самое касается порта источника. Когда отправляется ответ, источник и пункт назначения просто меняются местами.
Начнем с двух компьютеров без NAT:
1.1.1.1
3.3.3.3
80
Когда компьютер запрашивает веб-страницу, он сначала выбирает случайный неиспользуемый номер порта из случайного диапазона (1024-65535). Давайте выберем
2345
. Затем произойдет следующая последовательность действий: компьютер отправит свой пакет с: IP-адрес1.1.1.1
источника, порт источника2345
, IP-адрес3.3.3.3
назначения, порт назначения80
. Пакеты поступают на веб-сервер, он видит свой собственный IP и порт80
, поэтому он знает, что это запрос на веб-страницу. Затем веб-сервер отправляет веб-страницу обратно в пакетах с исходным IP-адресом3.3.3.3
, исходным портом 80, целевым IP-адресом1.1.1.1
, целевым портом2345
. Компьютер получает эти пакеты и знает, для какой запрашиваемой веб-страницы это было, из-за номера порта2345
.Эти комбинации портов часто пишутся так:
1.1.1.1:2345
и3.3.3.3:80
.Теперь количество компьютеров в Интернете намного превышает число доступных адресов IPv4. Для сохранения адресного пространства был введен набор частных диапазонов адресов, которые можно свободно использовать для совместного использования адресов. Эти диапазоны упоминаются как RFC1918 и следующие:
Эти адреса нигде не указаны в таблицах интернет-маршрутизации, поэтому, если вы отправите пакет с адресатом в этих диапазонах в магистрали Интернета, они просто будут отброшены. Это потому, что миллионы людей используют одни и те же адреса. Эти адреса нужно перевести на что-то полезное для интернета. Вот где приходит трансляция сетевых адресов:
У нас есть два компьютера:
192.168.0.1
и B:192.168.0.2
1.1.1.1
.Сначала оба компьютера выбирают случайный порт: скажем,
192.168.0.1:2345
и192.168.0.2:5432
.Компьютер А отправляет свой пакет с источником
192.168.0.1:2345
и адресатом3.3.3.3:80
. Шлюз переводит этот пакет в источник1.1.1.1:2345
назначения3.3.3.3:80
и запоминает, что любые ответы на эту комбинацию отправляются192.168.0.1
. Таким образом, когда он получает ответ с источником3.3.3.3:80
и адресатом1.1.1.1:2345
, он переводит его в источник3.3.3.3:80
и пункт назначения.192.168.0.1:2345
и отправляет пакет.Компьютер B отправляет свой пакет с источником
192.168.0.2:5432
и адресатом3.3.3.3:80
. Шлюз переводит этот пакет в источник1.1.1.1:5432
назначения3.3.3.3:80
и запоминает, что любые ответы на эту комбинацию отправляются192.168.0.2
. Таким образом, когда он получает ответ с источником3.3.3.3:80
и адресатом1.1.1.1:5432
, он переводит его в источник3.3.3.3:80
и пункт назначения192.168.0.2:5432
и отправляет пакет.Если оба компьютера выбрали один и тот же номер порта источника, шлюз просто выберет другой свободный номер порта случайного источника и не забудет также перевести номер порта. Это иногда называют PAT (трансляция адреса порта). Это в основном подмножество NAT.
Есть несколько реализаций для всего этого. Шлюз может просто помнить «Компьютер X использовал порт источника Y» и пересылать что-либо с портом Y на компьютер X. Он может помнить, что Компьютер X использовал порт источника Y и пункт назначения Z »и только перенаправлять что-либо из порта Z в порт Y обратно в компьютер X. Или существует вариант, что он запоминает весь кортеж и отправляет на компьютер X только трафик, соответствующий ip и порту источника / назначения.
источник