Сессия
Типичная HTTP-сессия
В протоколах клиент-сервер, таких как HTTP, сессии состоят из трёх фаз:
- Клиент устанавливает TCP-соединение (или соответствующее соединение, если транспортный уровень не TCP).
- Клиент отправляет свой запрос и ждёт ответа.
- Сервер обрабатывает запрос, отправляя обратно свой ответ, предоставляя код состояния и соответствующие данные.
Начиная с HTTP/1.1, соединение больше не закрывается после завершения третьей фазы, и клиенту теперь разрешено отправлять дальнейшие запросы: это означает, что вторая и третья фазы теперь могут выполняться любое количество раз.
Установление соединения
В протоколах клиент-сервер именно клиент устанавливает соединение. Открытие соединения в HTTP означает инициацию соединения на базовом транспортном уровне, обычно это TCP.
В TCP по умолчанию порт для HTTP-сервера на компьютере — порт 80. Также могут использоваться другие порты, такие как 8000 или 8080. URL страницы для получения содержит как доменное имя, так и номер порта, хотя последний можно опустить, если он равен 80. Для получения более подробной информации см. Идентификация ресурсов в Интернете.
Примечание: Модель клиент-сервер не позволяет серверу отправлять данные клиенту без явного запроса на это. Для решения этой проблемы веб-разработчики используют несколько методик: периодически обращаются к серверу с помощью API XMLHTTPRequest, fetch(), используя API WebSockets или аналогичные протоколы.
Отправка запроса клиентом
После установления соединения пользовательский агент может отправить запрос (пользовательский агент обычно — веб-браузер, но это может быть и что-то другое, например, робот-паук). Запрос клиента состоит из текстовых директив, разделённых символами CRLF (возврат каретки, затем перевод строки), разделёнными на три блока:
- Первая строка содержит метод запроса и его параметры:
- путь к документу в качестве абсолютного URL без протокола или доменного имени
- версия HTTP-протокола
- Следующие строки представляют заголовок HTTP, предоставляющий серверу информацию о типе данных (например, язык, MIME-типы) или другие данные, изменяющие его поведение (например, не отправлять ответ, если он уже кэширован). Эти заголовки HTTP образуют блок, который заканчивается пустой строкой.
- Последний блок — это необязательный блок данных, который может содержать дополнительные данные, в основном используемые методом POST.
Примеры запросов
Получение корневой страницы developer.mozilla.org, (https://developer.mozilla.org/), и указание серверу, что пользовательский агент предпочитал бы страницу на французском языке, если это возможно:
GET / HTTP/1.1 Host: developer.mozilla.org Accept-Language: fr
Обратите внимание на конечную пустую строку. Она отделяет блок данных от блока заголовков. Поскольку в HTTP-заголовке нет Content-Length, этот блок данных представлен пустым, что отмечает конец заголовков, позволяя серверу обработать запрос в момент получения этой пустой строки.
Например, отправка результата формы:
POST /contact_form.php HTTP/1.1 Host: developer.mozilla.org Content-Length: 64 Content-Type: application/x-www-form-urlencoded name=Joe%20User&request=Send%20me%20one%20of%20your%20catalogue
Методы запросов
HTTP определяет набор методов запросов, указывающих желаемое действие, которое должно быть выполнено над ресурсом. Хотя они также могут быть существительными, эти методы запросов иногда называют HTTP-глаголами. Наиболее распространённые запросы — GET и POST:
Структура ответа сервера
После того, как подключённый агент отправил свой запрос, веб-сервер обрабатывает его и в конечном итоге возвращает ответ. Подобно запросу клиента, ответ сервера формируется из текстовых директив, разделённых CRLF, но разделённых на три блока:
- Первая строка, строка состояния, состоит из подтверждения используемой версии HTTP, за которым следует код состояния ответа (и его краткое значение в удобочитаемой форме).
- Следующие строки представляют собой конкретные заголовки HTTP, предоставляющие клиенту информацию о переданных данных (например, тип, размер данных, используемый алгоритм сжатия, подсказки о кэшировании). Аналогично блоку заголовков HTTP для запроса клиента, эти заголовки HTTP образуют блок, завершающийся пустой строкой.
- Последний блок — блок данных, который содержит необязательные данные.
Примеры ответов
Успешный ответ веб-страницы:
HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Content-Length: 55743 Connection: keep-alive Cache-Control: s-maxage=300, public, max-age=0 Content-Language: en-US Date: Thu, 06 Dec 2018 17:37:18 GMT ETag: "2e77ad1dc6ab0b53a2996dfd4653c1c3" Server: meinheld/0.6.1 Strict-Transport-Security: max-age=63072000 X-Content-Type-Options: nosniff X-Frame-Options: DENY X-XSS-Protection: 1; mode=block Vary: Accept-Encoding,Cookie Age: 7 <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>A simple webpage</title> </head> <body> <h1>Simple HTML webpage</h1> <p>Hello, world!</p> </body> </html>
Уведомление о том, что запрашиваемый ресурс был постоянно перемещён:
HTTP/1.1 301 Moved Permanently Server: Apache/2.4.37 (Red Hat) Content-Type: text/html; charset=utf-8 Date: Thu, 06 Dec 2018 17:33:08 GMT Location: https://developer.mozilla.org/ (this is the new link to the resource; it is expected that the user-agent will fetch it) Keep-Alive: timeout=15, max=98 Accept-Ranges: bytes Via: Moz-Cache-zlb05 Connection: Keep-Alive Content-Length: 325 (the content contains a default page to display if the user-agent is not able to follow the link) <!DOCTYPE html>… (contains a site-customized page helping the user to find the missing resource)
Уведомление о том, что запрашиваемого ресурса не существует:
HTTP/1.1 404 Not Found Content-Type: text/html; charset=utf-8 Content-Length: 38217 Connection: keep-alive Cache-Control: no-cache, no-store, must-revalidate, max-age=0 Content-Language: en-US Date: Thu, 06 Dec 2018 17:35:13 GMT Expires: Thu, 06 Dec 2018 17:35:13 GMT Server: meinheld/0.6.1 Strict-Transport-Security: max-age=63072000 X-Content-Type-Options: nosniff X-Frame-Options: DENY X-XSS-Protection: 1; mode=block Vary: Accept-Encoding,Cookie X-Cache: Error from cloudfront <!DOCTYPE html>… (contains a site-customized page helping the user to find the missing resource)
Коды состояния ответа
Коды состояния ответа HTTP указывают, был ли успешно выполнен конкретный HTTP-запрос. Ответы сгруппированы в пять классов: информационные ответы, успешные ответы, перенаправления, ошибки клиента и ошибки сервера.
См. также
© 2005–2022 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Session