Хотя вопрос был полностью покрыт. Я чувствую, что этот процесс лучше всего описывать шаг за шагом.
Для этого примера я сижу в частной локальной сети, подключенной к Интернету через маршрутизатор. Поскольку наша сеть использует один публичный IP-адрес, мы используем NAT.
Поэтому, когда я запрашиваю страницу superuser.com
которая будет генерировать много IP-пакетов. Давайте посмотрим на один.
IP-пакет
Источник: 192.168.1.12
(мой IP)
Пункт назначения: 64.34.119.12
(superuser.com)
Теперь моя система, скорее всего, настроена аналогично той, о которой идет речь. У меня есть собственный IP-адрес (192.168.1.12
), маска подсети (255.255.255.0
) и шлюз по умолчанию (192.168.1.1
). Теперь, поскольку мое поле Destination в моем IP-пакете указывает на сеть, отличную от моей, оно отправляется на мой шлюз по умолчанию (а не на компьютер напрямую).
Но как пакет может добраться до шлюза по умолчанию, если пункт назначения указывает куда-то еще?
Ethernet
Это легко, потому что мы используем для этого адресацию протокола Ethernet. Мы просто устанавливаем наш IP-адрес назначения в пакете IP и MAC-адрес нашего шлюза по умолчанию в качестве пункта назначения в кадре Ethernet.
Теперь это гарантирует, что наш шлюз по умолчанию получит пакет для superuser.com
. Ура!
Теперь шлюз имеет наш пакет и может отправить его прямо на своем пути. Но чтобы убедиться, что он получит ответ, сначала нужно заменить адрес источника пакета (в противном случае superuser.com
попытается отправить ответ на какое-то (возможно) несуществующее устройство с моим IP-адресом в их сети. Теперь это было бы не очень приятно.)
Таким образом, мой маршрутизатор разместит свой публичный IP-адрес в поле Source :
IP-пакет
Источник: 92.69.127.243
(мой публичный IP)
Пункт назначения: 64.34.119.12
(superuser.com)
Теперь та же самая игра продолжается со всеми маршрутизаторами в мире, пока пакет наконец не прибудет на superuser.com
и не будет получен ответ.
Ответ
Пакет ответа IP
Источник: 64.34.119.12
(superuser.com)
Назначение: 92.69.127.243
(мой публичный IP)
Хорошо, ответ дошел до моего роутера, что теперь? Как теперь мой маршрутизатор узнает, что нужно отправить ответ на 192.168.1.12
?
TCP
Ну, на самом деле это работает, потому что мы рассмотрели только IP и Ethernet части коммуникации. То, что делает эту работу, является частью TCP.
Скорее всего, вы знаете, что веб-серверы обычно работают на порту 80
. IP не имеет понятия о портах . Это происходит от TCP . В TCP у нас (как и в IP) есть порт источника и назначения .
Мой TCP пакет на superuser.com
Источник: 192.168.1.12
(мой IP)
Порт источника: 11111
(порт, который сделал мой компьютер)
Пункт назначения: 64.34.119.12
(superuser.com)
Порт назначения: 80
Когда ваш маршрутизатор отправит этот начальный пакет (который адресован superuser.com
на порт 80
), он установит новый порт источника (например, 12345
).
И это важная часть! Он запомнит эту замену!
TCP-пакет моего маршрутизатора к superuser.com
Источник: 92.69.127.243
(мой публичный IP)
Исходный порт: 12345
(порт, который создал мой маршрутизатор)
Пункт назначения: 64.34.119.12
(superuser.com)
Порт назначения: 80
Таким образом, пакет ответа, полученный маршрутизатором, на самом деле выглядит так:
Ответ TCP Packet от superuser.com
Источник: 64.34.119.12
(superuser.com)
Порт источника: 80
Назначение: 92.69.127.243
(мой публичный IP)
Порт назначения: 12345
(порт, который создал мой маршрутизатор)
Поэтому теперь он получает этот пакет и видит, что для порта, который он помнил ранее, был назначен операциям NAT для IP-адреса 192.168.1.12
(мой IP-адрес).
Ответь TCP Packet с моего роутера
Источник: 64.34.119.12
(superuser.com)
Порт источника: 80
Назначение: 192.168.1.12
(мой IP)
Порт назначения: 11111
(порт, составленный моим компьютером)