aboutsummaryrefslogtreecommitdiff
path: root/files/ru/web/http/messages/index.html
blob: e41f8ceecf18d34a5d6b000c1c2c2ff4809bfa10 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
---
title: Сообщения HTTP
slug: Web/HTTP/Messages
tags:
  - HTTP
  - Веб Механика
  - Руководство
translation_of: Web/HTTP/Messages
---
<div>{{HTTPSidebar}}</div>

<p class="summary">HTTP сообщения - это обмен данными между сервером и клиентом. Есть два типа сообщений: <em><strong>запросы</strong></em>, отправляемые клиентом, чтобы инициировать реакцию со стороны сервера, и <em><strong>ответы </strong></em>от сервера.</p>

<p>Сообщения HTTP состоят из текстовой информации в кодировке ASCII, записанной в несколько строк. В HTTP/1.1 и более ранних версиях они пересылались в качестве обычного текста. В HTTP/2 текстовое сообщение разделяется на фреймы, что позволяет выполнить оптимизацию и повысить производительность.</p>

<p>Веб разработчики  не создают текстовые сообщения HTTP самостоятельно - это делает программа, браузер, прокси или веб-сервер. Они обеспечивают создание HTTP сообщений через конфигурационные файлы (для прокси и серверов), APIs (для браузеров) или другие интерфейсы.</p>

<p><img alt="From a user-, script-, or server- generated event, an HTTP/1.x msg is generated, and if HTTP/2 is in use, it is binary framed into an HTTP/2 stream, then sent." src="https://mdn.mozillademos.org/files/13825/HTTPMsg2.png" style="height: 538px; width: 1174px;"></p>

<p>Механизм бинарного фрагментирования в HTTP/2 разработан так, чтобы не потребовалось вносить изменения в имеющиеся APIs и конфигурационные файлы: он вполне прозрачен для пользователя.</p>

<p>HTTP запросы и ответы имеют близкую структуру. Они состоят из:</p>

<ol>
 <li>Стартовой строки, описывающей запрос, или статус (успех или сбой). Это всегда одна строка.</li>
 <li>Произвольного набора <em>HTTP заголовков,</em> определяющих запрос или описывающих тело сообщения.</li>
 <li>Пустой строки, указывающей, что вся мета информация отправлена.</li>
 <li>Произвольного тела, содержащего пересылаемые с запросом данные (например, содержимое HTML-формы ) или отправляемый в ответ документ. Наличие тела и его размер определяется стартовой строкой и заголовками HTTP.</li>
</ol>

<p>Стартовую строку вместе с заголовками сообщения HTTP называют <em>головой</em> запроса, а его данные - <em>телом</em>.</p>

<p><img alt="Requests and responses share a common structure in HTTP" src="https://mdn.mozillademos.org/files/13827/HTTPMsgStructure2.png" style="height: 368px; width: 1239px;"></p>

<h2 id="Запросы_HTTP">Запросы HTTP</h2>

<h3 id="Стартовая_строка">Стартовая строка</h3>

<p>HTTP запросы - это сообщения, отправляемые клиентом, чтобы инициировать реакцию со стороны сервера. Их стартовая строка состоит из трех элементов:</p>

<ol>
 <li>
  <p><em><a href="/ru/docs/Web/HTTP/Methods">Метод HTTP</a></em>, глагол (например, {{HTTPMethod("GET")}}, {{HTTPMethod("PUT")}} или {{HTTPMethod("POST")}}) или существительное (например,  {{HTTPMethod("HEAD")}} или {{HTTPMethod("OPTIONS")}}), описывающие требуемое действие. Например, <code>GET</code> указывает, что нужно доставить некоторый ресурс, а <code>POST</code> означает отправку данных на сервер (для создания или модификации ресурса, или генерации возвращаемого документа).</p>
 </li>
 <li><em>Цель запроса</em>, обычно {{glossary("URL")}}, или абсолютный путь протокола, порт и домен обычно характеризуются контекстом запроса. Формат цели запроса зависит от используемого HTTP-метода. Это может быть
  <ul>
   <li>Абсолютный путь, за которым следует <code>'?'</code> и строка запроса. Это самая распространенная форма, называемая <em>исходной формой</em> (<em>origin form</em>) . Используется с методами <code>GET</code>, <code>POST</code>, <code>HEAD</code>, и <code>OPTIONS</code>.<br>
    <code>POST / HTTP 1.1<br>
    GET /background.png HTTP/1.0<br>
    HEAD /test.html?query=alibaba HTTP/1.1<br>
    OPTIONS /anypage.html HTTP/1.0</code></li>
   <li>Полный URL<em> - абсолютная форма</em> (<em>absolute form</em>) , обычно используется с <code>GET</code> при подключении к прокси.<br>
    <code>GET http://developer.mozilla.org/ru/docs/Web/HTTP/Messages HTTP/1.1</code></li>
   <li>Компонента URL "authority", состоящая из имени домена и (необязательно) порта (предваряемого символом <code>':'</code>), <em>называется authority form</em>. Используется только с методом <code>CONNECT</code> при установке туннеля HTTP.<br>
    <code>CONNECT developer.mozilla.org:80 HTTP/1.1</code></li>
   <li>Форма звездочки (<em>asterisk form)</em>, просто "звездочка" (<code>'*'</code>) используется <code>с методом OPTIONS</code> и представляет сервер.<br>
    <code>OPTIONS * HTTP/1.1</code></li>
  </ul>
 </li>
 <li><em>Версия HTTP</em>, определяющая структуру оставшегося сообщения, указывая, какую версию предполагается использовать для ответа.</li>
