aboutsummaryrefslogtreecommitdiff
path: root/files/ru/web/http/session/index.html
blob: 42de7948531aadf682ac641a45562481fa6575e7 (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
148
149
150
151
152
153
154
155
156
157
158
---
title: HTTP сессия
slug: Web/HTTP/Session
tags:
  - HTTP
translation_of: Web/HTTP/Session
---
<div>{{HTTPSidebar}}</div>

<p>Так как HTTP — это клиент-серверный протокол, HTTP сессия состоит из трёх фаз:</p>

<ol>
 <li>Клиент устанавливает TCP соединения (или другое соединение, если не используется TCP транспорт).</li>
 <li>Клиент отправляет запрос и ждёт ответа. </li>
 <li>Сервер обрабатывает запрос и посылает ответ, в котором содержится код статуса и соответствующие данные. </li>
</ol>

<p>Начиная с версии HTTP/1.1, после третьей фазы соединение не закрывается, так как клиенту позволяется инициировать другой запрос. То есть, вторая и третья фазы могут повторяться.</p>

<h2 id="Установка_соединения">Установка соединения</h2>

<p>Так как HTTP это клиент-серверный протокол, соединение всегда устанавливается клиентом. Открыть соединение в HTTP — значит установить соединение через соответствующий транспорт, обычно TCP.</p>

<p>В случае с TCP, в качестве порта HTTP сервера по умолчанию на компьютере используется порт 80, хотя другие также часто используются, например 8000 или 8080. URL загружаемой страницы содержит доменное имя и порт, который можно и не  указывать если он соответствует порту по умолчанию. </p>

<div class="note"><strong>Имеем в виду:</strong> Клиент-серверная модель не позволяет серверу посылать данные клиенту без явного запроса этих данных. Чтобы обойти эту проблему, веб разработчики используют различные техники: периодически пингуют сервер используя <a href="/en/DOM/XMLHttpRequest" title="en/XMLHTTPRequest">XMLHTTPRequest</a> Javascript объект, HTML <a href="/en/WebSockets" title="en/WebSockets">WebSockets API</a>, или похожие протоколы.</div>

<h2 id="Отправка_запроса_клиента">Отправка запроса клиента</h2>

<p>Когда соединение установлено user-agent может послать запрос. (user-agent это обычно веб браузер, но может им не быть) Клиентский запрос это текстовые директивы, разделенные между собой при помощи CRLF (переноса строки).  Сам запрос включает в себя три блока:</p>

<ol>
 <li>Первые строки содержат метод запроса и его параметры:
  <ul>
   <li>путь к документу - абсолютная URL без указания протокола и доменного имени</li>
   <li>версию HTTP протокола </li>
  </ul>
 </li>
 <li>Каждая последующая строка представляет собой HTTP заголовок и передает серверу некоторую информацию о типах предпочитаемых данных (наприм. какой язык , какие MIME типы) или инструкции меняющие поведение сервера (наприм. не отправлять ответ, если он уже в кэше) . Эти HTTP заголовки формируют блок, который заканчивается пустой строкой.</li>
 <li>Последний блок является не обязательным и содержит дополнительные данные. По большей части используется методом POST.</li>
</ol>

<h3 id="Примеры_запросов">Примеры запросов</h3>

<p>Получаем главную страницу developer.mozilla.org,  <a class="linkification-ext external" href="/" title="Linkification: http://developer.mozilla.org/">http://developer.mozilla.org/</a>, и говорим серверу, что user-agent предпочитает страницу на французском, если это возможно:</p>

<pre>GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: fr

</pre>

<p>Обращаем внимание на пустую строку в конце, которая отделяет блок данных от блока заголовков. Так как в запросе отсутствует <code>Content-Length:</code> HTTP заголовок, блок с данными пуст и сервер может начать обработку запроса, как только получит пустую строку, означающую конец заголовков.</p>

<p>Отправляем результат сабмита формы:</p>

<pre>POST /contact_form.php HTTP/1.1
Host: developer.mozilla.org
Content-Length: 64
Content-Type: application/x-www-form-urlencoded

name=Joe%20User&amp;request=Send%20me%20one%20of%20your%20catalogue</pre>

<h3 id="Методы_запроса">Методы запроса</h3>

<p>HTTP определяет набор <a href="/en-US/docs/Web/HTTP/Methods">методов запроса</a> с указанием желаемого действие на ресурсе. Хотя они также могут быть и существительными, эти запросы методы иногда называют HTTP-командами. Наиболее распространенные запросы <code>GET</code> и <code>POST</code>:</p>

<ul>
 <li>{{HTTPMethod("GET")}} используется для запроса содержимого указанного ресурса. Запрос с использованием <code>GET</code> должен только получать данные.</li>
 <li>{{HTTPMethod("POST")}} метод отправляет данные на сервер, так что он может изменять свое состояние. Этот метод часто используется для <a href="/en-US/docs/Web/Guide/HTML/Forms">HTML форм</a>.</li>
</ul>

<h2 id="Структура_ответа_от_сервера">Структура ответа от сервера</h2>

<p>После того как присоединенный агент отправил свой запрос, веб сервер обрабатывает его и отправляет ответ. По аналогии с клиентским запросом, ответ сервера — это текстовые директивы разделенные между собой CRLF, сгруппированные в три разных блока:</p>

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

<h3 id="Примеры_ответов">Примеры ответов</h3>

<p>Успешное получение веб страницы:</p>

<pre>HTTP/1.1 200 OK
Date: Sat, 09 Oct 2010 14:28:02 GMT
Server: Apache
Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
ETag: "51142bc1-7449-479b075b2891b"
Accept-Ranges: bytes
Content-Length: 29769
Content-Type: text/html

&lt;!DOCTYPE html... <em><strong>(здесь идут 29769 байтов запрошенной веб-страницы)</strong></em>

</pre>

<p>Сообщение о том, что запрашиваемый ресурс был перемещен:</p>

<pre>HTTP/1.1 301 Moved Permanently
Server: Apache/2.2.3 (Red Hat)
Content-Type: text/html; charset=iso-8859-1
Date: Sat, 09 Oct 2010 14:30:24 GMT
Location: <a class="linkification-ext" href="../../../../" title="Linkification: https://developer.mozilla.org/">https://developer.mozilla.org/</a> <strong><em>(это новый адрес запрошенного ресурса, ожидается, что клиент запросит его</em><em>)</em></strong>
Keep-Alive: timeout=15, max=98
Accept-Ranges: bytes
Via: Moz-Cache-zlb05
Connection: Keep-Alive
X-Cache-Info: caching
X-Cache-Info: caching
Content-Length: 325 <strong><em>(Контент содержит стандартную страницу, которая будет показана, если клиент не может перейти по ссылке)</em></strong>

&lt;!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"&gt;
&lt;html&gt;&lt;head&gt;
&lt;title&gt;301 Moved Permanently&lt;/title&gt;
&lt;/head&gt;&lt;body&gt;
&lt;h1&gt;Moved Permanently&lt;/h1&gt;
&lt;p&gt;The document has moved &lt;a href="<a class="linkification-ext" href="../../../../" title="Linkification: https://developer.mozilla.org/">https://developer.mozilla.org/</a>"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;address&gt;Apache/2.2.3 (Red Hat) Server at developer.mozilla.org Port 80&lt;/address&gt;
&lt;/body&gt;&lt;/html&gt;

</pre>

<p>Сообщение о том, что запрашиваемый ресурс не существует:</p>

<pre>HTTP/1.1 404 Not Found
Date: Sat, 09 Oct 2010 14:33:02 GMT
Server: Apache
Last-Modified: Tue, 01 May 2007 14:24:39 GMT
ETag: "499fd34e-29ec-42f695ca96761;48fe7523cfcc1"
Accept-Ranges: bytes
Content-Length: 10732
Content-Type: text/html

&lt;!DOCTYPE html... <strong><em>(содержит пользовательскую страницу, помогающую пользователю найти отсутсвующий ресурс)</em></strong>
</pre>

<h3 id="Коды_статусов_ответа">Коды статусов ответа</h3>

<p><a href="/ru/docs/Web/HTTP/Status">HTTP-коды ответов</a> показывают, выполнен ли успешно определенный HTTP-запрос. Ответы сгруппированы в пять классов: информационные ответы, успешные ответы, редиректы, ошибки клиента и ошибки сервера.</p>

<ul>
 <li>{{HTTPStatus(200)}}: OK. Запрос завершился успехом.</li>
 <li>{{HTTPStatus(301)}}: Moved Permanently. Этот код значит, что URI запрошенного ресурса был изменён.</li>
 <li>{{HTTPStatus(404)}}: Not Found. Сервер не может найти запрошенный ресурс.</li>
</ul>

<h2 id="См._также">См. также</h2>

<ul>
 <li><a href="/en-US/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web">Определение ресурсов в Интернете</a></li>
 <li><a href="/ru/docs/Web/HTTP/Заголовки">HTTP заголовки</a></li>
 <li><a href="/ru/docs/Web/HTTP/Methods">Методы HTTP запроса</a></li>
 <li><a href="/ru/docs/Web/HTTP/Status">Коды ответа HTTP</a></li>
</ul>