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

«Что происходит с HTTP-запросом, когда вводишь URL в адресную строку браузера?» — вопрос из категории Сети, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Полный путь 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