</ol>

<h3 id="Заголовки">Заголовки</h3>

<p><a href="/ru/docs/Web/HTTP/Headers">Заголовки запроса HTTP</a> имеют стандартную для заголовка HTTP структуру: не зависящая от регистра строка, завершаемая (<code>':'</code>) и значение, структура которого определяется заголовком. Весь заголовок, включая значение, представляет собой одну строку, которая может быть довольно длинной.</p>

<p>Существует множество заголовков запроса. Их можно разделить на несколько групп:</p>

<ul>
 <li><em>Основные заголовки (General headers</em>), например, {{HTTPHeader("Via")}},  относящиеся к сообщению в целом</li>
 <li><em>Заголовки запроса (Request headers</em>), например, {{HTTPHeader("User-Agent")}}, {{HTTPHeader("Accept-Type")}}, уточняющие запрос (как, например, {{HTTPHeader("Accept-Language")}}), придающие контекст (как {{HTTPHeader("Referer")}}), или накладывающие ограничения на условия (like {{HTTPHeader("If-None")}}).</li>
 <li><em>Заголовки сущности</em>, например {{HTTPHeader("Content-Length")}}, относящиеся к телу сообщения. Как легко понять, они отсутствуют, если у запроса нет тела.</li>
 <li><img alt="Example of headers in an HTTP request" src="https://mdn.mozillademos.org/files/13821/HTTP_Request_Headers2.png" style="height: 280px; width: 872px;"></li>
</ul>



<h3 id="Тело">Тело</h3>

<p>Последней частью запроса является его тело. Оно бывает не у всех запросов: запросы, собирающие (fetching) ресурсы, такие как <code>GET</code>, <code>HEAD</code>, <code>DELETE</code>, или <code>OPTIONS</code>, в нем обычно не нуждаются. Но некоторые запросы отправляют на сервер данные для обновления, как это часто бывает с запросами <code>POST</code> (содержащими данные HTML-форм).</p>

<p>Тела можно грубо разделить на две категории:</p>

<ul>
 <li>Одноресурсные тела (Single-resource bodies), состоящие из одного отдельного файла, определяемого двумя заголовками: {{HTTPHeader("Content-Type")}} и {{HTTPHeader("Content-Length")}}.</li>
 <li><a href="https://developer.mozilla.org/ru/docs/Web/HTTP/Basics_of_HTTP/MIME_types#multipartform-data">Многоресурсные тела (Multiple-resource bodies</a>), состоящие из множества частей, каждая из которых содержит свой бит информации. Они обычно связаны с <a href="/ru/docs/Web/Guide/HTML/Forms">HTML-формами </a>.</li>
</ul>

<h2 id="Ответы_HTTP">Ответы HTTP</h2>

<h3 id="Строка_статуса_Status_line">Строка статуса (Status line)</h3>

<p>Стартовая строка ответа HTTP, называемая строкой статуса, содержит следующую информацию:</p>

<ol>
 <li><em>Версию протокола</em>, <code>обычно HTTP/1.1</code>.</li>
 <li><em>Код состояния (status code)</em>, показывающая, был ли запрос успешным. Примеры: {{HTTPStatus("200")}}, {{HTTPStatus("404")}} или {{HTTPStatus("302")}}</li>
 <li><em>Пояснение (status text</em>). Краткое текстовое описание кода состояния, помогающее пользователю понять сообщение HTTP..</li>
</ol>

