Стандарты HTTP протокола. История развития HTTP протокола. Версии HTTP протокола
Здравствуйте, уважаемые посетители сайта ZametkiNaPolyah.ru. Продолжаем знакомиться с протоколом HTTP в рубрике Серверы и протоколы…
Привет, читатель блога ZametkiNaPolyah.ru! Продолжим знакомиться с протоколом HTTP в рубрике серверы и протоколы и ее разделе HTTP протокол. В этой записи мы с тобой разберем, как отвечает HTTP сервер на запросы клиента. Как всегда: понятно и с примерами, но если тебе что-то будет непонятно — не стесняйся спросить в комментариях. Ответ ты получишь, как минимум, HTTP. Как ты уже догадался, в этой записи мы с тобой будем говорить про HTTP ответы сервера, а конкретнее: про строку состояния HTTP ответа сервера, немного поговорим про коды состояния HTTP ответа, посмотрим какие заголовки сервер может посылать в ответ на запрос и разберем несколько примеров HTTP ответа сервера.
HTTP ответы сервера: строка состояния HTTP ответа, коды состояния, заголовки HTTP ответа, примеры
Содержание статьи:
Если вы хотите узнать всё про протокол HTTP, обратитесь к навигации по рубрике HTTP протокол. HTTP ответы – это HTTP сообщение, которое посылает сервер в ответ на запрос клиента. Ответы HTTP сервера строго регламентированы и имеют четкую структуру. Структура HTTP ответа сервера состоит из:
Для тех кому непонятно словесное описание структуры HTTP ответа сервера приведем пример:
1 2 3 4 5 6 7 8 9 10 11 |
Response = Status-Line ; *( general-header ; | response-header ; | entity-header ) ; CRLF [ message-body ] ; |
Мы обозначили структуру HTTP ответа сервера. Давайте теперь рассмотрим каждую из составляющих HTTP ответа сервера в отдельности.
Первая строка в HTTP ответе – это строка состояния, иначе Status-Line. Она состоит из версии протокола HTTP, числового кода состояния HTTP сервера и поясняющей фразы. Окончание строки состояния в HTTP ответе является символ CRLF. Пример строки состояния HTTP ответа сервера:
1 |
Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF |
Вот таким нехитрым образом записывается строка состояния в HTTP ответ. Да, кстати, строка состояния — это параметр HTTP.
О кодах состояния HTTP ответа я планирую написать несколько отдельных публикаций с пояснениями и дополнениями, а вот в этой записи мы ограничимся лишь кратким обзором кодов состояний HTTP ответа, иначе статья была бы не полной.
Вообще, правильно говорить элемент кода состояния или Status-Code – это целочисленный трехразрядный код результата понимания и удовлетворения запроса клиента. Грубо говоря, это число, которое показывает то, как сервер понял запрос клиента. К коду состояния HTTP ответа идет поясняющая фраз, которая предназначена для людей, чтобы те понимали, что в итоге случилось. Давайте сведем в таблицу коды состояний HTTP сервера и дадим к ним пояснения:
Номер | Код состояния HTTP сервера и его описание |
1 | 1xx: информационный код состояния HTTP сервера Все коды состояний, начинающиеся с единицы говорят клиенту о том, что их запрос получен и находится в обработке и называются они — информационные коды состояния. |
2 | 2xx: успешный код состояния HTTP сервера Все коды состояний, начинающиеся с двойки говорят клиенту о том, что действие закончилось успешно: получено, понято и обработано, такие коды называются успешные HTTP коды. |
3 | 3xx: код перенаправления HTTP сервера Все коды состояния, начинающиеся с тройки говорят клиенту о том, что для продолжения работы ему нужно совершить какие-то действия, это коды получили название кодов перенаправления HTTP сервера. |
4 | 4xx: коды ошибок HTTP клиента Все коды состояния, начинающиеся с четверки говорят нам о том, что ошибка происходит по вине клиента (неверный синтаксис, устаревший протокол и прочее), из-за чего сервер не может корректно отработать и дать ответ. Их называют коды ошибок HTTP клиента. |
5 | 5xx: коды ошибок HTTP сервера Все коды состояний, начинающиеся с пятерки, говорят нам о том, что произошла ошибка на стороне сервера HTTP. И они получили называние коды ошибок HTTP сервера. |
Приведем набор кодов состояний в HTTP и поясняющие фразы к ним:
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 |
Status-Code = "100" ; Продолжать, Continue | "101" ; Переключение протоколов, ; Switching Protocols | "200" ; OK | "201" ; Создан, Created | "202" ; Принято, Accepted | "203" ; Не авторская информация, ; Non-Authoritative Information | "204" ; Нет содержимого, No Content | "205" ; Сбросить содержимое, Reset ; Content | "206" ; Частичное содержимое, Partial ; Content | "300" ; Множественный выбор, Multiple ; Choices | "301" ; Постоянно перенесен, Moved ; Permanently | "302" ; Временно перемещен, Moved ; Temporarily | "303" ; Смотреть другой, See Other | "304" ; Не модифицирован, Not Modified | "305" ; Используйте прокси-сервер, Use ; Proxy | "400" ; Испорченный Запрос, Bad Request | "401" ; Несанкционированно, Unauthorized | "402" ; Требуется оплата, Payment ; Required | "403" ; Запрещено, Forbidden | "404" ; Не найден, Not Found | "405" ; Метод не дозволен, Method Not ; Allowed | "406" ; Не приемлем, Not Acceptable | "407" ; Требуется установление ; подлинности через прокси-сервер, ; Proxy Authentication Required | "408" ; Истекло время ожидания запроса, ; Request Timeout | "409" ; Конфликт, Conflict | "410" ; Удален, Gone | "411" ; Требуется длина, Length Required | "412" ; Предусловие неверно, ; Precondition Failed | "413" ; Объект запроса слишком большой, ; Request Entity Too Large | "414" ; URI запроса слишком длинный, ; Request-URI Too Long | "415" ; Неподдерживаемый медиа тип, ; Unsupported Media Type | "500" ; Внутренняя ошибка сервера, ; Internal Server Error | "501" ; Не реализовано, Not Implemented | "502" ; Ошибка шлюза, Bad Gateway | "503" ; Сервис недоступен, Service ; Unavailable | "504" ; Истекло время ожидания от шлюза, ; Gateway Timeout | "505" ; Не поддерживаемая версия HTTP, ; HTTP Version Not Supported | extension-code extension-code = 3DIGIT Reason-Phrase = *<TEXT не включающий CR, LF> |
Хочу обратить ваше внимание на то, что поясняющая фраза является рекомендацией стандарта HTTP и может быть заменена сервером на свою. Так же стоит заметить, что коды состояний HTTP ответа расширяемы и клиенту не обязательно понимать значения всех кодов состояний, однако каждый клиент должен понимать класс кода состояний, который обозначен первой цифрой.
Поля заголовка HTTP ответа необходимы серверу для того, чтобы передать дополнительную информацию клиенту, которая не может быть помещена в строку состояния. Поля заголовка HTTP ответа помогают клиенту правильно обработать HTTP сообщение сервера. Так же поля заголовка HTTP ответа могут содержать дополнительную информацию о сервере и о дальнейшем доступе к ресурсу, указанному в URI (URI в HTTP):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
response-header = Age ; | Location ; | Proxy-Authenticate ; | Public ; | Retry-After ; | Server ; | Vary ; | Warning ; | WWW-Authenticate ; |
Если вы собрались написать свой HTTP сервер, то без проблем сможете расширить поля заголовка HTTP ответов, это не рекомендуется стандартом, но все же делается и, в принципе, клиенты понимают такое расширение и корректно его отрабатывают. Тут главное соблюдать HTTP требования.
Давайте теперь посмотрим пример HTTP ответа сервера, помните, мы запрашивали у сервера HTML документ в записи про HTTP запросы? Давайте теперь посмотрим, какой ответ нам даст HTTP сервер:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
HTTP/1.1 200 OK Date: Mon, 27 Jul 2009 12:28:53 GMT Server: Apache/2.2.14 (Win32) Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT Content-Length: 88 Content-Type: text/html Connection: Closed <html> <body> <h1>Hello, World!</h1> </body> </html> |
А теперь давайте посмотрим, какой ответ нам даст HTTP сервер, если произойдет ошибка и сервер не сможет найти требуемую нам страницу:
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 |
HTTP/1.1 404 Not Found Date: Sun, 18 Oct 2012 10:36:20 GMT Server: Apache/2.2.14 (Win32) Content-Length: 230 Connection: Closed Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html> <head> <title>404 Not Found</title> </head> <body> <h1>Not Found</h1> <p>The requested URL /t.html was not found on this server.</p> </body> </html> |
И третий пример покажет нам, что ответит HTTP сервер, если обнаружит, что клиент пользуется другой версией HTTP протокола:
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 |
HTTP/1.1 400 Bad Request Date: Sun, 18 Oct 2012 10:36:20 GMT Server: Apache/2.2.14 (Win32) Content-Length: 230 Content-Type: text/html; charset=iso-8859-1 Connection: Closed <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html> <head> <title>400 Bad Request</title> </head> <body> <h1>Bad Request</h1> <p>Your browser sent a request that this server could not understand.</p> <p>The request line contained invalid characters following the protocol string.</p> </body> </html> |
Вот так легко и просто мы разобрались с HTTP ответами сервера.
Спасибо за полное разъяснения кодов состояний ответ сервера и за полный список кодов в HTTP ответах, этой страничкой, как справочником пользоваться буду: очень удобно, когда всё в одном месте!
Вы писали про символ CRLF, что это такое, я понимаю, что вопрос не про HTTP ответы, так всё понятно, кроме этого преславутого CRLF.
Символ CRLF — свдивунть каретку перетянуть бумагу, что-то вроде этого, этот символ идет со времен мейнфреймов и означает перевод на новую строку. В сообщениях HTTP, не важно, запрос то или ответ, данный символ означает окончание строки. Если строка содержит только символ CRLF, то это означает окончание блока.
Кирилл, спасибо, как всегда — отлично, ясно и доступно! 🙂 Только вот не понятно какие значения могут быть в полях заголовка? Все ваши публикации пересмотрела и про сообщения и про ответа, и даже про запросы, дошла до самых первых статей в рубрике HTTP, но ответа не нашла 🙁
Про поля заголовков в HTTP сообщениях будет отдельная публикация, надеюсь, что скоро!