Хотя вопрос был полностью покрыт. Я чувствую, что этот процесс лучше всего описывать шаг за шагом.
Для этого примера я сижу в частной локальной сети, подключенной к Интернету через маршрутизатор. Поскольку наша сеть использует один публичный 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 Packet
Источник: 92.69.127.243
(мой публичный IP)
Место назначения: 64.34.119.12
(superuser.com)
Теперь та же самая игра продолжается со всеми маршрутизаторами в мире, пока пакет, наконец, не придет superuser.com
и не будет получен ответ.
Ответ
Ответ IP Packet
Источник: 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 от 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
(порт, составленный моим компьютером)