notes

HTTP

Как происходит HTTP запрос

  1. Браузер анализирует введенныё URL и извлекает имя хоста
  2. Используя систему DNS браузер преобразует домен в ip адрес
  3. Устанавливает TCP соединение с web-сервером
  4. Если протокол https, устанавливает TLS соединение поверх TCP
  5. Формирует HTTP запрос, отправляет его, получает в ответе документ
  6. Браузер закрывает соединение (для HTTP/1.0)
  7. Браузер анализирует (parse) HTML и загружает доп. ресурсы (css, img, javascript)
  8. Браузер отображает (rendering) HTML страницу (по мере получения её кода)

Задачи

  1. Передача документов
  2. Передача мета-информации
  3. Авторизация
  4. Поддержка сессий
  5. Кэширование документов
  6. Согласование содержимого (negotiation)
  7. Управление соединением (keep-alive or close)

Ключевые особенности

  1. Работает поверх TCP/TLS
  2. Протокол запрос-ответ (по умолчанию соединения не сохраняются).
  3. Не поддерживает состояния - stateless (нет никакой гарантии что клиент будет работать с тем же сервером)
  4. Текстовый протокол. Передача данных осуществляется ввиде человеко-читаемого текста.
  5. Расширяемый (можно вводить пользовательские заголовки)

HTTP/1.1

  1. HTTP запрос состоит из
    • строка запроса
      • метод
      • URL документа
      • версия протокола
    • заголовки
    • тело запроса
     GET /robots.txt HTTP/1.1
     Accept: text/html,application/xhtml+xml
     Accept-Encoding: gzip, deflate
     Cache-Control: max-age=0
     Connection: keep-alive
     Host: www.ru
    
  2. HTTP ответ:

     HTTP/1.1 404 Not Found
     Server: nginx/1.5.7
     Date: Sat, 25 Jul 2015 09:58:17 GMT
     Content-Type: text/html; charset=iso-8859-1
     Connection: close
    

Заголовки HTTP

  1. Общие
    • Content-Type - MIME тип документа
    • Content-Length - длина сообщения
    • Content-Encoding - кодирование документа, например gzip сжатие
    • Transfer-Encoding - формат передачи, например, chunked
    • Connection - управление соединением
    • Upgrage - смена протокола (к примеру с TCP на UDP)
  2. Заголовки HTTP запросов
    • Authorization - авторизация, чаще всего логин\пароль
    • Cookie - передача состояния (сессии) на сервер
    • Referer - URL предыдущего документа
    • User-Agent - описание клиента
    • If-Modified-Since - условный GET запрос (если документ не был модифицирован, то возвращать его не надо)
    • Accept-* - согласование содержимого
  3. Заголовки HTTP ответов
    • Location - новый URL документа при перенаправлениях
    • Set-Cookie - установка состояния (сессии) в браузере
    • Last-Modified - дата последнего изменения документа
    • Date - дата на сервере, для согласования кэшей
    • Server - описание web-сервера, название и версия

Управление соединением

  1. HTTP/1.0 предполагает закрытие TCP соединения сразу после ответа сервера.
  2. HTTP/1.1 предполагает удержание TCP соединения, если не было заголовка Connection: close.
  3. Соединение должно быть закрыто, если:
    • сервер ил иклиент использует HTTP младше 1.1
    • сервер или клиент передал заголовок Connection: close
    • по истечении таймаута (обычно небольшой, около 10с)
    • иначе соединение остается открытым для последующих запросов