(Для следующего я буду игнорировать любые поиски DNS или действие второго уровня, так как это не относится к истории NAT.)
Любое TCP-соединение состоит из четырех частей:
<source IP> <source port> <destination IP> <destination port>
Вкратце: IP-адрес назначения используется для получения пакета на правильном компьютере, порт назначения используется для передачи пакета на этом компьютере в правильную программу / сеанс. Исходный IP-адрес используется, чтобы знать, куда отправлять любые ответы. То же самое касается порта источника. Когда отправляется ответ, источник и пункт назначения просто меняются местами.
Начнем с двух компьютеров без NAT:
- У компьютера есть IP
1.1.1.1
- Веб-сервер имеет IP
3.3.3.3
- Стандартный порт для HTTP
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.0 - 192.168.255.255
- 172.16.0.0 - 172.31.255.255
- 10.0.0.0 - 10.255.255.255
Эти адреса нигде не указаны в таблицах интернет-маршрутизации, поэтому, если вы отправите пакет с адресатом в этих диапазонах в магистрали Интернета, они просто будут отброшены. Это потому, что миллионы людей используют одни и те же адреса. Эти адреса нужно перевести на что-то полезное для интернета. Вот где приходит трансляция сетевых адресов:
У нас есть два компьютера:
- A:
192.168.0.1
и B:192.168.0.2
- Их шлюз имеет публичный IP
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 и порту источника / назначения.