Что происходит с HTTP-запросом, когда вводишь URL в адресную строку браузера?

Ответ

Полный путь HTTP-запроса:

  1. DNS Resolution (Разрешение доменного имени):

    # Пример DNS-запроса
    nslookup example.com
    # Возвращает: 93.184.216.34
  2. TCP Handshake (Установка соединения):

    • SYN → SYN-ACK → ACK (three-way handshake)
    • Для HTTPS: дополнительно TLS handshake
  3. HTTP Request (Формирование запроса):

    GET /api/users HTTP/1.1
    Host: api.example.com
    User-Agent: Mozilla/5.0
    Accept: application/json
    Authorization: Bearer token123
  4. Server Processing (Обработка на сервере):

    # Пример Django view
    from django.http import JsonResponse
    
    def get_users(request):
       if request.method == 'GET':
           users = User.objects.all().values('id', 'name')
           return JsonResponse(list(users), safe=False)
  5. HTTP Response (Формирование ответа):

    HTTP/1.1 200 OK
    Content-Type: application/json
    Cache-Control: max-age=3600
    
    [
     {"id": 1, "name": "John"},
     {"id": 2, "name": "Jane"}
    ]
  6. Browser Rendering (Обработка в браузере):

    • Парсинг HTML/CSS/JS
    • Выполнение JavaScript
    • Отображение DOM

Критические метрики, которые я отслеживаю:

  • DNS lookup time: < 100ms
  • TCP connection time: < 200ms
  • TTFB (Time to First Byte): < 300ms
  • Full page load: < 3s

Ответ 18+ 🔞

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

Первым делом, конечно, DNS Resolution. Твой комп, ленивая жопа, сам адреса не помнит. Он как справочное бюро: «Э, api.example.com, ты где живешь-то?». Отправляет запрос, а ему в ответ: «Да вот же я, на 93.184.216.34, приходи». И пока это всё происходит, ты уже терпения ноль ебать, потому что каждая миллисекунда на счету. Нормально — меньше 100 мс. Больше — уже повод волнение ебать.

nslookup example.com
# Возвращает: 93.184.216.34

Дальше начинается самое весёлое — TCP Handshake. Это как три шага перед дракой. Твой комп стучится: «Эй, SYN!». Сервер такой: «О, SYN-ACK, заходи». А ты ему: «Ага, ACK, я уже тут». Три пакета туда-сюда — и связь установлена. А если ты умный и используешь HTTPS (а ты ведь используешь, да? Иначе ты просто пидарас шерстяной), то поверх этого ещё и TLS handshake начнётся, где ключами поменяются. Всё это должно уложиться в 200 мс, иначе пользователь уже вротберунчик от злости.

Потом уже поезд пошёл — HTTP Request. Браузер формирует послание, прям как в старые добрые времена телеграмму.

GET /api/users HTTP/1.1
Host: api.example.com
User-Agent: Mozilla/5.0
Accept: application/json
Authorization: Bearer token123

И вот эта телега летит по только что проложенным рельсам до сервера. А там его уже ждёт какой-нибудь Server Processing. Представь себе Django-приложение, где какой-то чувак на Python, с утра кофе не допив, пытается твой запрос обработать.

# Пример Django view
from django.http import JsonResponse

def get_users(request):
    if request.method == 'GET':
        users = User.objects.all().values('id', 'name')
        return JsonResponse(list(users), safe=False)

Главное тут — TTFB (Time to First Byte). Это священная корова, блядь. Сервер должен откликнуться быстрее, чем ты успеешь подумать «какого хуя?». Меньше 300 мс — отлично. Больше — уже подозрение ебать чувствую, что там на сервере не код выполняется, а мартышлюшка на клавиатуре танцует.

Ну а дальше сервер, выдохнув, выдает ответ. Красивый, структурированный, с правильными заголовками.

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: max-age=3600

[
  {"id": 1, "name": "John"},
  {"id": 2, "name": "Jane"}
]

И вот этот пакет счастья летит обратно. Финишная прямая — Browser Rendering. Браузер получает данные, начинает их парсить, JS выполнять, DOM строить. И вот тут уже итоговая метрика — Full page load. Всё, что дольше 3 секунд — это пиздец, простите мой французский. Пользователь уже давно ушёл, сайт твой накрылся медным тазом, а ты ещё думаешь, почему конверсия нулевая.

Так что запомни, чувак: следи за этими цифрами как ястреб. DNS < 100ms, TCP < 200ms, TTFB < 300ms, а полная загрузка — да похуй, шучу, меньше 3 секунд. Иначе будет вам хиросима, а не сайт.