Оглавление
На техническом собеседовании или где-либо еще часто задаваемые вопросы: что происходит, когда вы вводите URL-адрес в браузер? Что происходит за кулисами, когда вы просматриваете веб-сайт? Что включает в себя типичный жизненный цикл HTTP-соединения? Я постараюсь ответить на эти вопросы в меру своих знаний.
Прежде чем углубиться в процесс подключения, давайте рассмотрим базовую модель OSI (модель взаимодействия открытых систем). Модель OSI — это концептуальная модель, которая стандартизирует связь между двумя системами — одной, из которой исходит запрос (клиент), и другой, которая обслуживает запрос и отправляет ответ обратно (сервер). В таблице ниже показаны некоторые важные характеристики каждого слоя.
Нет | Слой | Аппаратное обеспечение | Функция | Протоколы/Приложения | Дополнения |
---|---|---|---|---|---|
7 | Приложение | Сервер/ПК | Приложения, Пользовательский интерфейс | HTTP, SMTP, DNS | Заголовок L7 |
6 | Презентация | Сервер/ПК | Обрабатывает шифрование и изменения синтаксиса. | JPEG, MP3 | Заголовок L6 |
5 | Сессия | Сервер/ПК | Аутентификация, разрешения, сеансы | SCP, планирование ОС | Заголовок L5 |
4 | Транспорт | Брандмауэр | Комплексная доставка, контроль ошибок | TCP, UDP | Заголовок L4 |
3 | Сеть | Маршрутизаторы | Сетевая адресация, маршрутизация, коммутация | ИП | Заголовок L3 |
2 | Ссылка на данные | Переключатели | Физический адрес, обнаружение ошибок, поток | Ethernet, Ретрансляция кадров | Заголовок/трейлер L2 |
1 | Физический | Кабели | Бит передается по физической сети | ОВОС/ТИА | Заголовок L1 |
Как только вы введете URL-адрес в браузер и нажмете клавишу ввода/возврата, браузер (или любой клиент в этом отношении) проанализирует URL-адрес [1] для извлечения из него важных компонентов. Пример URL-адреса приведен ниже:
https://www.google.com/search?q=cats
Здесь мы просто ищем кошек в Google. Из приведенного выше URL-адреса https://
— это протокол, google.com
— это хост на www
(Интернет), /search
— это параметр пути, а ?q=cats
— это параметр строки запроса, который означает, что мы запрашиваем у Google кошек [ 2].
Теперь, поскольку браузер знает хост, к которому он пытается подключиться (в данном случае google.com
), он попытается получить соответствующие IP-адреса. Такие домены, как « .com» или « .org», были созданы для того, чтобы мы могли легко их запомнить. Но чтобы браузер отправил реальный запрос, скажем, на google.com, ему нужен IP-адрес хоста. Разрешение DNS помогает нам получить информацию об IP-адресе для данного доменного имени. DNS находится на уровне приложения (L7) из приведенной выше таблицы.
Шаги по разрешению DNS:
$ ipconfig /displaydns
в Windows или $ log stream --predicate 'process == "mDNSResponder"' --info
в mac/linux..com
, .org
и т. д. — это доменные имена верхнего уровня. Имя TLD затем будет возвращать IP-адрес авторитетного сервера(ов) имен.$ dig google.com
; << >> DiG 9.10.6 <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14345
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 9
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 180 IN A 172.217.164.174
;; AUTHORITY SECTION:
google.com. 60552 IN NS ns1.google.com.
google.com. 60552 IN NS ns2.google.com.
google.com. 60552 IN NS ns3.google.com.
google.com. 60552 IN NS ns4.google.com.
;; ADDITIONAL SECTION:
ns1.google.com. 60438 IN A 216.239.32.10
ns1.google.com. 58273 IN AAAA 2001:4860:4802:32::a
ns2.google.com. 60438 IN A 216.239.34.10
ns2.google.com. 131763 IN AAAA 2001:4860:4802:34::a
ns3.google.com. 163770 IN A 216.239.36.10
ns3.google.com. 60541 IN AAAA 2001:4860:4802:36::a
ns4.google.com. 75597 IN A 216.239.38.10
ns4.google.com. 60541 IN AAAA 2001:4860:4802:38::a
;; Query time: 13 msec
;; SERVER: 10.4.4.10#53(10.4.4.10)
;; WHEN: Mon Jun 24 12:20:50 PDT 2019
;; MSG SIZE rcvd: 303
На каждом уровне модели OSI информация называется PDU (блок пакетных данных). Таким образом, информация на уровне приложений называется PDU L7, а информация на сетевом уровне называется PDU L3. На каждом уровне добавляется соответствующий заголовок слоя. Заголовок предшествует его телу и содержит адресацию и другие данные, необходимые для достижения намеченного пункта назначения. С другой стороны, данные передаются с самого верхнего уровня вниз. Заголовки L4, L3 и L2 показаны ниже:
Прежде чем пакет будет отправлен в Интернет и наконец достигнет сервера домена Google, его сначала необходимо маршрутизировать через маршрутизатор. Всякий раз, когда устройству необходимо физически подключиться к другому устройству (в данном случае к локальному маршрутизатору), ему необходим MAC-адрес (аппаратный адрес) этого устройства. Но как локальная машина узнает, что маршрутизатор является маршрутом по умолчанию? Эта информация получается через маршрут по умолчанию, настроенный для каждого интерфейса на локальном компьютере. Вы можете проверить маршрут по умолчанию, используя команду $ ifconfig
.
IP-адрес используется для определения местоположения устройства в сети, тогда как MAC-адрес используется для идентификации фактического устройства. Протокол ARP используется для получения MAC-адреса устройства, зная IP-адрес. Здесь мы будем считать, что запрашивающая машина уже получила IP-адрес (статически или по протоколу DHCP).
ARP находится на канальном уровне модели OSI. В этом случае веб-браузер, работающий на локальном компьютере, подключится к маршрутизатору, который является шлюзом в Интернет.
arp -a
.Затем пакеты направляются по маршруту по умолчанию. Если у вас не установлен маршрут по умолчанию, они будут перенаправлены на маршрутизатор. Вы можете проверить маршрут по умолчанию с помощью команды
route get default | grep gateway
или netstat -rn
на Mac/Linux или ipconfig
на Windows.
Например, если вы находитесь в сети 192.168.10.0/24 и пытаетесь подключиться к сети Google по адресу 172.217.164.174/24, например, когда пакет приходит на маршрутизатор, маршрутизатор проверит таблицу маршрутизации и решит, как направить трафик на достичь сети назначения. Следовательно, он отправит пакет на указанный шлюз для достижения пункта назначения 172.217.164.174/24.
Соединение между клиентом и сервером; в этом случае с вашего локального компьютера на сервер Google требуется много переходов. По сути, каждый переход представляет собой маршрутизатор на пути к месту назначения. Маршрутизатор здесь помогает запросу перейти из одной сети в другую. Каждое устройство на своем пути имеет MAC-адрес (аппаратный адрес), который является уникальным во всем мире.
Теперь локальный компьютер создает запрос с заголовком L7 (HTTP), заголовком L4 (TCP), заголовком L3 (IP), заголовком L2 (ARP, MAC-адреса), трейлером L2 (последовательность проверки кадра) и фактическими данными. Когда маршрутизатор получает пакет, он декапсулирует, изменяет заголовок/трейлер L2 и снова инкапсулирует пакет.
Теперь маршрутизатор получает его и начинает декапсулировать. Он просматривает заголовок L2 и видит, что целевой Mac предназначен для себя. Теперь он удаляет заголовок L2, а теперь смотрит заголовок L3 и понимает, что запрос адресован не ему самому, а серверу Google. Затем маршрутизатор уменьшает значение TTL, которое находится внутри заголовка L3. Маршрутизатор теперь просматривает свою таблицу маршрутизации на предмет всех возможных маршрутов, которые другие маршрутизаторы объявили бы этому маршрутизатору (через RIP или IGP), чтобы определить, как добраться до места назначения. Затем один маршрутизатор выполняет ARP, чтобы получить MAC-адрес маршрутизатора следующего перехода, если у него нет MAC-адреса в его кэше.
Затем Router также добавляет CRC, который передается в трейлер L2. Это помогает следующему маршрутизатору узнать, что на маршрутах не возникло проблем, которые привели бы к повреждению пакета по проводу. Если он поврежден, кадр будет удален.
В этом случае маршрутизатор изменил заголовок L2 и концевик L2, но не затронул заголовок L3 и, следовательно, не затронул заголовок над ним.
Номер исходного порта. будет эфимерным номером порта, а номер порта назначения будет 80.
TCP — Надежный и единый сервис. Первое, что сделает локальная машина, — это установит трехстороннее рукопожатие с сервером Google, поскольку теперь ей известен маршрут к серверу. Установление соединения помогает завершить работу с некоторыми переменными состояния, такими как размер MSS, начальный порядковый номер, тип ACK, размер буфера и т. д.
В этом случае порт источника, а также порт назначения в TCP-заголовке имеют длину 16 бит, поэтому 2^16 равно 65535. Порт источника используется для идентификации клиентского приложения, тогда как порт назначения используется для идентификации службы или демона, работающего на веб-сервере.
Клиент (веб-браузер) выбирает любой порт от 49152 до 65535. Это гарантирует, что никакие 2 приложения не будут использовать один и тот же порт. Адрес порта вместе с IP-адресом называется TCP-сокетом. Порт назначения — это порт 80 в IP-пакете.
Начать общение:
С помощью трех вышеописанных шагов TCP-квитирование между клиентом и сервером прошло успешно, и оба теперь согласились с общими правилами передачи данных.
После подтверждения TCP происходит подтверждение TLS, если вы подключаетесь к защищенному веб-сайту. При рукопожатии TLS клиент и сервер соглашаются с общими условиями безопасной связи.
С этого момента сеанс TLS передает данные приложения (HTTP), зашифрованные согласованным симметричным ключом.
Сервер обрабатывает запросы и отправляет обратно соответствующий ответ. Когда запрос поступает на сервер через порт 80 (HTTP) или порт 443 (HTTPS), веб-сервер, такой как Apache или Nginx, прослушивает порт 443, обрабатывает соединение запроса и направляет его на другой временный порт, на котором находится веб-сервис. бег.
Любой HTTP-клиент, сервер или прокси-сервер может закрыть транспортное соединение TCP в любое время. Например, когда клиент обнаруживает, что передача данных завершена и открытый канал соединения больше не требуется, он отправляет серверу запрос на закрытие соединения. В следующий раз, когда клиент захочет связаться с сервером, между двумя компьютерами необходимо установить новое соединение.
[1] | Стандарт URL-адреса |
[2] | Компоненты или URL-адрес |