Протокол http предназначен для передачи. Протокол передачи гипертекста. Инструменты для определения HTTP трафика

Языку и т. д. Именно благодаря возможности указания способа кодирования сообщения клиент и сервер могут обмениваться двоичными данными, хотя данный протокол является текстовым.

Достоинства

Простота

Протокол настолько прост в реализации, что позволяет с лёгкостью создавать клиентские приложения.

Расширяемость

Вы можете легко расширять возможности протокола благодаря внедрению своих собственных заголовков, сохраняя совместимость с другими клиентами и серверами. Они будут игнорировать неизвестные им заголовки, но при этом вы можете получить необходимый вам функционал при решении специфической задачи.

Распространённость

При выборе протокола HTTP для решения конкретных задач немаловажным фактором является его распространённость. Как следствие, это обилие различной документации по протоколу на многих языках мира, включение удобных в использовании средств разработки в популярные IDE , поддержка протокола в качестве клиента многими программами и обширный выбор среди хостинговых компаний с серверами HTTP.

Недостатки и проблемы

Большой размер сообщений

Использование текстового формата в протоколе порождает соответствующий недостаток: большой размер сообщений по сравнению с передачей двоичных данных. Из-за этого возрастает нагрузка на оборудование при формировании, обработке и передаче сообщений. Для решения данной проблемы в протокол встроены средства для обеспечения кэширования на стороне клиента, а также средства компрессии передаваемого контента. Нормативными документами по протоколу предусмотрено наличие прокси-серверов , которые позволяют получить клиенту документ с наиболее близкого к нему сервера. Также в протокол было внедрено дельта-кодирование , чтобы клиенту передавался не весь документ, а только его изменённая часть.

Отсутствие «навигации»

Хотя протокол разрабатывался как средство работы с ресурсами сервера, у него отсутствуют в явном виде средства навигации среди этих ресурсов. Например, клиент не может явным образом запросить список доступных файлов, как в . Предполагалось, что конечный пользователь уже знает гиперссылкам. Это вполне нормально и удобно для человека, но затруднительно, когда стоят задачи автоматической обработки и анализа всех ресурсов сервера без участия человека. Решение этой проблемы лежит полностью на плечах разработчиков приложений, использующих данный протокол.

Нет поддержки распределённости

Протокол HTTP разрабатывался для решения типичных бытовых задач, где само по себе время обработки запроса должно занимать незначительное время или вообще не приниматься в расчёт. Но в промышленном использовании с применением распределённых вычислений при высоких нагрузках на сервер протокол HTTP оказывается беспомощен. В 1998 году W3C предложил альтернативный протокол HTTP-NG (англ. HTTP Next Generation ) для полной замены устаревшего с акцентированием внимания именно на этой области . Идею его необходимости поддержали крупные специалисты по распределённым вычислениям, но данный протокол до сих пор находится на стадии разработки.

Программное обеспечение

Всё программное обеспечение для работы с протоколом HTTP разделяется на три больших категории:

  • Серверы как основные поставщики услуг хранения и обработки информации (обработка запросов).
  • Клиенты - конечные потребители услуг сервера (отправка запроса).
  • Прокси для выполнения транспортных служб.

Для отличия конечных серверов от прокси в официальной документации используется термин сервер происхождения (англ. Origin server ). Разумеется, один и тот же программный продукт может одновременно выполнять функции клиента, сервера или посредника в зависимости от поставленных задач. В спецификациях протокола HTTP подробно описывается поведение для каждой из этих ролей.

Клиенты

Первоначально протокол HTTP разрабатывался для доступа к гипертекстовым документам Всемирной паутины. Поэтому основными реализациями клиентов являются браузеры (агенты пользователя). Популярные браузеры (в алфавитном порядке): Chrome , Internet Explorer, Mozilla Firefox, Safari.

См также: Список браузеров и Сравнение браузеров

Для просмотра сохраненного содержимого сайтов на компьютере без соединения с Интернетом были придуманы оффлайн-браузеры . Среди известных . Они позволяют в любое время докачать указанные файлы после потери соединения с веб-сервером. В ОС Windows популярны программы Download Master , Free Download Manager, ReGet. В KGet и d4x (Downloader For X). Многие пользователи Linux предпочитают использование и NASA World Wind , тоже используют HTTP.

Нередко протокол HTTP используется программами для скачивания обновлений.

Целый комплекс программ-роботов используется в поисковых системах Интернета. Среди них веб-пауки (краулеры), которые производят проход по гиперссылкам, составляют базу данных ресурсов серверов и сохраняют их содержимое для дальнейшего анализа.

См. также: Список поисковых машин , Архив Интернета

Серверы происхождения

Основные реализации: Internet Information Services (IIS), nginx.

См. также: Список веб-серверов

Прокси-серверы

Основные реализации: UserGate, Multiproxy, Naviscope, Список веб-серверов

История развития

HTTP/0.9

HTTP/1.0

HTTP/1.1