<p>Пример строки статуса: <code>HTTP/1.1 404 Not Found.</code></p>

<h3 id="Заголовки_2">Заголовки</h3>

<p><a href="/ru/docs/Web/HTTP/Headers">Заголовки ответов HTTP</a> имеют ту же структуру, что и все остальные заголовки: не зависящая от регистра строка, завершаемая двоеточием (<code>':'</code>) и значение, структура которого определяется типом заголовка. Весь заголовок, включая значение, представляет собой одну строку.</p>

<p>Существует множество заголовков ответов. Их можно разделить на несколько групп:</p>

<ul>
 <li><em>Основные заголовки (General headers</em>), например, {{HTTPHeader("Via")}},  относящиеся к сообщению в целом.</li>
 <li><em>Заголовки ответа (Response headers</em>), например, {{HTTPHeader("Vary")}} и {{HTTPHeader("Accept-Ranges")}}, сообщающие дополнительную информацию о сервере, которая не уместилась в строку состояния.</li>
 <li><em>Заголовки сущности (Entity headers</em>), например, {{HTTPHeader("Content-Length")}}, относящиеся к телу ответа. Отсутствуют, если у запроса нет тела.</li>
</ul>

<p><img alt="Example of headers in an HTTP response" src="https://mdn.mozillademos.org/files/13823/HTTP_Response_Headers2.png" style="height: 344px; width: 805px;"></p>

<h3 id="Тело_2">Тело</h3>

<p>Последней частью ответа является его тело. Оно есть не у всех ответов: у ответов с кодом состояния, например, {{HTTPStatus("201")}} или {{HTTPStatus("204")}}, оно обычно отсутствует.</p>

<p>Тела можно разделить на три категории:</p>

<ul>
 <li>Одноресурсные тела (Single-resource bodies), состоящие из отдельного файла известной длины, определяемые двумя заголовками: {{HTTPHeader("Content-Type")}} и {{HTTPHeader("Content-Length")}}.</li>
 <li>Одноресурсные тела (Single-resource bodies), состоящие из отдельного файла неизвестной длины, разбитого на небольшие части (chunks) с заголовком {{HTTPHeader("Transfer-Encoding")}}, значением которого  является <code>chunked</code>.</li>
 <li><a href="https://developer.mozilla.org/ru/docs/Web/HTTP/Basics_of_HTTP/MIME_types#multipartform-data">Многоресурсные тела (Multiple-resource bodies)</a>, состоящие из многокомпонентного тела, каждая часть которого содержит свой сегмент информации. Они относительно редки.</li>
</ul>

<h2 id="Фреймы_HTTP2">Фреймы HTTP/2</h2>

<p>Сообщения HTTP/1.x имеют несколько недостатков в отношении производительности:</p>

<ul>
 <li>Заголовки, в отличие от тел, не сжимаются.</li>
 <li>Заголовки, которые зачастую практически совпадают у идущих подряд сообщений, приходится передавать по отдельности.</li>
 <li>Мультиплексность невозможна. Приходится открывать соединение для каждого сообщения, а теплые (warm) соединения TCP эффективнее холодных (cold).</li>
</ul>

<p>HTTP/2 переходит на новый уровень: он делит сообщения HTTP/1.x на фреймы, которые внедряются в поток. Фреймы данных из заголовков отделены друг от друга, что позволяет сжимать заголовки. Несколько потоков можно объединять друг с другом - такой процесс называется мультиплексированием - что позволяет более эффективно использовать TCP-соединения.</p>

<p><img alt="HTTP/2 modify the HTTP message to divide them in frames (part of a single stream), allowing for more optimization." src="https://mdn.mozillademos.org/files/13819/Binary_framing2.png" style="height: 735px; width: 810px;"></p>

<p>Фреймы HTTP сейчас прозрачны для веб-разработчиков. Это дополнительный шаг, который HTTP/2 делает по отношению к сообщениям HTTP/1.1 и лежащему в основе транспортному протоколу. Для реализации фреймов HTTP веб-разработчикам не требуется вносить изменения в имеющиеся APIs; если HTTP/2 доступен и на сервере, и на клиенте, он включается и используется.</p>

<h2 id="Заключение">Заключение</h2>

<p>Сообщения HTTP играют ключевую роль в использовании HTTP; они имеют простую структуру и хорошо расширяемы. Механизм фреймов в HTTP/2 добавляет еще один промежуточный уровень между синтаксисом HTTP/1.x и используемым им транспортным протоколом, не проводя фундаментальных изменений: создается надстройка над уже зарекомендовавшими себя методами.</p>