Что происходит, когда вы вводите URL в браузере и нажимаете Enter? Например, "https://google.com". Объясните основные этапы того, как происходит сетевое взаимодействие начиная с домена и до получения ответа WEB-сервера.
Подсказки:
- Начнем с указанного протокола. Это HTTPS. Что это значит?
- Как наш клиент (ноутбук или ПК) с установленным браузером получил свой IP-адрес? Предполагается, что мы его не задавали вручную.
- Как браузер преобразует доменное имя в IP-адрес?
- Подумайте, как сервер может обрабатывать множество запросов от различных клиентов.
Обязательные знания:
- Знание о DNS протоколе и как он работает в общем виде
- Понимание процесса получения IP и настроек сети с помощью DHCP
- Знание о балансировщиках нагрузки для крупных web-сервисов
- Знание о шлюзах по умолчанию (default gateway) и таблицах маршрутизации
Выше ожиданий:
- Знание о выделении эфемерных портов
- Знание о типах записей DNS (A, AAAA, PTR, TXT, MX, NS)
- Заголовки HTTP-запросов и ответов и алгоритмы балансировки нагрузки, такие как round-robin или least connections.
Когда вы вводите https://google.com
и нажимаете Enter:
Получение IP адреса для домена google.com
- Браузер проверяет свой кэш на домен google.com и его IP адрес.
- Если не найдено, система проверяет файл hosts (
/etc/hosts
в Linux/macOS,C:\Windows\System32\drivers\etc\hosts
в Windows). - Если доменное имя всё ещё не отрезолвили, браузер отправляет запрос к серверу DNS (полученному от DHCP). На получение A записей для IPv4 или AAAA для IPv6.
- Сервер DNS может запросить другие серверы DNS в иерархии (корневые серверы → серверы TLD → авторитетные серверы).
- Ответ DNS возвращает IP-адрес для google.com.
Стоит упомянуть, что компьютер клиента получает свой IP-адрес через протокол DHCP, если он не был настроен вручную. Клиент DHCP получает:
- свой IP-адрес;
- список DNS серверов;
- IP адрес для gateway по умолчанию, который будет перенаправлять трафик в другие сети и интернет.
Установление соединения
-
Браузер инициирует TCP-соединение с сервером, используя трёхэтапный обмен:
- Клиент отправляет пакет SYN серверу.
- Сервер отвечает пакетом SYN-ACK.
- Клиент отправляет пакет ACK.
-
Для HTTPS-соединений следует TLS handshake:
- Клиент и сервер согласовывают между собой версию TLS и набор шифров.
- Сервер предоставляет клиенту свой сертификат.
- Сервер зашифровывает секретный код для симметричного шифрования с помощью публичного ключа клиента и отправляет его клиенту.
- Клиент расшифровывает зашированный секртер своим приватным ключем, таким образом теперь и клиент, и сервер имеют секрет для ширования и дешифрования данных симметричным алгоритмом.
- Безопасное соединение установлено.
HTTP-запрос/ответ
Браузер генерирует HTTP-запрос со следующими заголовками, пример (необязательно):
GET / HTTP/1.1
Host: google.com
User-Agent: Mozilla/5.0 ...
Accept: text/html,application/xhtml+xml...
Запрос проходит через сеть:
- Формируется пакет с запросом и отправляется через поднятое подключение
- Покидает клиентское устройство через сетевой интерфейс.
- Достигает шлюза по умолчанию (ваш маршрутизатор).
- Маршрутизатор пересылает в сеть интернет-провайдера.
- Пакеты проходят через несколько маршрутизаторов (каждый обращается к таблицам маршрутизации).
- В конечном итоге достигает серверов Google.
- Запрос обрабатывается балансировщиком нагрузки (распределяющим трафик между несколькими серверами).
- Веб-сервер получает запрос.
- Сервер генерирует ответ со статусом, заголовками и содержимым.
- Ответ возвращается обратно в ваш браузер через сеть с метками используегося подключения.
Браузер отображает полученное содержимое HTML и загружает дополнительные ресурсы (CSS, JavaScript, изображения).
Назначение портов
- Во время TCP-соединения ваше устройство выделяет временный порт (временный порт с высоким номером (1000-65534)) для этого конкретного соединения.
- Сервер обычно прослушивает стандартные порты (80 для HTTP, 443 для HTTPS).
- Эта пара портов (временный порт клиента + стандартный порт сервера) позволяет облсуживать несколько параллельных соединений.