← Назад к вопросам

Как происходит обращение к сайту?

1.0 Junior🔥 121 комментариев
#REST API и HTTP

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как происходит обращение к веб-сайту

Обращение к веб-сайту — это сложный процесс, в котором задействованы браузер, сеть, сервер и множество протоколов. Разберу его пошагово.

1. Ввод URL в адресную строку

Пользователь вводит URL (например, https://example.com/page). Браузер парсит его на компоненты: протокол (https), хост (example.com), путь (/page).

2. DNS резолюция

Браузер должен узнать IP адрес хоста example.com. Он отправляет DNS запрос:

  • Сначала проверяет кеш браузера
  • Затем кеш ОС
  • Потом отправляет запрос к рекурсивному DNS резолверу (обычно от провайдера)
  • Резолвер проходит по цепочке: root nameserver → TLD nameserver (.com) → authoritative nameserver

Результат: IP адрес (например, 93.184.216.34)

3. TCP соединение (Three-way handshake)

Браузер открывает TCP соединение с сервером на порту 443 (для HTTPS) или 80 (для HTTP):

Клиент → Сервер: SYN (seq=x)
Сервер → Клиент: SYN-ACK (seq=y, ack=x+1)
Клиент → Сервер: ACK (seq=x+1, ack=y+1)

Теперь соединение установлено.

4. TLS хендшейк (для HTTPS)

Перед отправкой данных устанавливается шифрование:

  • Клиент отправляет ClientHello с поддерживаемыми шифрами
  • Сервер отвечает ServerHello + сертификат
  • Клиент верифицирует сертификат (проверяет подпись CA, дату, имя)
  • Обе стороны генерируют session key для шифрования

5. HTTP запрос

Браузер отправляет HTTP запрос:

GET /page HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0...
Accept: text/html,application/xhtml+xml,...
Cookie: session=abc123...
Connection: keep-alive

6. Обработка на сервере

Веб-сервер (Nginx, Apache) получает запрос и:

  • Логирует его
  • Парсит метод, путь, заголовки
  • Маршрутизирует на приложение (Django, Flask, FastAPI)
  • Приложение обрабатывает бизнес-логику:
    • Аутентификация (проверяет cookie)
    • Авторизация (проверяет права)
    • Работа с БД (SELECT запросы)
    • Рендеринг шаблона или сборка JSON

7. HTTP ответ

Сервер возвращает ответ:

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 1234
Set-Cookie: session=xyz789...; Path=/; HttpOnly
Cache-Control: max-age=3600

<!DOCTYPE html>
<html>...</html>

8. Парсинг и рендеринг

Браузер получает HTML и:

  • Парсит HTML (строит DOM tree)
  • Загружает CSS (параллельно, не блокирует парсинг)
  • Загружает JavaScript
  • Применяет стили (CSSOM + DOM = Render tree)
  • Выполняет макет (layout)
  • Рисует пиксели (paint)
  • Выполняет compositing

Во время загрузки JavaScript может отправлять дополнительные запросы (fetch API).

9. Загрузка ресурсов

Для каждого ресурса (изображение, шрифт, скрипт) повторяются шаги 2-5. Браузер делает это параллельно (обычно 6-8 соединений на домен).

10. Закрытие соединения

Если заголовок Connection: close, соединение закрывается сразу. Если keep-alive, оно может переиспользоваться для следующих запросов (обычно с таймаутом 5-60 секунд).

Оптимизации, которые браузер делает автоматически

  • HTTP/2 multiplex — несколько потоков в одном TCP соединении
  • Кеширование — по заголовку Cache-Control
  • Сжатие — gzip, brotli
  • Предварительная загрузка — dns-prefetch, preconnect, prefetch
  • Service Workers — кеширование на клиенте, работа offline

В контексте Python разработки

Как Python разработчик, я отвечаю за шаги 6-7 (обработка на сервере). Важно понимать:

  • Как оптимизировать шаг 6 (не делать N+1 queries)
  • Как кешировать шаг 7 (ETag, Last-Modified)
  • Как обрабатывать ошибки (правильные HTTP статусы)
  • Как работают сессии и cookies

Вот пример минимального обработчика на FastAPI:

from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse

app = FastAPI()

@app.get("/page", response_class=HTMLResponse)
async def get_page(request: Request):
    # Шаг 6: обработка
    session_id = request.cookies.get("session")
    if not session_id:
        return "Unauthorized", 401
    
    # Работа с БД
    user = await db.get_user(session_id)
    data = await db.get_data(user.id)
    
    # Шаг 7: формирование ответа
    html = render_template("page.html", data=data)
    return html