Текущая версия протокола, принята в июне года . Новым в этой версии был режим «постоянного соединения»: Starting line ) - определяет тип сообщения;

  • Заголовки (англ. Headers ) - характеризуют тело сообщения, параметры передачи и прочие сведения;
  • Тело сообщения (англ. Message Body ) - непосредственно данные сообщения. Обязательно должно отделяться от заголовков пустой строкой.
  • Заголовки и тело сообщения могут отсутствовать, но стартовая строка является обязательным элементом, так как указывает на тип запроса/ответа. Исключением является версия 0.9 протокола, у которой сообщение запроса содержит только стартовую строку, а сообщения ответа только тело сообщения.

    Стартовая строка

    Стартовые строки различаются для запроса и ответа. Строка запроса выглядит так:

    GET URI - для версии протокола 0.9. Метод URI HTTP/Версия - для остальных версий.

    Чтобы запросить страницу данной статьи, клиент должен передать строку:

    GET /wiki/Http HTTP/1.0

    Стартовая строка ответа сервера имеет следующий формат:

    HTTP/Версия КодСостояния Пояснение

    • Версия - пара разделённых точкой арабских цифр как в запросе.
    • КодСостояния (англ. Status Code ) - три арабские цифры. По коду статуса определяется дальнейшее содержимое сообщения и поведение клиента.
    • Пояснение (англ. Reason Phrase ) - текстовое короткое пояснение к коду ответа для пользователя. Никак не влияет на сообщение и является необязательным.

    Например, на предыдущий наш запрос клиентом данной страницы сервер ответил строкой:

    HTTP/1.0 200 Ok

    Методы

    OPTIONS

    Используется для определения возможностей веб-сервера или параметров соединения для конкретного ресурса. В ответ серверу следует включить заголовок Allow со списком поддерживаемых методов. Также в заголовки ответа может включаться информация о поддерживаемых расширениях.

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

    Для того чтобы узнать возможности всего сервера, клиент должен указать в URI звёздочку - « * ». Запросы « OPTIONS * HTTP/1.1 » могут также применяться для проверки работоспособности сервера (аналогично «пингованию») и тестирования на предмет поддержки сервером протокола HTTP версии 1.1.

    Результат выполнения этого метода не кэшируется.

    GET

    Используется для запроса содержимого указанного ресурса. С помощью метода GET можно также начать какой-либо процесс. В этом случае в тело ответного сообщения следует включить информацию о ходе выполнения процесса.

    Клиент может передавать параметры выполнения запроса в URI целевого ресурса после символа « ? »:
    GET /path/resource?param1=value1¶m2=value2 HTTP/1.1

    Согласно стандарту HTTP, запросы типа GET считаются идемпотентными - многократное повторение одного и того же запроса GET должно приводить к одинаковым результатам (при условии, что сам ресурс не изменился за время между запросами). Это позволяет кэшировать ответы на запросы GET .

    Кроме обычного метода GET , различают ещё и . Условные запросы GET содержат заголовки If-Modified-Since , If-Match , If-Range и подобные. Частичные GET содержат в запросе Range . Порядок выполнения подобных запросов определён стандартами отдельно.

    HEAD

    Аналогичен методу GET , за исключением того, что в ответе сервера отсутствует тело. Запрос HEAD обычно применяется для извлечения метаданных , проверки наличия ресурса (валидация URL) и чтобы узнать, не изменился ли он с момента последнего обращения.

    Заголовки ответа могут кэшироваться. При несовпадении метаданных ресурса с соответствующей информацией в кэше копия ресурса помечается как устаревшая.

    POST

    Применяется для передачи пользовательских данных заданному ресурсу. Например, в блогах посетители обычно могут вводить свои комментарии к записям в HTML-форму, после чего они передаются серверу методом POST и он помещает их на страницу. При этом передаваемые данные (в примере с блогами - текст комментария) включаются в тело запроса. Аналогично с помощью метода POST обычно загружаются файлы.

    В отличие от метода GET , метод POST не считается идемпотентным , то есть многократное повторение одних и тех же запросов POST может возвращать разные результаты (например, после каждой отправки комментария будет появляться одна копия этого комментария).

    При результатах выполнения 200 (Ok) и 204 (No Content) в тело ответа следует включить сообщение об итоге выполнения запроса. Если был создан ресурс, то серверу следует вернуть ответ 201 (Created) с указанием URI нового ресурса в заголовке Location .

    Сообщение ответа сервера на выполнение метода POST не кэшируется.

    PUT

    Применяется для загрузки содержимого запроса на указанный в запросе URI. Если по заданному URI не существовало ресурса, то сервер создаёт его и возвращает статус 201 (Created). Если же был изменён ресурс, то сервер возвращает 200 (Ok) или 204 (No Content). Сервер не должен игнорировать некорректные заголовки Content-* передаваемые клиентом вместе с сообщением. Если какой-то из этих заголовков не может быть распознан или не допустим при текущих условиях, то необходимо вернуть код ошибки 501 (Not Implemented).

    Фундаментальное различие методов POST и PUT заключается в понимании предназначений URI ресурсов. Метод POST предполагает, что по указанному URI будет производиться обработка передаваемого клиентом содержимого. Используя PUT , клиент предполагает, что загружаемое содержимое соответствуют находящемуся по данному URI ресурсу.

    Сообщения ответов сервера на метод PUT не кэшируются.

    PATCH

    Аналогично PUT, но применяется только к фрагменту ресурса.

    DELETE

    Удаляет указанный ресурс.

    TRACE

    Возвращает полученный запрос так, что клиент может увидеть, что́ промежуточные сервера добавляют или изменяют в запросе.

    CONNECT

    Для использования вместе с прокси-серверами, которые могут динамически переключаться в туннельный режим

    LINK

    Устанавливает связь указанного ресурса с другими.

    UNLINK

    Убирает связь указанного ресурса с другими.

    Коды состояния

    Код состояния является частью первой строки ответа сервера. Он представляет собой целое число из 3 арабских цифр. Первая цифра указывает на класс состояния . За кодом ответа обычно следует отделённая пробелом поясняющая фраза на английском языке, которая указывает на причину именно такого ответа.

    Клиент узнаёт по коду ответа о результатах его запроса и определяет, какие действия ему предпринимать дальше. Набор кодов состояния является стандартом, и все они описаны в соответствующих документах IETF. Клиент может не знать все коды состояния, но он обязан отреагировать в соответствии с классом кода.

    В настоящее время выделено пять классов кодов состояния.

    1xx Informational ( русск. Информационный ) В этот класс выделены коды, информирующие о процессе передачи. В HTTP/1.0 сообщения с такими кодами должны игнорироваться. В HTTP/1.1 клиент должен быть готов принять этот класс сообщений как обычный ответ, но ничего отправлять серверу не нужно. Сами сообщения от сервера содержат только стартовую строку ответа и, если требуется, несколько специфичных для ответа полей заголовка. Прокси-сервера подобные сообщения должны отправлять дальше от сервера к клиенту. 2xx Success (русск. Успешно ) Сообщения данного класса информируют о случаях успешного принятия и обработки запроса клиента. В зависимости от статуса сервер может ещё передать заголовки и тело сообщения. 3xx Redirection (русск. Перенаправление ) Коды статуса класса 3xx сообщают клиенту, что для успешного выполнения операции нужно произвести следующий запрос к другому URI. В большинстве случаев новый адрес указывается в поле Location заголовка. Клиент в этом случае должен, как правило, произвести автоматический переход (жарг. редирект ). Обратите внимание, что при обращении к следующему ресурсу можно получить ответ из этого же класса кодов. Может получиться даже длинная цепочка из перенаправлений, которые, если будут производиться автоматически, создадут чрезмерную нагрузку на оборудование. Поэтому разработчики протокола HTTP настоятельно рекомендуют после второго подряд подобного ответа обязательно запрашивать подтверждение на перенаправление у пользователя (раньше рекомендовалось после 5-го). За этим следить обязан клиент, так как текущий сервер может перенаправить клиента на ресурс другого сервера. Клиент также должен предотвратить попадание в круговые перенаправления. 4xx Client Error (русск. Ошибка клиента ) Класс кодов 4xx предназначен для указания ошибок со стороны клиента. При использовании всех методов, кроме HEAD , сервер должен вернуть в теле сообщения гипертекстовое пояснение для пользователя. Для запоминания значений кодов с 400 по 417 существуют приёмы иллюстративной мнемотехники 5xx Server Error (русск. Ошибка сервера ) Коды 5xx выделены под случаи неудачного выполнения операции по вине сервера. Для всех ситуаций, кроме использования метода HEAD , сервер должен включать в тело сообщения объяснение, которое клиент отобразит пользователю.

    Заголовки

    Тело сообщения

    Примеры диалогов HTTP

    Обычный GET-запрос

    Запрос клиента:

    GET /wiki/страница HTTP/1.1 Host: ru.wikipedia.org User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5 Accept: text/html Connection: close

    Ответ сервера:

    HTTP/1.0 200 OK Date: Wed, 11 Feb 2009 11:20:59 GMT Server: Apache X-Powered-By: PHP/5.2.4-2ubuntu5wm1 Last-Modified: Wed, 11 Feb 2009 11:20:59 GMT Content-Language: ru Content-Type: text/html; charset=utf-8 Content-Length: 1234 Connection: close (далее следует запрошенная страница в

    Перенаправления

    Предположим, что у вымышленной компании Example Corp. есть основной сайт по адресу http://example.com и домен-псевдоним example-corp.com. Клиент посылает запрос страницы «О компании» на вторичный домен (часть заголовков опущена):

    Location: http://www.example.com/about.html#contacts Date: Thu, 19 Feb 2009 11:08:01 GMT Server: Apache/2.2.4 Content-Type: text/html; charset=windows-1251 Content-Length: 110 (пустая строка) Click here

    В заголовке Location можно указывать фрагменты как данном примере. Браузер не указал фрагмент в запросе, так как его интересует весь документ. Но он автоматически прокрутит страницу до фрагмента «contacts», как только загрузит её. В тело ответа также был помещён коротенький HTML-документ с ссылкой, с помощью которой посетитель попадёт на целевую страницу, если браузер не перейдёт на неё автоматически. Заголовок Content-Type содержит характеристики именно этого HTML-пояснения, а не документа, который находится по целевому URL.

    Допустим, эта же компания Example Corp. имеет несколько региональных представительств по всему миру. И для каждого представительства у них есть сайт с соответствующим ccTLD . Запрос главной страницы основного сайта example.com может выглядеть так:

    / HTTP/1.1 Host: www.example.com User-Agent: MyLonelyBrowser/5.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ru,en-us;q=0.7,en;q=0.3 Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7

    Сервер принял во внимание заголовок Accept-Language и сформировал ответ с временным перенаправлением на российский сервер example.ru, указав его адрес в заголовке Location:

    HTTP/1.x 302 Found Location: http://www.example.ru/ Cache-Control: private Date: Thu, 19 Feb 2009 11:08:01 GMT Server: Apache/2.2.6 Content-Type: text/html; charset=windows-1251 Content-Length: 82 (пустая строка) Example Corp. Россия

    Обратите внимание на заголовок Cache-Control . Значение «private» сообщает остальным серверам (в первую очередь прокси) что ответ может кэшироваться на стороне клиента. В противном случае не исключено, что следующие посетители из других стран будут переходить всё время не в своё представительство.

    Для перенаправления также используются коды ответа (See Other) и (Temporary Redirect).

    Докачка и фрагментарное скачивание

    Допустим, вымышленная организация предлагает скачать с сайта видео прошедшей конференции по адресу http://example.org/conf-2009.avi объёмом примерно 160 МБ. Рассмотрим, как происходит докачивание этого файла в случае сбоя и как менеджер закачек организовал бы многопоточную загрузку нескольких фрагментов.

    В обоих случаях клиенты произведут свой первый запрос наподобие этого:

    GET /conf-2009.avi HTTP/1.0 Host: example.org Accept: */* User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98) Referer: http://example.org/

    Заголовок Referer указывает, что файл был запрошен с главной страницы сайта. Менеджеры закачек обычно тоже его указывают, чтобы эмулировать переход со страницы сайта. Без него сервер может ответить (Acccess Forbidden), если не допускаются запросы с других сайтов. В нашем случае сервер вернул успешный ответ:

    HTTP/1.1 200 OK Date: Thu, 19 Feb 2009 12:27:04 GMT Server: Apache/2.2.3 Last-Modified: Wed, 18 Jun 2003 16:05:58 GMT ETag: "56d-9989200-1132c580" Content-Type: video/x-msvideo Content-Length: 160993792 Accept-Ranges: bytes Connection: close (пустая строка) (двоичное содержимое всего файла)

    Заголовок Accept-Ranges информирует клиента о том, что он может запрашивать у сервера фрагменты, указывая их смещения от начала файла в байтах. Если этот заголовок отсутствует, то клиент может предупредить пользователя, что докачать файл, скорее всего, не удастся. Исходя из значения заголовка Content-Length , менеджер закачек поделит весь объём на равные фрагменты и запросит их по отдельности, организовав несколько потоков. Если сервер не укажет размер, то клиенту параллельное скачивание реализовать не удастся, но при этом он сможет докачивать файл, пока сервер не ответит (Requested Range Not Satisfiable).

    Допустим, на 84-ом мегабайте соединение с Интернетом прервалось и процесс загрузки приостановился. Когда соединение с Интернетом было восстановлено, браузер автоматически послал новый запрос на сервер, но с указанием выдать содержимое с 84-ого мегабайта:

    GET /conf-2009.avi HTTP/1.0 Host: example.org Accept: */* User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98) Range: bytes=88080384- Referer: http://example.org/

    Сервер не обязан помнить, какие и от кого запросы были до этого, и поэтому клиент снова вставил заголовок Referer , как будто это его самый первый запрос. Указанное значение заголовка Range говорит серверу - «выдай содержимое от 88080384-ого байта до самого конца». В связи с этим сервер вернёт ответ:

    HTTP/1.1 206 Partial Content Date: Thu, 19 Feb 2009 12:27:08 GMT Server: Apache/2.2.3 Last-Modified: Wed, 18 Jun 2003 16:05:58 GMT ETag: "56d-9989200-1132c580" Accept-Ranges: bytes Content-Range: bytes 88080384-160993791/160993792 Content-Length: 72913408 Connection: close Content-Type: video/x-msvideo (пустая строка) (двоичное содержимое от 84-ого мегабайта)

    Заголовок Accept-Ranges здесь уже не обязателен, так как клиент уже знает об этой возможности сервера. О том, что передаётся фрагмент, клиент узнаёт по коду (Partial Content). В заголовке Content-Range содержится информация о данном фрагменте: номера начального и конечного байта, а после слэша - суммарный объём всего файла в байтах. Обратите внимание на заголовок Content-Length - в нём указывается размер тела сообщения, то есть передаваемого фрагмента. Если сервер вернёт несколько фрагментов, то Content-Length будет содержать их суммарный объём.

    Теперь вернёмся к менеджеру закачек. Зная суммарный объём файла «conf-2009.avi», программа поделила его на 10 равных секций. Начальную менеджер загрузит при самом первом запросе, прервав соединение как только дойдёт до начала второго. Остальные он запросит отдельно. Например, 4-ая секция будет запрошена со следующими заголовками (часть заголовков опущена - см. полный пример выше):

    GET /conf-2009.avi HTTP/1.0 Range: bytes=64397516-80496894

    Ответ сервера в этом случае будет следующим (часть заголовков опущена - см. полный пример выше):

    HTTP/1.1 206 Partial Content Accept-Ranges: bytes Content-Range: bytes 64397516-80496894/160993792 Content-Length: 16099379 (пустая строка) (двоичное содержимое 4-ой части)

    Если подобный запрос отправить серверу, который не поддерживает фрагменты, то он вернёт стандартный ответ (OK) как было показано в самом начале, но без заголовка Accept-Ranges .

    См. также , байтовые диапазоны , ответ 406 , ответ 416 .

    Основные механизмы протокола

    Частичные GET

    HTTP позволяет запросить не сразу всё содержимое ресурса, а только указанный фрагмент. Такие запросы называются частичные GET , возможность их выполнения необязательна (но желательна) для серверов. Частичные GET в основном используются для докачки файлов и быстрого параллельного скачивания в нескольких потоках. Некоторые программы скачивают заголовок архива, выводят пользователю внутреннюю структуру, а потом уже запрашивают фрагменты с указанными элементами архива.

    Для получения фрагмента клиент посылает серверу запрос с заголовком Range , указывая в нём необходимые байтовые диапазоны . Если сервер не понимает частичные запросы (игнорирует заголовок Range), то он вернёт всё содержимое со статусом , как и при обычном GET . В случае успешного выполнения сервер возвращает вместо кода 200 ответ со статусом 206 (Partial Content), включая в ответ заголовок Content-Range . Сами фрагменты могут быть переданы двумя способами:

    См. также .

    Условные GET

    Согласование содержимого

    Согласование содержимого (англ. Content Negotiation ) - механизм автоматического определения необходимого ресурса при наличии нескольких разнотипных версий документа. Субъектами согласования могут быть не только ресурсы сервера, но и возвращаемые страницы с сообщениями об ошибках ( , и т. п.).

    Различают два основных типа согласований:

    • Управляемое сервером (англ. Server-Driven ).
    • Управляемое клиентом (англ. Agent-Driven ).

    Одновременно могут быть использованы оба типа или каждый из них по отдельности.

    В основной спецификации по протоколу (RFC 2616) также выделяется так называемое прозрачное согласование (англ. Transparent Negotiation ) как предпочтительный вариант комбинирования обоих типов. Последний механизм не следует путать с независимой технологией Transparent Content Negotiation (TCN , русск. Прозрачное согласование содержимого , см. RFC 2295), которая не является частью протокола HTTP, но может использоваться с ним. У обоих существенное различие в принципе работы и самом значении слова «прозрачное» (transparent ). В спецификации по HTTP под прозрачностью подразумевается, что процесс не заметен для клиента и сервера, а в технологии TCN прозрачность означает доступность полного списка вариантов ресурса для всех участников процесса доставки данных.

    Управляемое сервером

    При наличии нескольких версий ресурса сервер может анализировать заголовки запроса клиента, чтобы выдать, по его мнению, наиболее подходящую. В основном анализируются заголовки Accept , Accept-Charset , Accept-Encoding , Accept-Languages и User-Agent . Серверу желательно включать в ответ заголовок Vary с указанием параметров, по которым различается содержимое по запрашиваемому URI.

    Географическое положение клиента можно определить по удалённому IP-адресу .

    Управляемое сервером согласование имеет несколько недостатков:

    • Сервер только предполагает, какой вариант наиболее предпочтителен для конечного пользователя, но не может знать точно, что именно нужно в данный момент (например, версия на русском языке или английском).
    • Заголовков группы Accept передаётся много, а ресурсов с несколькими вариантами - мало. Из-за этого оборудование испытывает избыточную нагрузку.
    • Общему кэшу создаётся ограничение возможности выдавать один и тот же ответ на идентичные запросы от разных пользователей.
    • Передача заголовков Accept также наносит урон личной жизни пользователя, раскрывая некоторые сведения о его предпочтениях.

    Управляемое клиентом

    В данном случае тип содержимого определяется только на стороне клиента. Для этого сервер возвращает с кодом состояния 300 (Multiple Choices) или 406 (Not Acceptable) список вариантов, среди которых пользователь выбирает подходящий. Управляемое клиентом согласование хорошо, когда содержимое различается по самым частым параметрам (например, по языку и кодировке) и используется публичный кэш. Основные недостаток: лишняя нагрузка, так как приходится делать дополнительный запрос, чтобы получить нужное содержимое.

    Прозрачное согласование

    Данное согласование полностью прозрачно для клиента и сервера. В данном случае используется общий кэш, в котором содержится список вариантов, как для управляемого клиентом согласования. Если кэш понимает все эти варианты, то он сам делает выбор, как при управляемом сервером согласовании. Это снижает нагрузки с исходного сервера и исключает дополнительный запрос со стороны клиента.

    В основной спецификации по протоколу HTTP механизм прозрачного согласования подробно не описан.

    Множественное содержимое

    Основная статья : иерархии с вложением элементов друг в друга. Для обозначения множественного содержимого используются медиатипы multipart/* . Работа с такими типами осуществляется по общим правилам, описанным в RFC 2046 (если иное не определено конкретным медиа типом). Если получателю не известно как работать с типом, то он обрабатывает его так же, как multipart/mixed .

    Со стороны сервера сообщения со множественным содержимым могут посылаться в ответ на при запросе нескольких фрагментов ресурса. В этом случае используется медиа тип multipart/byteranges .

    HTTP - это протокол передачи гипертекста между распределёнными системами. По сути, http является фундаментальным элементом современного Web-а. Как уважающие себя веб разработчики, мы должны знать о нём как можно больше.

    Давайте взглянем на этот протокол через призму нашей профессии. В первой части пройдёмся по основам, посмотрим на запросы/ответы. В следующей статье разберём уже более детальные фишки, такие как кэширование, обработка подключения и аутентификация.

    Также в этой статье я буду, в основном, ссылаться на стандарт RFC 2616 : Hypertext Transfer Protocol -- HTTP/1.1.

    Основы HTTP

    HTTP обеспечивает общение между множеством хостов и клиентов, а также поддерживает целый ряд сетевых настроек.

    В основном, для общения используется TCP/IP, но это не единственный возможный вариант. По умолчанию, TCP/IP использует порт 80, но можно заюзать и другие.

    Общение между хостом и клиентом происходит в два этапа: запрос и ответ. Клиент формирует HTTP запрос, в ответ на который сервер даёт ответ (сообщение). Чуть позже, мы более подробно рассмотрим эту схему работы.

    Текущая версия протокола HTTP - 1.1, в которой были введены некоторые новые фишки. На мой взгляд, самые важные из них это: поддержка постоянно открытого соединения, новый механизм передачи данных chunked transfer encoding, новые заголовки для кэширования. Что-то из этого мы рассмотрим во второй части данной статьи.

    URL

    Сердцевиной веб-общения является запрос, который отправляется через Единый указатель ресурсов (URL). Я уверен, что вы уже знаете, что такое URL адрес, однако для полноты картины, решил всё-таки сказать пару слов. Структура URL очень проста и состоит из следующих компонентов:

    Протокол может быть как http для обычных соединений, так и https для более безопасного обмена данными. Порт по умолчанию - 80. Далее следует путь к ресурсу на сервере и цепочка параметров.

    Методы

    С помощью URL, мы определяем точное название хоста, с которым хотим общаться, однако какое действие нам нужно совершить, можно сообщить только с помощью HTTP метода. Конечно же существует несколько видов действий, которые мы можем совершить. В HTTP реализованы самые нужные, подходящие под нужды большинства приложений.

    Существующие методы:

    GET : получить доступ к существующему ресурсу. В URL перечислена вся необходимая информация, чтобы сервер смог найти и вернуть в качестве ответа искомый ресурс.

    POST : используется для создания нового ресурса. POST запрос обычно содержит в себе всю нужную информацию для создания нового ресурса.

    PUT : обновить текущий ресурс. PUT запрос содержит обновляемые данные.

    DELETE : служит для удаления существующего ресурса.

    Данные методы самые популярные и чаще всего используются различными инструментами и фрэймворками. В некоторых случаях, PUT и DELETE запросы отправляются посредством отправки POST, в содержании которого указано действие, которое нужно совершить с ресурсом: создать, обновить или удалить.

    Также HTTP поддерживает и другие методы:

    HEAD : аналогичен GET. Разница в том, что при данном виде запроса не передаётся сообщение. Сервер получает только заголовки. Используется, к примеру, для того чтобы определить, был ли изменён ресурс.

    TRACE : во время передачи запрос проходит через множество точек доступа и прокси серверов, каждый из которых вносит свою информацию: IP, DNS. С помощью данного метода, можно увидеть всю промежуточную информацию.

    OPTIONS : используется для определения возможностей сервера, его параметров и конфигурации для конкретного ресурса.

    Коды состояния

    В ответ на запрос от клиента, сервер отправляет ответ, который содержит, в том числе, и код состояния. Данный код несёт в себе особый смысл для того, чтобы клиент мог отчётливей понять, как интерпретировать ответ:

    1xx: Информационные сообщения

    Набор этих кодов был введён в HTTP/1.1. Сервер может отправить запрос вида: Expect: 100-continue, что означает, что клиент ещё отправляет оставшуюся часть запроса. Клиенты, работающие с HTTP/1.0 игнорируют данные заголовки.

    2xx: Сообщения об успехе

    Если клиент получил код из серии 2xx, то запрос ушёл успешно. Самый распространённый вариант - это 200 OK. При GET запросе, сервер отправляет ответ в теле сообщения. Также существуют и другие возможные ответы:

    • 202 Accepted : запрос принят, но может не содержать ресурс в ответе. Это полезно для асинхронных запросов на стороне сервера. Сервер определяет, отправить ресурс или нет.
    • 204 No Content : в теле ответа нет сообщения.
    • 205 Reset Content : указание серверу о сбросе представления документа.
    • 206 Partial Content : ответ содержит только часть контента. В дополнительных заголовках определяется общая длина контента и другая инфа.

    3xx: Перенаправление

    Своеобразное сообщение клиенту о необходимости совершить ещё одно действие. Самый распространённый вариант применения: перенаправить клиент на другой адрес.

    • 301 Moved Permanently : ресурс теперь можно найти по другому URL адресу.
    • 303 See Other : ресурс временно можно найти по другому URL адресу. Заголовок Location содержит временный URL.
    • 304 Not Modified : сервер определяет, что ресурс не был изменён и клиенту нужно задействовать закэшированную версию ответа. Для проверки идентичности информации используется ETag (хэш Сущности - Enttity Tag);

    4xx: Клиентские ошибки

    Данный класс сообщений используется сервером, если он решил, что запрос был отправлен с ошибкой. Наиболее распространённый код: 404 Not Found. Это означает, что ресурс не найден на сервере. Другие возможные коды:

    • 400 Bad Request : вопрос был сформирован неверно.
    • 401 Unauthorized : для совершения запроса нужна аутентификация. Информация передаётся через заголовок Authorization.
    • 403 Forbidden : сервер не открыл доступ к ресурсу.
    • 405 Method Not Allowed : неверный HTTP метод был задействован для того, чтобы получить доступ к ресурсу.
    • 409 Conflict : сервер не может до конца обработать запрос, т.к. пытается изменить более новую версию ресурса. Это часто происходит при PUT запросах.

    5xx: Ошибки сервера

    Ряд кодов, которые используются для определения ошибки сервера при обработке запроса. Самый распространённый: 500 Internal Server Error. Другие варианты:

    • 501 Not Implemented : сервер не поддерживает запрашиваемую функциональность.
    • 503 Service Unavailable : это может случиться, если на сервере произошла ошибка или он перегружен. Обычно в этом случае, сервер не отвечает, а время, данное на ответ, истекает.

    Форматы сообщений запроса/ответа

    На следующем изображении вы можете увидеть схематично оформленный процесс отправки запроса клиентом, обработка и отправка ответа сервером.

    Давайте посмотрим на структуру передаваемого сообщения через HTTP:

    Message = *() CRLF [] = Request-Line | Status-Line = Field-Name ":" Field-Value

    Между заголовком и телом сообщения должна обязательно присутствовать пустая строка. Заголовков может быть несколько:

    Тело ответа может содержать полную информацию или её часть, если активирована соответствующая возможность (Transfer-Encoding: chunked). HTTP/1.1 также поддерживает заголовок Transfer-Encoding.

    Общие заголовки

    Вот несколько видов заголовков, которые используются как в запросах, так и в ответах:

    General-header = Cache-Control | Connection | Date | Pragma | Trailer | Transfer-Encoding | Upgrade | Via | Warning

    Что-то мы уже рассмотрели в этой статье, что-то подробней затронем во второй части.

    Заголовок via используется в запросе типа TRACE, и обновляется всеми прокси-серверами.

    Заголовок Pragma используется для перечисления собственных заголовков. К примеру, Pragma: no-cache - это то же самое, что Cache-Control: no-cache. Подробнее об этом поговорим во второй части.

    Заголовок Date используется для хранения даты и времени запроса/ответа.

    Заголовок Upgrade используется для изменения протокола.

    Transfer-Encoding предназначается для разделения ответа на несколько фрагментов с помощью Transfer-Encoding: chunked. Это нововведение версии HTTP/1.1.

    Заголовки сущностей

    В заголовках сущностей передаётся мета-информация контента:

    Entity-header = Allow | Content-Encoding | Content-Language | Content-Length | Content-Location | Content-MD5 | Content-Range | Content-Type | Expires | Last-Modified

    Все заголовки с префиксом Content- предоставляют информацию о структуре, кодировке и размере тела сообщения.

    Заголовок Expires содержит время и дату истечения сущности. Значение “never expires” означает время + 1 код с текущего момента. Last-Modified содержит время и дату последнего изменения сущности.

    С помощью данных заголовков, можно задать нужную для ваших задач информацию.

    Формат запроса

    Запрос выглядит примерно так:

    Request-Line = Method SP URI SP HTTP-Version CRLF Method = "OPTIONS" | "HEAD" | "GET" | "POST" | "PUT" | "DELETE" | "TRACE"

    SP - это разделитель между токенами. Версия HTTP указывается в HTTP-Version. Реальный запрос выглядит так:

    GET /articles/http-basics HTTP/1.1 Host: www.articles.com Connection: keep-alive Cache-Control: no-cache Pragma: no-cache Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

    Список возможных заголовков запроса:

    Request-header = Accept | Accept-Charset | Accept-Encoding | Accept-Language | Authorization | Expect | From | Host | If-Match | If-Modified-Since | If-None-Match | If-Range | If-Unmodified-Since | Max-Forwards | Proxy-Authorization | Range | Referer | TE | User-Agent

    В заголовке Accept определяется поддерживаемые mime типы, язык, кодировку символов. Заголовки From, Host, Referer и User-Agent содержат информацию о клиенте. Префиксы If- предназначены для создания условий. Если условие не прошло, то возникнет ошибка 304 Not Modified.

    Формат ответа

    Формат ответа отличается только статусом и рядом заголовков. Статус выглядит так:

    Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF

    • HTTP версия
    • Код статуса
    • Сообщение статуса, понятное для человека

    Обычный статус выглядит примерно так:

    HTTP/1.1 200 OK

    Заголовки ответа могут быть следующими:

    Response-header = Accept-Ranges | Age | ETag | Location | Proxy-Authenticate | Retry-After | Server | Vary | WWW-Authenticate

    • Age время в секундах, когда сообщение было создано на сервере.
    • ETag MD5 сущности для проверки изменений и модификаций ответа.
    • Location используется для перенаправления и содержит новый URL адрес.
    • Server определяет сервер, где было сформирован ответ.

    Думаю, на сегодня теории достаточно. Теперь давайте взглянем на инструменты, которыми мы можем пользоваться для мониторинга HTTP сообщений.

    Инструменты для определения HTTP трафика

    Существует множество инструментов для мониторинга HTTP трафика. Вот несколько из них:

    Наиболее часто используемый - это Chrome Developers Tools:

    Если говорить об отладчике, можно воспользоваться Fiddler :

    Для отслеживания HTTP трафика вам потребуется curl, tcpdump и tshark.

    Библиотеки для работы с HTTP - jQuery AJAX

    Поскольку jQuery очень популярен, в нём также есть инструментарий для обработки HTTP ответов при AJAX запросах. Информацию о jQuery.ajax(settings) можете найти на официальном сайте .

    Передав объект настроек (settings), а также воспользовавшись функцией обратного вызова beforeSend, мы можем задать заголовки запроса, с помощью метода setRequestHeader().

    $.ajax({ url: "http://www.articles.com/latest", type: "GET", beforeSend: function (jqXHR) { jqXHR.setRequestHeader("Accepts-Language", "en-US,en"); } });

    Если хотите обработать статус запроса, то это можно сделать так:

    $.ajax({ statusCode: { 404: function() { alert("page not found"); } } });

    Итог

    Вот такой вот он, тур по основам протокола HTTP. Во второй части будет ещё больше интересных фактов и примеров.

    В «сердце» web находится протокол передачи гипертекста (HTTP), являющийся протоколом прикладного уровня. Описание HTTP можно найти в RFC 1945 и RFC 2616. Протокол HTTP реализуется с помощью двух программ: клиента и сервера, которые, находясь на разных оконечных системах, обмениваются HTTP-сообщениями. Порядок обмена и содержание сообщений описаны в протоколе. Перед тем как углубиться в изучение HTTP, сначала освоим терминологию, используемую в контексте web.

    Каждая web-страница, или документ, состоит из объектов. Объект представляет собой обычный файл в формате HTML, изображение в формате JPEG или GIF, Java-апплет, аудиоклип и т. п., то есть единицу, обладающую собственным универсальным указателем ресурса (Uniform Resource Locator, URL). Как правило, web-страницы состоят из базового HTML-файла и объектов, на которые он ссылается. Так, если web-страница включает базовый HTML-файл и пять изображений, то она состоит из шести объектов. Ссылки на объекты, относящиеся к web-странице, представляют собой URL-адреса, включенные в базовый HTML-файл. URL состоит из двух частей: имени хоста сервера, на котором находится объект, и пути к объекту. Так, например, для URL _www.someSchool.edu/someDepartment/picture.gif именем хоста является фрагмент _www.someSchool.edu, а путем к объекту - фрагмент someDepartment/picture.gif.

    Браузером называется агент пользователя web; он отображает web-страницы, а также выполняет множество дополнительных служебных функций. Кроме того, браузеры представляют клиентскую сторону протокола HTTP. Таким образом, термины «браузер» и «клиент» в контексте web будут употребляться как эквивалентные. В число наиболее популярных браузеров входят Netscape Navigator и Microsoft Internet Explorer.

    Web-сервер содержит объекты, каждый из которых идентифицируется своим URL-адресом. Кроме того, web-серверы представляют серверную сторону протокола HTTP. К наиболее популярными web-серверам следует отнести Apache и Microsoft Internet Information Server.

    Протокол HTTP определяет, каким образом клиенты (например, браузеры) запрашивают web-страницы, а серверы осуществляют передачу этих страниц. Более подробный разговор о взаимодействии клиента и сервера мы проведем позднее, однако основную идею можно понять из рис. 2.4. Когда пользователь запрашивает web-страницу (например, совершает щелчок на гиперссылке), браузер посылает серверу HTTP-запрос объектов, составляющих web-страницу. Сервер получает запрос и высылает ответные сообщения, содержащие требуемые объекты. В 1997 году практически все web-браузеры и web-серверы стали поддерживать протокол HTTP версии 1.0, описанный в документе RFC 1945. В 1998 году начался переход к версии 1.1, которая была описана в документе RFC 2616. Версия 1.1 имеет обратную совместимость с версией 1.0, то есть любой сервер или браузер, использующий версию 1.1, может в полной мере взаимодействовать с браузером или сервером, поддерживающим версию 1.0.

    Как HTTP 1.0, так и HTTP 1.1 используют TCP в качестве протокола транспортного уровня. HTTP-клиент сначала устанавливает ТСР-соединение с сервером, а после создания соединения клиент и сервер начинают взаимодействовать с протоколом TCP через интерфейс сокетов. Как было сказано ранее, сокеты представляют собой «двери» между процессами и протоколом транспортного уровня.

    Клиент посылает запросы и принимает ответы через свой интерфейс сокетов, а сервер использует интерфейс сокетов для получения запросов и их выполнения. После того как web-запрос минует сокет клиента, он оказывается «в руках» протокола TCP. Вспомним, что одной из функций протокола TCP является обеспечение надежной передачи данных; это означает, что каждый запрос, посылаемый клиентом, и каждый ответ сервера доставляются в виде, точно соответствующем отправленному. Здесь проявляется одно из достоинств многоуровневой коммуникационной модели: протоколу HTTP не нужно контролировать надежность передачи и обеспечивать повторную передачу пакетов при искажениях. Вся «черновая» работа будет проделана протоколом TCP и протоколами более низких уровней.

    Необходимо отметить, что после завершения обслуживания клиентов сервер не сохраняет о них никакой информации. Если, например, какой-либо клиент сделает два запроса одного и того же ресурса подряд, сервер выполнит их, не выдав клиенту никакого оповещения о дублирующем запросе. Говорят, что протокол HTTP является протоколом без запоминания состояния (stateless protocol) соединения.

    Протокол HTTP или HyperText Transfer Protocol это главный прокол (всемирной паутины). Основная задача протокола, обеспечить передачу гипертекста в сети. В протоколе точно описывается формат сообщений, для обмена клиентов и серверов.

    Описан протокол HTTP в RFC 2616(HTTP1.1).

    Основа протокола обеспечить взаимодействие клиента и сервера по средством одного ASCII-запроса, и следующего на него ответа в стандарте RFC 822 MIME.

    На практике протокол HTTP работает на основе порт 80, но можно настроить и по-другому. И хоть TCP/IP не является обязательным, он остается предпочтительным, так как берет на себя разбиение и сборку сообщений на себя и не «напрягает» ни браузер, ни сервер.

    Следует отметить, что протокол HTTP может использоваться не только в веб-технологиях, но и других ООП приложениях (объективно-ориентированных).

    URL

    Основой веб-общения клиент-сервер является запрос. Запрос отправляется при помощи URL– единого указателя ресурсов Интернет. Напомню, что такое URL адрес.

    Понятная и простая структура URL состоит из следующих элементов:

    • Протокол;
    • Хост;
    • Порт;
    • Каталок ресурса;
    • Метки (Запрос).

    Примечание: Протокол http это протокол для простых, не защищенных соединений. Защищенные соединения работают по протоколу https. Он более безопасен для обмена данными.

    Методы HTTP запросов

    Один из параметров URL, определяет название хоста, с которым мы хотим общаться. Но этого мало. Нужно определить действие, которое нужно совершить. Сделать это можно при помощи метода определенного протоколом HTTP.

    Методы HTTP

    • Метод/Описание
    • HEAD/Прочитать заголовок веб-страницы
    • GET/Прочитать веб-страницу
    • POST/Добавить к веб-странице
    • PUT/Сохранить веб-страницу
    • TRACE/Отослать назад запрос
    • DELETE/Удалить веб-страницу
    • OPTIONS/Отобразить параметры
    • CONNECT/Зарезервировано для будущего использования

    Разберем методы HTTP подробнее

    Метод GET. запрашивает страницу (файл, объект), закодированную по стандарту MIME. Это самый употребляемый метод. Структура метода:
    GET имя_файла HTTP/1.1

    Метод HEAD. Этот метод запрашивает заголовок сообщения. При этом страница не загружается. Этот метод позволяет узнать время последнего обновления страницы, что нужно для управления КЭШем страниц. Этот метод позволяет проверить работоспособность запрашиваемого URL.

    Метод PUT. Этот метод может поместить страницу на сервер. Тело запроса PUT включает размещаемую страницу, которая закодирована по MIME. Это метод требует идентификации клиента.

    Метод POST. Этот метод добавляет содержимое к уже имеющейся странице. Используется, как пример, для добавления записи на форум.

    Метод DELETE. Этот метод уничтожает страницу. Метод удаления требует подтверждения прав пользователя на удаление.

    Метод TRACE. Этот метод отладки. Он указывает серверу отослать запрос назад и позволяет узнать, искажается или нет, запрос клиента, вернувшись от сервера.

    Метод CONNECT – метод резерва, не используется.

    Метод OPTIONS позволяет запросить свойства сервера и свойства любого файла.

    В общении клиента и сервера «запрос-ответ», сервер обязательно генерирует ответ. Это может быть веб-страница или строку состояния с кодом состояния. Код состояния вам хорошо известен. Один из кодов известный код 404 –Страница не найдена.

    Группы кодов состояния

    1хх: Готовность сервера, Код 100 – сервер готов обрабатывать запросы клиента;

    2хх: Успех.

    • Код 200 – запрос обработан успешно;
    • Код 204 – Содержимого нет.

    3хх: Перенаправление.

    • Код 301 – Запрашиваемая страница перенесена;
    • Код 304 – Страница в КЭШе еще актуальна.

    4хх: Ошибка клиента.

    Все данные в рамках Web-технологии передаются по протоколу HTTP (HyperText Transfer Protocol). Исключение составляет обмен с использованием программирования на Java или обмен из Plugin-преложений. Учитывая реальный объем трафика, который передается в рамках Web-обмена по HTTP, мы будем рассматривать только этот протокол. При этом мы рассмотрим такие вопрсы, как:

    Общая структура сообщений

    HTTP - это протокол прикладного уровня. Протокл ориентирован на модель обмена "клиент-сервер". Обмен происходит фрагментами данных, которые носят название HTTP-сообщений . Сообщения, отправляюемые от клиента к серверу, называют запросами, а сообщения, отправляемые от сервера клиенту - откликами. Сообщение может состоять из двух частей: заголовка и тела. Тело от заголовка отделяется пустой строкой.

    Заголовок содержит служебную информацию, необходимую для обработки тела сообщения или управления обменом. Заголовок состоит из директив заголовка, которые обычно записываются каждая на новой строке.

    Тело сообщения не является обязательным в отличии от заголовка сообщения. Оно может содержать текст, графику, аудио- или видео-информацию.

    Ниже приведен HTTP-запрос:

    GET / HTTP/1.0 Accept: image/jpeg [пустая строка]

    и отклик:

    HTTP/1.0 200 OK Date: Fri, 24 Jul 1998 21:30:51 GMT Server: Apache/1.2.5 Content-type: text/html Content-length: 21345 [пустая строка] контекст страницы

    Текст "пустая строка" - это просто обозначение наличия пустой строки, которая отделяет заголовок HTTP-сообщения от его тела.

    Сервер, принемая запрос от клиента, часть информации заголовка HTTP-запроса преобразует в переменные окружения, которые доступны для анализа CGI-скриптом. Если запрос обладает телом, то тело становится доступным скрипту через поток стандартного ввода.

    Методы доступа

    Самой главной директивой HTTP-запроса является метод доступа. Он указывается первым словом в первой строке запроса. В нашем примере это GET. Различают четыре основных метода доступа:

    Кроме этих четырех методов существует еще около пяти дополнительных методов доступа, но они редко бывают реализованы на практике.

    Метод GET

    Метод GET используется клиентом при запросе к серверу по умолчанию. При этом методе клиент сообщает адрес ресурса(URL), который он хочет получить, версию протокола HTTP, MIME-типы документов, которые он поддерживает, версию и название клиентского программного обеспечения. Все эти параметры указываются в заголовке HTTP-запроса. Тело в запросе не передается.

    В ответ сервер сообщает версию HTTP-протокола, код возврата, тип содержания тела сообщения, размер тела сообщения и ряд других необязательных директив HTTP-заголовка. Сам ресурс, обычно HTML-страница, передается в теле отклика.

    Метод HEAD

    Метод HEAD используется для минимизации обменов при работе по протоколу HTTP. Он аналогичен методу GET за исключением того, что в отклике не передается тела сообщения. Данный метод используется для проверки времени последней модификации ресурса, для проверки срока годности кэшированных ресурсов, при использовании программ сканирования ресурсов World Wide Web. Одним словом, метод HEAD предназначен для минимизации объема передаваемой по сети информации в рамках HTTP-обмена.

    Метод POST

    Метод POST - это альтернатива методу GET. При обмене данными по методу POST в запросе клиента присутствует тело HTTP-сообщения. Это тело может формироваться из данных, которые вводятся в HTML-форме, или из присоединенного внешнего файла. В отклике как правило присутствует и заголовок и тело HTTP-сообщения. Для инициирования обмена по методу POST в атрибуте method контейнера form следует указать значение "post".

    Метод PUT

    Метод PUT используется для опубликования HTML-страниц в каталоге HTTP-сервера. При передаче данных от клиента к серверу в сообщении присутствует и заголовок сообщения, в котором указан URL данного ресурса, и тело - содержание размещаемого ресурса.

    В отклике обычно тело ресурса не передается, а в заголовке сообщения указывается код возврата, который определяет успешное или неуспешное размещение ресурса.

    Оптимизация обмена

    Протокол HTTP изначально разрабатывался как протокол не ориентированный на постоянное соединенение. Это означает, что как только сервер принял запрос от клиента и ответил на него, соединение между клиентом и сервером теряется. Для нового обмена данными нужно устанавливать новое соединение. Такой подход имеет как достоинства, так и недостатки.

    К достоинствам относится возможность одновременного обслуживания большого количества коротких запросов. Даже на популярных серверах число открытых соединений может не превышать сотни при обслуживании порядка милиона запросов в сутки. При этом один клиент может открыть до 40 соединений одновременно, которые с точки зрения сервера явлются равноправными. При высокоскоростных линиях связи это позволяет добиться малого времени отклика на запрос клиента для всей страницы (текст, графика и т.п.).

    К недостаткам такой схемы обмена относятся: необходимость установки соединения для каждого обмена и невозможность поддерживать сессию работы с информационным ресурсом. При инициализации соединения по транспортному протоколу TCP и разрыве этого соединения требуется передать довольно большой объем служебной информации. Отсутствие поддержки сессий в HTTP существенно осложняет работу с такими ресурсами как базы данных или ресурсами требующими аутентификации.

    Для оптимизации числа открытых TCP-соединений в HTTP-протоколе версий 1.0 и 1.1 предусмотрен режим keep-alive. В этом режиме соединение инициализируется только один раз и по нему последовательно можно реализовать несколько HTTP-обменов.

    Для реализации поддержки сессий к директивам HTTP-заголовка, были добавлены "ключики"(Cookies). Они позволяют проимитировать поддержку соединения при работе по протоколу HTTP.

    Кодировка GET и POST-запросов.

    Существуют два вида кодирования HTTP-запроса. Основной - urlencoded , он же - стандартное кодирование URL. Пробел представляется как %20, русские буквы и большинство спецсимволов кодируются, английские буквы и дефис оставляются как есть.

    Способ, которым следует кодировать данные формы при submit"е, задается в ее HTML-таге:

    // метод GET с кодировкой по умолчанию // enctype явно задает кодировку // метод POST с кодировкой по умолчанию (urlencoded, как и предыдущая форма)

    Если форма отправляеться обычным образом, то браузер сам кодирует (urlencode) название и значение каждого поля данных (input и т.п.) и отсылает форму на сервер в закодированном виде.

    Второй способ кодирования - это отсутствие кодирования. Например, кодировать не нужно для пересылки файлов. Он указывается в форме (только для POST) так:

    В этом случае при отправке данных на сервер ничего не кодируется. А сервер, со своей стороны, посмотрев на "Content-Type: multipart/form-data", поймет, что пришло.

    Кодировка данных.

    Если Вы используете только UTF-8 - этот раздел вам не нужен.

    Все идущие на сервер параметры GET/POST, кроме случая multipart/form-data, кодируются в UTF-8. Не в кодировке страницы, а именно в UTF-8. Поэтому, например, в PHP их нужно при необходимости перекодировать функцией iconv.

    $name = iconv("UTF8","CP1251",$_GET["name"]);

    Ответ с сервера браузер воспринимает именно в той кодировке, которая указана в заголовке ответа Content-Type. Т.е, опять же, в PHP, чтобы браузер воспринял ответ в windows-1251 и нормально отобразил данные на странице в windows-1251, нужно послать заголовок с кодировкой в php-коде, например так:

    Header("Content-Type: text/plain; charset=windows-1251");

    Или же, такой заголовок должен добавить сервер. Например, в apache автоматически добавляется кодировка опцией:

    # в конфиге апача AddDefaultCharset windows-1251
    .



    
    Top