Основное об HTTP
December 10, 2017
HTTP (HyperText Transfer Protocol, «протокол передачи гипертекста») — это протокол передачи данных, изначально предназанченный для передачи гипертекстовых документов. Согласно модели OSI протокол HTTP является протоколом прикладного уровня (уровня приложения). Основой HTTP является клиент-серверная структура передачи данных:
- Клиент (браузер или клиентское приложение) формирует запрос и отправляет его на сервер;
- Сервер обрабатывает данный запрос, формирует ответ и отправляет обратно клиенту.
В настоящее время протокол HTTP повсюду используется во Всемирной паутине для получения информации с веб-сайтов. Передача данных по протоколу HTTP, как правило, происходит через TCP/IP-соединение. Сервер по умолчанию использует TCP-порт 80 (хотя может использовать и любой другой).
И так, чтобы лушче разобраться в HTTP протоколе, рассмотрим кратко теорию и на наглядном примере разберем более подробно.
Структура протокола HTTP
Каждое HTTP-сообщение состоит из стартовой строки, заголовков и тела сообщения (может отсутствовать).
HTTP-запрос к ресурсу
Стартовая строка запроса составляется следующим способом: Метод URI HTTP/Версия
- Метод – тип запроса, одно слово заглавными буквами, определяет операцию, которую нужно осуществить с указанным ресурсом. Например, метод POST применяется для передачи пользовательских данных заданному ресурсу. Метод GET используется для запроса содержимого указанного ресурса, также для начала какого-либо процесса. Есть еще много других методов, но в данной статье их мы не будем рассматривать;
- URI (Uniform Resource Identifier, унифицированный идентификатор ресурса) – определяет путь к запрашиваему конкретному ресурсу (документу);
- Версия – определяет, в соответствии с какой версией стандарта HTTP составлен запрос.
Пример:
В данном примере стартовая строка показывает, что запрашивается стартовая страница.
Более подробный пример:
Например, мы заходим на сайт tonyasokolova.github.io, и мы хотим прочитать о владельце данного сайта. Мы нажимаем на About, т.е. мы обращаемся к tonyasokolova.github.io/about, в качестве URI у нас /about. Так как никаких пользовательских данных мы не передаем, то у нас метод GET. Версия HTTP обычно всегда 1.1. Таким образом стартовая строка будет выглядеть так:
После стартовой строки идут заголовки (HTTP Headers) – это строки в HTTP-сообщении, содержащие разделённую двоеточием пару параметр-значение.
Разберем в нашем примере пару заголовков. Первый заголовок это хост (host) – к какому сайту мы обращаемся, в данном случае tonyasokolova.github.io:
Второй заголовок User-Agent – клиентское приложение, в данном примере используется браузер mozilla firefox:
Остальные заголовки: Accept – список допустимых форматов ресурса, Accept-Language – список поддерживаемых языков, Сookie – используется веб-серверами для того, чтобы различать пользователей и хранить данные о них.
Заголовки должны отделяться от тела сообщения хотя бы одной пустой строкой. Так как метод у нас GET, то тело сообщения у нас отсутствует.
Ответ от сервера
Стартовая строка ответа выглядит так: HTTP/Версия КодСостояния Пояснение
- Версия – как и в запросе;
- Код состояния (Status Code) – три цифры. По коду состояния определяется дальнейшее содержимое сообщения и поведение клиента. Например, в случае, если был использован метод GET, и сервер предоставляет ресурс с указанным идентификатором, то такое состояние задаётся с помощью кода 200. Если сервер сообщает о том, что такого ресурса не существует — 404. Весь список кодов можно глянуть по ссылке: список кодов состояния.
- Пояснение – текстовое короткое пояснение к коду ответа для пользователя. Никак не влияет на сообщение и является необязательным.
Продолжаем рассматривать наш пример. После нашего запроса к ресурсу мы получаем от сервера ответ. Стартовая строка ответа содержит версию 1.1. Код состояние у нас 200, т.е. наш запрос был успешным. И пояснение OK – поясняет код состояния.
Далее идут заголовки, а после заголовок идет тело сообщения (обратите внимание, что оно обязательно отделено хотя бы одной пустой строкой). В качестве тела сообщения сервер отправляет документ в формате HTML, который и отображает в итоге нужную нам информацию на странице.
Безопасность
В HTTP не используется шифрование для передачи данных, но есть расширение, которое реализует упаковку передаваемых данных в криптографический протокол SSL или TLS. Называется это расширение HTTPS (HyperText Transfer Protocol Secure). Как правило для HTTPS-соединения используется TCP-порт 443. Данное расширение используется для защиты информации от перехвата, а также, как правило, обеспечивает защиту от атак вида man-in-the-middle, при условии, что будут использоваться шифрующие средства и сертификат сервера проверен и ему доверяют.
На данный момент HTTPS поддерживается всеми популярными веб-браузерами.