Что под копотом команды curl https://example.com

Я решил написать данный пост, так как это, наверное, один из любимых вопросов интервьюеров в IT-направлении. С его помощью можно понять, насколько собеседник осознаёт принципы работы компьютерных сетей.

В этом посте я подробно и структурированно опишу, как запрос с нашего устройства получает ответ.

━━━━━━━━━━ 1. curl разбирает URL ━━━━━━━━━━

Команда: • curl https://example.com

содержит: • https — протокол • example.com — доменное имя • / — путь по умолчанию

Так как порт не указан, используется 443/TCP.

Для обычного запроса curl отправит: GET /

━━━━━━━━━━ 2. Получение IP через DNS ━━━━━━━━━━

Пакеты отправляются не по доменному имени, а по IP. запрос обращается к системной службе. ОС проверяет локальный кэш, файл hosts и настроенный DNS-сервер.

Если ответа нет, служба ищет его по цепочке: • root DNS → зона .com → authoritative DNS example.com

Важно: CDN не является уровнем DNS-иерархии. Он может быть частью инфраструктуры домена, но не цепочки root → TLD → authoritative.

Классический DNS использует и UDP и TCP на порту 53.

━━━━━━━━━━ 3. Выбираем маршрут ━━━━━━━━━━

Получив IP, ОС смотрит таблицу маршрутизации: • ip route

Если адрес не локальный, пакет идёт через дефолтный путь: Компьютер → роутер → провайдер → интернет → сервер

Чтобы отправить Ethernet-кадр, нужен MAC-адрес следующего узла: • ARP — для IPv4 • NDP — для IPv6

MAC работает внутри локального сегмента, а через интернет пакет маршрутизируется по IP.

Домашний роутер обычно выполняет NAT: заменяет приватный IP устройства на внешний и хранит состояние соединения.

━━━━━━━━━━ 4. Создаётся TCP-соединение ━━━━━━━━━━

В типичном случае HTTPS работает поверх TCP. ОС назначает клиенту временный эфемерный порт: • 192.168.1.10:52341 → server-ip:443

Публичный слушающий-порт при этом не открывается. Создаётся исходящее соединение.

━━━━━━━━━━ 5. TCP three-way handshake ━━━━━━━━━━

Перед передачей данных стороны устанавливают соединение через тройное рукопожатие: • Клиент → SYNСервер → SYN-ACKКлиент → ACK

TCP согласовывает начальные sequence numbers, а дальше обеспечивает порядок доставки, подтверждения и повторную передачу потерянных сегментов.

━━━━━━━━━━ 6. Начинается TLS-handshake ━━━━━━━━━━

После TCP устанавливается защищённый канал.

Клиент отправляет ClientHello, где указывает: • версии TLS • поддерживаемые алгоритмы • параметры обмена ключами • SNI — имя сайта • ALPN — например, HTTP/1.1 или HTTP/2

SNI нужен потому, что на одном IP могут находиться разные HTTPS-сайты.

Сервер отправляет ServerHello, выбирает параметры и передаёт сертификат.

Клиент проверяет: • доверен ли центр сертификации • подходит ли сертификат домену • не истёк ли срок действия • корректна ли цепочка и подпись

Если проверка не проходит, клиент завершит соединение ошибкой.

━━━━━━━━━━ 7. Асимметрия и симметрия ━━━━━━━━━━

Фраза “сначала всё шифруется асимметрией, потом симметрией” слишком упрощена.

В TLS 1.3 асимметрическая криптография нужна в основном для: • подтверждения личности сервера • цифровой подписи • согласования общего секрета

Готовый симметричный ключ по сети не передаётся. Клиент и сервер независимо получают общий секрет и создают из него одинаковые сеансовые ключи. Дальше трафик шифруется симметричными алгоритмами.

━━━━━━━━━━ Мини-итог ━━━━━━━━━━

Если кратко подвести итог, то мы получаем следующую цепочку: • URL → DNS → маршрут → ARP/NDP → TCP → TLS → HTTP → ответ

#IT #Networking #TCP #IP #DNS #TLS #HTTPS #CyberSecurity #AppSec

Что под копотом команды curl https://example.com | Сетка — социальная сеть от hh.ru