Простым языком об HTTP / Хабр
Вашему вниманию предлагается описание основных аспектов протокола HTTP — сетевого протокола, с начала 90-х и по сей день позволяющего вашему браузеру загружать веб-страницы. Данная статья написана для тех, кто только начинает работать с компьютерными сетями и заниматься разработкой сетевых приложений, и кому пока что сложно самостоятельно читать официальные спецификации.
HTTP — широко распространённый протокол передачи данных, изначально предназначенный для передачи гипертекстовых документов (то есть документов, которые могут содержать ссылки, позволяющие организовать переход к другим документам).
Аббревиатура HTTP расшифровывается как HyperText Transfer Protocol, «протокол передачи гипертекста». В соответствии со спецификацией OSI, HTTP является протоколом прикладного (верхнего, 7-го) уровня. Актуальная на данный момент версия протокола, HTTP 1.1, описана в спецификации RFC 2616.
Протокол HTTP предполагает использование клиент-серверной структуры передачи данных.
Задача, которая традиционно решается с помощью протокола HTTP — обмен данными между пользовательским приложением, осуществляющим доступ к веб-ресурсам (обычно это веб-браузер) и веб-сервером. На данный момент именно благодаря протоколу HTTP обеспечивается работа Всемирной паутины.
Также HTTP часто используется как протокол передачи информации для других протоколов прикладного уровня, таких как SOAP, XML-RPC и WebDAV. В таком случае говорят, что протокол HTTP используется как «транспорт».
API многих программных продуктов также подразумевает использование HTTP для передачи данных — сами данные при этом могут иметь любой формат, например, XML или JSON.
Как правило, передача данных по протоколу HTTP осуществляется через TCP/IP-соединения. Серверное программное обеспечение при этом обычно использует TCP-порт 80 (и, если порт не указан явно, то обычно клиентское программное обеспечение по умолчанию использует именно 80-й порт для открываемых HTTP-соединений), хотя может использовать и любой другой.
Как отправить HTTP-запрос?
Самый простой способ разобраться с протоколом HTTP — это попробовать обратиться к какому-нибудь веб-ресурсу вручную. Представьте, что вы браузер, и у вас есть пользователь, который очень хочет прочитать статьи Анатолия Ализара.
Предположим, что он ввёл в адресной строке следующее:
http://alizar.habrahabr.ru/
Соответственно вам, как веб-браузеру, теперь необходимо подключиться к веб-серверу по адресу alizar.habrahabr.ru.
Для этого вы можете воспользоваться любой подходящей утилитой командной строки. Например, telnet:
telnet alizar.habrahabr.ru 80
Сразу уточню, что если вы вдруг передумаете, то нажмите Ctrl + «]», и затем ввод — это позволит вам закрыть HTTP-соединение. Помимо telnet можете попробовать nc (или ncat) — по вкусу.
После того, как вы подключитесь к серверу, нужно отправить HTTP-запрос. Это, кстати, очень легко — HTTP-запросы могут состоять всего из двух строчек.
Для того, чтобы сформировать HTTP-запрос, необходимо составить стартовую строку, а также задать по крайней мере один заголовок — это заголовок Host, который является обязательным, и должен присутствовать в каждом запросе. Дело в том, что преобразование доменного имени в IP-адрес осуществляется на стороне клиента, и, соответственно, когда вы открываете TCP-соединение, то удалённый сервер не обладает никакой информацией о том, какой именно адрес использовался для соединения: это мог быть, например, адрес alizar.habrahabr.ru, habrahabr.ru или m.habrahabr.ru — и во всех этих случаях ответ может отличаться. Однако фактически сетевое соединение во всех случаях открывается с узлом 212.24.43.44, и даже если первоначально при открытии соединения был задан не этот IP-адрес, а какое-либо доменное имя, то сервер об этом никак не информируется — и именно поэтому этот адрес необходимо передать в заголовке Host.
Стартовая (начальная) строка запроса для HTTP 1.1 составляется по следующей схеме:
Метод URI HTTP/Версия
Например (такая стартовая строка может указывать на то, что запрашивается главная страница сайта):
GET / HTTP/1.1
Метод (в англоязычной тематической литературе используется слово method, а также иногда слово
URI (Uniform Resource Identifier, унифицированный идентификатор ресурса) — путь до конкретного ресурса (например, документа), над которым необходимо осуществить операцию (например, в случае использования метода GET подразумевается получение ресурса). Некоторые запросы могут не относиться к какому-либо ресурсу, в этом случае вместо URI в стартовую строку может быть добавлена звёздочка (астериск, символ «*»). Например, это может быть запрос, который относится к самому веб-серверу, а не какому-либо конкретному ресурсу. В этом случае стартовая строка может выглядеть так:
OPTIONS * HTTP/1.1
Версия определяет, в соответствии с какой версией стандарта HTTP составлен запрос. Указывается как два числа, разделённых точкой (например 1.1).
Для того, чтобы обратиться к веб-странице по определённому адресу (в данном случае путь к ресурсу — это «/»), нам следует отправить следующий запрос:
GET / HTTP/1.1
Host: alizar.habrahabr.ru
При этом учитывайте, что для переноса строки следует использовать символ возврата каретки (Carriage Return), за которым следует символ перевода строки (Line Feed). После объявления последнего заголовка последовательность символов для переноса строки добавляется дважды.
Впрочем, в спецификации HTTP рекомендуется программировать HTTP-сервер таким образом, чтобы при обработке запросов в качестве межстрочного разделителя воспринимался символ LF, а предшествующий символ CR, при наличии такового, игнорировался. Соответственно, на практике бо́льшая часть серверов корректно обработает и такой запрос, где заголовки отделены символом LF, и он же дважды добавлен после объявления последнего заголовка.
Если вы хотите отправить запрос в точном соответствии со спецификацией, можете воспользоваться управляющими последовательностями \r и \n:
echo -en "GET / HTTP/1.1\r\nHost: alizar.habrahabr.ru\r\n\r\n" | ncat alizar.habrahabr.ru 80
Как прочитать ответ?
Стартовая строка ответа имеет следующую структуру:
HTTP/Версия Код состояния Пояснение
Версия протокола здесь задаётся так же, как в запросе.
Код состояния (Status Code) — три цифры (первая из которых указывает на класс состояния), которые определяют результат совершения запроса.
Например, в случае, если был использован метод GET, и сервер предоставляет ресурс с указанным идентификатором, то такое состояние задаётся с помощью кода 200. Если сервер сообщает о том, что такого ресурса не существует — 404. Если сервер сообщает о том, что не может предоставить доступ к данному ресурсу по причине отсутствия необходимых привилегий у клиента, то используется код 403. Спецификация HTTP 1.1 определяет 40 различных кодов HTTP, а также допускается расширение протокола и использование дополнительных кодов состояний.Пояснение к коду состояния (Reason Phrase) — текстовое (но не включающее символы CR и LF) пояснение к коду ответа, предназначено для упрощения чтения ответа человеком. Пояснение может не учитываться клиентским программным обеспечением, а также может отличаться от стандартного в некоторых реализациях серверного ПО.
После стартовой строки следуют заголовки, а также тело ответа. Например:
HTTP/1.1 200 OK Server: nginx/1. 2.1 Date: Sat, 08 Mar 2014 22:53:46 GMT Content-Type: application/octet-stream Content-Length: 7 Last-Modified: Sat, 08 Mar 2014 22:53:30 GMT Connection: keep-alive Accept-Ranges: bytes Wisdom
Тело ответа следует через два переноса строки после последнего заголовка. Для определения окончания тела ответа используется значение заголовка Content-Length (в данном случае ответ содержит 7 восьмеричных байтов: слово «Wisdom» и символ переноса строки).
Но вот по тому запросу, который мы составили ранее, веб-сервер вернёт ответ не с кодом 200, а с кодом 302. Таким образом он сообщает клиенту о том, что обращаться к данному ресурсу на данный момент нужно по другому адресу.
Смотрите сами:
HTTP/1.1 302 Moved Temporarily Server: nginx Date: Sat, 08 Mar 2014 22:29:53 GMT Content-Type: text/html Content-Length: 154 Connection: keep-alive Keep-Alive: timeout=25 Location: http://habrahabr.ru/users/alizar/ <html> <head><title>302 Found</title></head> <body bgcolor="white"> <center><h2>302 Found</h2></center> <hr><center>nginx</center> </body> </html>
В заголовке Location передан новый адрес. Теперь URI (идентификатор ресурса) изменился на /users/alizar/, а обращаться нужно на этот раз к серверу по адресу habrahabr.ru (впрочем, в данном случае это тот же самый сервер), и его же указывать в заголовке Host.
То есть:
GET /users/alizar/ HTTP/1.1
Host: habrahabr.ru
В ответ на этот запрос веб-сервер Хабрахабра уже выдаст ответ с кодом 200 и достаточно большой документ в формате HTML.
Если вы уже успели вжиться в роль, то можете теперь прочитать полученный от сервера HTML-код, взять карандаш и блокнот, и нарисовать профайл Ализара — в принципе, именно этим бы на вашем месте браузер сейчас и занялся.
А что с безопасностью?
Сам по себе протокол HTTP не предполагает использование шифрования для передачи информации. Тем не менее, для HTTP есть распространённое расширение, которое реализует упаковку передаваемых данных в криптографический протокол SSL или TLS.
Название этого расширения — HTTPS (HyperText Transfer Protocol Secure). Для HTTPS-соединений обычно используется TCP-порт 443. HTTPS широко используется для защиты информации от перехвата, а также, как правило, обеспечивает защиту от атак вида man-in-the-middle — в том случае, если сертификат проверяется на клиенте, и при этом приватный ключ сертификата не был скомпрометирован, пользователь не подтверждал использование неподписанного сертификата, и на компьютере пользователя не были внедрены сертификаты центра сертификации злоумышленника.
На данный момент HTTPS поддерживается всеми популярными веб-браузерами.
А есть дополнительные возможности?
Протокол HTTP предполагает достаточно большое количество возможностей для расширения. В частности, спецификация HTTP 1.1 предполагает возможность использования заголовка Upgrade для переключения на обмен данными по другому протоколу. Запрос с таким заголовком отправляется клиентом. Если серверу требуется произвести переход на обмен данными по другому протоколу, то он может вернуть клиенту ответ со статусом «426 Upgrade Required», и в этом случае клиент может отправить новый запрос, уже с заголовком Upgrade.
Такая возможность используется, в частности, для организации обмена данными по протоколу WebSocket (протокол, описанный в спецификации RFC 6455, позволяющий обеим сторонам передавать данные в нужный момент, без отправки дополнительных HTTP-запросов): стандартное «рукопожатие» (handshake) сводится к отправке HTTP-запроса с заголовком Upgrade, имеющим значение «websocket», на который сервер возвращает ответ с состоянием «101 Switching Protocols», и далее любая сторона может начать передавать данные уже по протоколу WebSocket.
Что-то ещё, кстати, используют?
На данный момент существуют и другие протоколы, предназначенные для передачи веб-содержимого. В частности, протокол SPDY (произносится как английское слово speedy, не является аббревиатурой) является модификацией протокола HTTP, цель которой — уменьшить задержки при загрузке веб-страниц, а также обеспечить дополнительную безопасность.
Увеличение скорости обеспечивается посредством сжатия, приоритизации и мультиплексирования дополнительных ресурсов, необходимых для веб-страницы, чтобы все данные можно было передать в рамках одного соединения.
Опубликованный в ноябре 2012 года черновик спецификации протокола HTTP 2.0 (следующая версия протокола HTTP после версии 1.1, окончательная спецификация для которой была опубликована в 1999) базируется на спецификации протокола SPDY.
Многие архитектурные решения, используемые в протоколе SPDY, а также в других предложенных реализациях, которые рабочая группа httpbis рассматривала в ходе подготовки черновика спецификации HTTP 2.0, уже ранее были получены в ходе разработки протокола HTTP-NG, однако работы над протоколом HTTP-NG были прекращены в 1998.
На данный момент поддержка протокола SPDY есть в браузерах Firefox, Chromium/Chrome, Opera, Internet Exporer и Amazon Silk.
И что, всё?
В общем-то, да. Можно было бы описать конкретные методы и заголовки, но фактически эти знания нужны скорее в том случае, если вы пишете что-то конкретное (например, веб-сервер или какое-то клиентское программное обеспечение, которое связывается с серверами через HTTP), и для базового понимания принципа работы протокола не требуются. К тому же, всё это вы можете очень легко найти через Google — эта информация есть и в спецификациях, и в Википедии, и много где ещё.
Впрочем, если вы знаете английский и хотите углубиться в изучение не только самого HTTP, но и используемых для передачи пакетов TCP/IP, то рекомендую прочитать вот эту статью.
Ну и, конечно, не забывайте, что любая технология становится намного проще и понятнее тогда, когда вы фактически начинаете ей пользоваться.
Удачи и плодотворного обучения!
9. Протокол http
В «сердце» web находится протокол гипертекста HTTP, являющийся протоколом прикладного уровня. Реализуется с помощью двух программ: клиента и сервера, которые, находясь на разных оконечных системах обмениваются HTTP-сообщениями. Порядок обмена и содержание сообщений описаны в протоколе. Протокол определяет каким образом клиенты запрашивают web-страницы, а серверы осуществляют передачу этих страниц. Когда пользователь запрашивает web-страницу, браузер посылает серверу HTTP-запрос объектов, составляющих web-страницу. Сервер получает запрос и высылает ответные сообщения, содержащие требуемые объекты. Использует TCP в качестве протокола транспортного уровня. После завершения обслуживания клиентов сервер не сохраняет о них никакой инфы. Протокол HTTP является протоколом без запоминания состояния соединения.
Поддерживает постоянные и непостоянные соединения (1.0 только непостоянные). При непостоянном TCP получает лишь 1 объект, при постоянном — все.
Время оборота (RTT) — время, для однократного обмена сегментами. Включает в себя задержку распространения, ожидания и обработки. Суммарное время ответа: удвоенное время оборота и время передачи базового HTML-файла.
Постоянные соединения: с конвейеризацией, без конвейеризации (посылает новый запрос после завершения приема текущего объекта).
Формат HTTP-сообщения: сущ 2 типа сообщения: запросы и ответы.
Запрос:
Строка запроса | Метод | Sp | URL | sp | Версия | cr | lf |
Строки заголовка | Имя заголовочного поля | Sp | Значение | cr | lf | ||
Имя заголовочного поля | Sp | Значение | cr | lf | |||
Пустая строка | cr | Lf | |||||
Тело объекта |
Первая строка — строка запроса, следующие — строки заголовка. Строка запроса содержит 3 поля: поле метода, поле URL и поле версии HTTP. Методы GET, HEAD, POST (слово для поиска(тело)).
Строки заголовка: User-Agent — агент пользователя (тип браузера сгенерировавшего запрос), Accept-Language — строка согласования данных.
Ответ:
Строка запроса | Метод | sp | URL | sp | Информация состояния | cr | lf |
Строки заголовка | Имя заголовочного поля | sp | Значение | cr | lf | ||
Имя заголовочного поля | sp | Значение | cr | lf | |||
Пустая строка | cr | lf | |||||
Тело объекта |
Состоит из 3 частей: строка состояния, шести строк заголовка и тела сообщения. Тело содержит требуемый объект. Строка состояния образована из 3 полей: версия протокола, код состояния, информация состояния. Строки заголовка: The Date — дата и время создания ответа, Server — каким сервером создан ответ, Last-modified — дата и время создания или последнего изменения объекта, Content-Length — размер объекта в байтах, Content-type — тип объекта.
Поля кода состояния и информация о состоянии: 200 — ОК, 400 Bad Request (не возможна интерпретация запроса), 404 Not Found (не найден), 505 HTTP Version Not Supported (указанная версия сервером не поддерживается).
9. Краткая история HTTP
Протокол передачи гипертекста (HTTP) — один из самых распространенных и широко распространенных протоколов приложений в Интернете: это общий язык между клиентами и серверами, обеспечивающий современную сеть. Начав с простого ключевого слова и пути к документу, он стал предпочтительным протоколом не только для браузеров, но и практически для всех подключенных к Интернету программных и аппаратных приложений.
В этой главе мы совершим краткий экскурс в историю эволюции протокола HTTP. Полное обсуждение различной семантики HTTP выходит за рамки этой книги, но понимание ключевых изменений в конструкции HTTP и мотивов каждого из них даст нам необходимую основу для обсуждения производительности HTTP, особенно в контексте из многих предстоящих улучшений в HTTP/2.
Первоначальное предложение HTTP Тима Бернерса-Ли было разработано с простотой в виду , чтобы помочь с принятием другой его зарождающейся идеи: Всемирной паутины. Стратегия, похоже, сработала: начинающие разработчики протоколов, обратите внимание.
В 1991 году Бернерс-Ли изложил мотивацию нового протокола и перечислил несколько высокоуровневых целей разработки: функциональность передачи файлов, возможность запрашивать индексный поиск в гипертекстовом архиве, согласование формата и возможность направить клиента к другой сервер. Для проверки теории в действии был построен простой прототип, в котором реализовано небольшое подмножество предложенного функционала:
Клиентский запрос представляет собой одну строку символов ASCII.
Клиентский запрос завершается возвратом каретки (CRLF).
Ответ сервера представляет собой поток символов ASCII.
Однако даже это звучит намного сложнее, чем есть на самом деле. Эти правила позволяют использовать чрезвычайно простой, дружественный к Telnet протокол, который некоторые веб-серверы поддерживают и по сей день:
. $> телнет google.com 80 Подключено к 74.125.xxx.xxx ПОЛУЧИТЬ /об/ (гипертекстовый ответ) (соединение закрыто)
Запрос состоит из одной строки: GET
метод и путь к запрашиваемому документу. Ответ представляет собой единый гипертекстовый документ — без заголовков или каких-либо других метаданных, только HTML. Это действительно не могло быть проще. Кроме того, поскольку предыдущее взаимодействие является подмножеством предполагаемого протокола, оно неофициально получило метку HTTP 0.9. Остальное, как говорится, уже история.
С этих скромных начинаний в 1991, HTTP зажил своей собственной жизнью и быстро развивался в последующие годы. Давайте быстро вспомним особенности HTTP 0.9:
- .
Клиент-сервер, протокол запрос-ответ.
- Протокол
ASCII, работающий по каналу TCP/IP.
Предназначен для передачи гипертекстовых документов (HTML).
Соединение между сервером и клиентом закрывается после каждого запроса.
Примечание
Популярные веб-серверы, такие как Apache и Nginx, по-прежнему поддерживают протокол HTTP 0.9.протокол — отчасти потому, что в нем нет ничего особенного! Если вам интересно, откройте сеанс Telnet и попробуйте получить доступ к google.com или вашему любимому сайту через HTTP 0.9 и проверьте поведение и ограничения этого раннего протокола.
Период с 1991 по 1995 год — это период быстрой совместной эволюции спецификации HTML, нового поколения программного обеспечения, известного как «веб-браузер», а также появления и быстрого роста общедоступной интернет-инфраструктуры, ориентированной на потребителя.
Растущий список желаемых возможностей зарождающейся сети и вариантов их использования в общедоступной сети быстро выявил многие фундаментальные ограничения HTTP 0.9.: нам нужен был протокол, который мог бы обслуживать не только гипертекстовые документы, предоставлять более подробные метаданные о запросе и ответе, обеспечивать согласование содержимого и многое другое. В свою очередь, зарождающееся сообщество веб-разработчиков ответило созданием большого количества экспериментальных реализаций HTTP-сервера и клиента в рамках специального процесса: внедрить, развернуть и посмотреть, примут ли его другие люди.
В этот период быстрых экспериментов начал появляться набор лучших практик и общих шаблонов, и в мае 1996 Рабочая группа HTTP (HTTP-WG) опубликовала RFC 1945, в котором задокументировано «обычное использование» многих реализаций HTTP/1.0, встречающихся в дикой природе. Обратите внимание, что это был только информационный RFC: HTTP/1.0, поскольку мы знаем, что это не формальная спецификация или интернет-стандарт!
При этом пример запроса HTTP/1. 0 должен выглядеть очень знакомо:
Пример 9-1.
$> telnet веб-сайт.org 80 Подключено к xxx.xxx.xxx.xxx ПОЛУЧИТЬ /rfc/rfc1945.txt HTTP/1.0 Агент пользователя: CERN-LineMode/2.15 libwww/2.17b3 Принимать: */* HTTP/1.0 200 ОК Content-Type: текстовый/обычный Длина контента: 137582 Истекает: Чт, 01 декабря 1997 16:00:00 по Гринвичу Последнее изменение: среда, 1 мая 1996 г., 12:45:26 по Гринвичу. Сервер: Апач 0.84 (открытый текст ответа) (соединение закрыто)
Строка запроса с номером версии HTTP, за которым следуют заголовки запроса
Состояние ответа, за которым следуют заголовки ответа
Предыдущий обмен не является исчерпывающим списком возможностей HTTP/1.0, но он иллюстрирует некоторые ключевые изменения протокола:
Запрос может состоять из нескольких полей заголовка, разделенных новой строкой.
Объект ответа имеет префикс строки состояния ответа.
Объект Response имеет собственный набор полей заголовка, разделенных новой строкой.
Объект ответа не ограничивается гипертекстом.
Соединение между сервером и клиентом закрывается после каждого запроса.
Заголовки запроса и ответа сохранялись в кодировке ASCII, но сам объект ответа мог быть любого типа: HTML-файл, обычный текстовый файл, изображение или контент любого другого типа. Следовательно, «передача гипертекста» часть HTTP стала неправильным названием вскоре после его появления. На самом деле, HTTP быстро превратился в Hypermedia Transport , но исходное название прижилось.
В дополнение к согласованию типа мультимедиа в RFC также задокументирован ряд других часто реализуемых возможностей: кодирование содержимого, поддержка набора символов, составные типы, авторизация, кэширование, поведение прокси, форматы даты и многое другое.
Примечание
Почти каждый сервер в Интернете сегодня может и будет использовать HTTP/1. 0. За исключением того, что к настоящему времени вы должны знать лучше! Требование нового соединения TCP для каждого запроса приводит к значительному снижению производительности HTTP/1.0; см. «Трехстороннее рукопожатие», а затем «Медленный старт».
Работа по превращению HTTP в официальный Интернет-стандарт IETF велась параллельно с документацией по HTTP/1.0 и длилась примерно четыре года: с 1995 по 1999 год. Фактически, первым официальным стандартом HTTP/1.1 является определено в RFC 2068, который был официально выпущен в январе 1997 года, примерно через шесть месяцев после публикации HTTP/1.0. Затем, два с половиной года спустя, в июне 1999 года, в стандарт был включен ряд улучшений и обновлений, которые были выпущены как RFC 2616.
Стандарт HTTP/1.1 устранил многие неточности протокола, обнаруженные в более ранних версиях, и представил ряд важных оптимизаций производительности: соединения проверки активности, передачи кодирования фрагментами, запросы диапазона байтов, дополнительные механизмы кэширования, кодировки передачи и конвейеризация запросов.
Имея эти возможности, мы теперь можем проверить типичный сеанс HTTP/1.1, выполняемый любым современным HTTP-браузером и клиентом:
Пример 9-2.
$> telnet веб-сайт.org 80 Подключено к xxx.xxx.xxx.xxx ПОЛУЧИТЬ /index.html HTTP/1.1 Хост: сайт.org User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4)... (фрагмент) Принять: текст/html, приложение/xhtml+xml, приложение/xml; q = 0,9, */*; q = 0,8 Принять кодировку: gzip, deflate, sdch Принять-Язык: en-US,en;q=0.8 Принять кодировку: ISO-8859-1, utf-8; q = 0,7, *; q = 0,3 Файл cookie: __qca=P0-800083390... (фрагмент) HTTP/1.1 200 ОК Сервер: nginx/1.0.11 Соединение: Keep-alive Тип содержимого: текст/html; кодировка = utf-8 Через: HTTP/1.1 GWA Дата: среда, 25 июля 2012 г., 20:23:35 по Гринвичу Истекает: ср, 25 июля 2012 г., 20:23:35 по Гринвичу. Cache-Control: max-age=0, без кеша Передача-кодирование: по частям 100 (отрезать) 100 (отрезать) 0 ПОЛУЧИТЬ /favicon. ico HTTP/1.1 Хост: www.website.org User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4)... (фрагмент) Принимать: */* Реферер: http://website.org/ Подключение: закрыть Принять кодировку: gzip, deflate, sdch Принять-Язык: en-US,en;q=0.8 Принять кодировку: ISO-8859-1,utf-8;q=0,7,*;q=0,3 Файл cookie: __qca=P0-800083390... (фрагмент) HTTP/1.1 200 ОК Сервер: nginx/1.0.11 Content-Type: image/x-icon Длина контента: 3638 Подключение: закрыть Последнее изменение: Чт, 19 июля 2012 г., 17:51:44 GMT Кэш-контроль: max-age=315360000 Допустимые диапазоны: байты Через: HTTP/1.1 GWA Дата: суббота, 21 июля 2012 г., 21:35:22 по Гринвичу Истекает: четверг, 31 декабря 2037 г., 23:55:55 по Гринвичу. Метка: W/PSA-GAu26oXbDi (значок данных) (соединение закрыто)
Запрос HTML-файла с кодировкой, набором символов и метаданными cookie
Фрагментированный ответ для исходного HTML-запроса
Количество октетов в фрагменте, выраженное в виде шестнадцатеричного числа ASCII (256 байтов)
Конец ответа фрагментированного потока
Запрос файла значка по тому же TCP-соединению
Сообщить серверу, что соединение не будет использоваться повторно
Ответ на значок, за которым следует закрытие соединения
Фу, там столько всего происходит! Первое и наиболее очевидное отличие заключается в том, что у нас есть два запроса объекта, один для HTML-страницы и один для изображения, оба доставляются по одному соединению. Это активация соединения в действии, которая позволяет нам повторно использовать существующее TCP-соединение для нескольких запросов к одному и тому же хосту и обеспечивать гораздо более быстрое взаимодействие с конечным пользователем; см. «Оптимизация для TCP».
Чтобы разорвать постоянное соединение, обратите внимание, что второй клиентский запрос отправляет на сервер явный токен close
через заголовок Connection
. Точно так же сервер может уведомить клиента о намерении закрыть текущее TCP-соединение после передачи ответа. Технически любая сторона может разорвать TCP-соединение без такого сигнала в любой момент, но клиенты и серверы должны предоставлять его всякий раз, когда это возможно, чтобы обеспечить лучшие стратегии повторного использования соединения с обеих сторон.
Примечание
HTTP/1.1 изменил семантику протокола HTTP, чтобы по умолчанию использовать поддержку активности соединения. Это означает, что если не указано иное (через заголовок Connection: close
), сервер должен держать соединение открытым по умолчанию.
Однако эта же функциональность была также перенесена в HTTP/1.0 и включена через заголовок Connection: Keep-Alive
. Следовательно, если вы используете HTTP/1.1, технически вам не нужен заголовок Connection: Keep-Alive
, но тем не менее многие клиенты предпочитают его предоставлять.
Кроме того, протокол HTTP/1.1 добавил контент, кодировку, набор символов и даже согласование языка, кодировку передачи, директивы кэширования, клиентские файлы cookie, а также дюжину других возможностей, которые можно согласовывать по каждому запросу.
Мы не будем останавливаться на семантике каждой возможности HTTP/1.1. Это тема для отдельной книги, и уже написано много замечательных книг. Вместо этого предыдущий пример служит хорошей иллюстрацией как быстрого прогресса и эволюции HTTP, так и запутанного и сложного танца каждого обмена клиент-сервер. Там много чего происходит!
Note
Чтобы получить хорошее представление о внутренней работе протокола HTTP, ознакомьтесь с O’Reilly’s HTTP: The Definitive Guide Дэвида Гурли и Брайана Тотти.
С момента публикации RFC 2616 послужил основой для беспрецедентного роста Интернета: миллиарды устройств всех форм и размеров, от настольных компьютеров до крошечных веб-устройств в наших карманах, каждый день используют HTTP для доставки новостей, видео и миллионы других веб-приложений, от которых мы все привыкли зависеть в своей жизни.
То, что начиналось как простой однострочный протокол для извлечения гипертекста, быстро превратилось в универсальный транспорт гипермедиа, и теперь, десятилетие спустя, его можно использовать практически для любого варианта использования, который вы только можете себе представить. Повсеместное распространение серверов, поддерживающих протокол, и широкая доступность клиентов для его использования означают, что многие приложения в настоящее время разрабатываются и развертываются исключительно поверх HTTP.
Нужен протокол для управления кофейником? RFC 2324 знакомит вас с протоколом Hyper Text Coffee Pot Control Protocol (HTCPCP/1. 0) — изначально первоапрельской шуткой IETF, а в нашем новом мире гиперсвязей — чем угодно, только не шуткой.
Протокол передачи гипертекста (HTTP) — это протокол прикладного уровня для распределенных, совместных информационных систем гипермедиа. Это общий протокол без сохранения состояния, который можно использовать для многих задач помимо его использования для гипертекста, таких как серверы имен и системы управления распределенными объектами, путем расширения его методов запросов, кодов ошибок и заголовков. Особенностью HTTP является типизация и согласование представления данных, что позволяет создавать системы независимо от передаваемых данных.
RFC 2616: HTTP/1.1, июнь 1999 г.
Простота протокола HTTP — вот что способствовало его первоначальному внедрению и быстрому развитию. На самом деле, в настоящее время нет ничего необычного в том, что встроенные устройства — датчики, приводы и кофейники — используют HTTP в качестве основного протокола управления и передачи данных. Но под тяжестью собственного успеха и по мере того, как мы все больше переносим наши повседневные взаимодействия в Интернет — социальные сети, электронная почта, новости и видео, а также все наше личное и рабочее пространство — он также начал проявлять признаки стресса. Пользователи и веб-разработчики теперь требуют от HTTP/1.1 быстродействия и производительности протокола почти в реальном времени, чего он просто не может обеспечить без некоторых модификаций.
Чтобы справиться с этими новыми проблемами, HTTP должен продолжать развиваться, и поэтому рабочая группа HTTPbis объявила о новой инициативе для HTTP/2 в начале 2012 года:
.Появляется опыт реализации и появляется интерес к протоколу, который сохраняет семантику HTTP без устаревших структур и синтаксиса сообщений HTTP/1.x, которые, как было установлено, снижают производительность и поощряют неправильное использование базового транспорта.
Рабочая группа создаст спецификацию нового выражения текущей семантики HTTP в упорядоченных двунаправленных потоках. Как и в случае с HTTP/1.x, основным целевым транспортом является TCP, но должна быть возможность использовать и другие транспорты.
Хартия HTTP/2, , январь 2012 г.
Основное внимание в HTTP/2 уделяется повышению производительности транспорта и обеспечению как меньшей задержки, так и более высокой пропускной способности. Приращение основной версии звучит как большой шаг, которым он является и будет с точки зрения производительности, но важно отметить, что ни одна из семантик протокола высокого уровня не затрагивается: все заголовки HTTP, значения и варианты использования. одинаковы.
Любой существующий веб-сайт или приложение может и будет доставляться через HTTP/2 без изменений: вам не нужно изменять разметку вашего приложения, чтобы воспользоваться преимуществами HTTP/2. HTTP-серверы должны будут говорить по протоколу HTTP/2, но это должно быть прозрачным обновлением для большинства пользователей. Единственная разница, если рабочая группа достигает своей цели, должна заключаться в том, что наши приложения доставляются с меньшей задержкой и лучше используют сетевое соединение!
Сказав это, не будем забегать вперед. Прежде чем мы перейдем к новым функциям протокола HTTP/2, стоит сделать шаг назад и изучить наши существующие рекомендации по развертыванию и производительности для HTTP/1.1. Рабочая группа HTTP/2 быстро работает над новой спецификацией, но даже если окончательный стандарт уже готов и готов, нам все равно придется поддерживать старые клиенты HTTP/1.1 в обозримом будущем — в реальности десятилетие или больше.
Протокол HTTP, реализованный в W3
Протокол HTTP, реализованный в W31991 г.
Этот документ определяет протокол передачи гипертекста (HTTP) в первоначальном виде. реализовано по инициативе Всемирной паутины ПО в прототипе выпущено. Это подмножество полный протокол HTTP и известен как HTTP 0,9.
Информация о профиле клиента не передается вместе с запросом. Будущее HTTP протоколы будут обратно совместимы с этим протоколом.
Этот ограниченный протокол очень прост и всегда может использоваться, когда вы не нуждаются в возможностях полного протокола, который обратно совместим.
Определение этого протокола находится в открытом доступе (см. политика ).
Протокол использует обычный стиль протокола telnet в интернет-стиле на TCP-IP. связь. Ниже описано, как клиент получает (гипертекстовый) документ. с HTTP-сервера, учитывая HTTP-документ адрес .
Связь
Клиент устанавливает соединение TCP-IP с хостом, используя доменное имя или IP-номер и номер порта, указанный в адрес.
Если номер порта не указан, для HTTP всегда предполагается 80.
Сервер принимает соединение.
Примечание. HTTP в настоящее время работает по протоколу TCP, но может работать поверх любого услуга. Интерпретация протокола ниже в случае секвенированного пакетная служба (такая как DECnet(TM) или ISO TP4) состоит в том, что запрос должен может быть один TPDU, но ответов может быть много.
Запрос
Клиент отправляет запрос документа, состоящий из строки символов ASCII. завершается парой CR LF (возврат каретки, перевод строки). Хороший сервер не требует символа возврата каретки.
Этот запрос состоит из слова «GET», пробела, адрес документа , опуская части http:, host и port, когда они являются координатами, только что использованными для установить связь. (Если используется шлюз, то полный адрес документа может быть задано указание другой схемы именования).
Адрес документа будет состоять из одного слова (т.е. без пробелов). Если есть если в строке запроса найдены дополнительные слова, они ДОЛЖНЫ либо игнорироваться, или же лечится по полному HTTP спец.
Поисковая функциональность протокола заключается в возможности адресации синтаксис для описания поиска по именованному индексу.
Поиск должен быть запрошен клиентом только тогда, когда сам индексный документ был описан как индекс с использованием тег ISINDEX.
Ответ
Ответ на простой запрос GET представляет собой сообщение на языке гипертекстовой разметки. ( HTML ). Это поток байтов ASCII-символы.
Строки должны быть разделены необязательным возвратом каретки, за которым следует обязательный символ перевода строки. Клиент не должен предполагать, что возврат каретки будет присутствовать. Линии могут быть любой длины. Хорошо работающие серверы должны ограничить длину строки до 80 символов, исключая пару CR LF.
Формат сообщения — HTML, то есть урезанный документ SGML. Примечание что этот формат позволяет возвращать меню и списки попаданий в виде гипертекста. Это также позволяет возвращать простой текст ASCII после PLAINTEXT. ярлык .
Сообщение завершается закрытием соединения сервером.
Клиенты с хорошим поведением прочитают весь документ как можно быстрее. клиент не должен ждать действий пользователя (например, выходной пейджинг) перед чтение всего документа. Сервер может установить тайм-аут порядка 15 секунд на бездействие.
Ответы на ошибки предоставляются в виде удобочитаемого текста в синтаксисе HTML. Там нет никакого способа отличить ошибочный ответ от удовлетворительного ответа, кроме как по содержанию текста.
Отключение
Соединение TCP-IP разрывается сервером, когда весь документ был переведен.