Основы протокола HTTP
HTTP (Hypertext Transfer Protocol) в стеке протоколов
TCP/IP
Application BGP · DHCP · DNS · FTP · HTTP · IMAP · IRC · LDAP · MGCP · NNTP · NTP · POP
· RIP · RPC · RTP · SIP · SMTP · SNMP · SSH · Telnet · TLS/SSL · XMPP
Transport TCP · UDP · DCCP · SCTP · RSVP · ECN
Internet IP (IPv4, IPv6) · ICMP · ICMPv6 · IGMP · IPsec ·
Link ARP/InARP · NDP · OSPF · Tunnels (L2TP) · PPP · Media Access Control
(Ethernet, DSL, ISDN, FDDI)
Версии протокола HTTP
• HTTP/0.9 – 1990-1992 г.
• HTTP/1.0 – 1996 г.
• HTTP/1.1 – 1999 г. – текущая версия
• HTTP-NG (HTTP Next Generation) – предложен в 1998 году, но
развития не получил
Программное обеспечение
• Исходные серверы – хранение ресурсов, обработка запросов
• Клиенты – потребители услуг (браузеры, менеджеры закачек, а
также роботы, краулеры)
• Прокси, кэши – транспортные функции, кэширование,
распределение нагрузки.
Сообщения протокола
• Запросы
• Ответы
Структура сообщений протокола
• Стартовая строка (англ. Starting line) — определяет тип сообщения;
• Заголовки (англ. Headers) — характеризуют тело сообщения, содержат
параметры передачи и прочие сведения;
• Тело сообщения (англ. Message Body) — непосредственно данные
сообщения. Обязательно должно отделяться от заголовков пустой
строкой.
Стартовая строка запроса
GET URI — для версии протокола 0.9.
Метод URI HTTP/Версия — для остальных версий.
Методы запроса
Метод URI HTTP/Версия
• GET – запрос содержимого ресурса
• POST – передача данных ресурсу
• HEAD – получение только заголовков ответа
• OPTIONS – определение возможностей сервера
• PUT – загрузка содержимого запроса на указанный URI
• DELETE – удаление ресурса
Пример
• Запрос GET
GET /wiki/страница HTTP/1.1
Host: [Link]
User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru;
rv:1.9b5) Gecko/2008050509 Firefox/3.0b5
Accept: text/html
Connection: close
Стартовая строка ответа
HTTP/Версия КодСостояния Пояснение
Статусы ответа
• 1xx Informational (Информационный) – информируют о процессе
передачи.
• 2xx Success (Успешно) – успешное получение и обработка
запроса.
• 3xx Redirection (Перенаправление) – для выполнения запроса
нужно обратиться по другому адресу.
• 4xx Client Error (Ошибка клиента) – неверный запрос
• 5xx Server Error (Ошибка сервера) – неудачное выполнение
операции на сервере
Пример
• Ответ
HTTP/1.1 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
(далее следует запрошенная страница в HTML)
Пример
• Запрос POST
POST /login HTTP/1.1
Host: [Link]
Content-Type: application/x-www-form-urlencoded
Content-Length: 49
email=test%[Link]&password=secure&login=login
HTTP cookie
• Запрос браузера 1
GET /[Link] HTTP/1.1
Host: [Link]
• Заголовки ответа сервера
HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: name=value; expires=date; path=/;
domain=.[Link].; secure; httponly
• Запрос браузера 2
GET /[Link] HTTP/1.1
Host: [Link]
Cookie: name=value
Другие возможности протокола
• Частичные GET и докачка
GET /[Link] 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
• Условные GET
If-Modified-Since: Wed, 21 Apr 2010 12:33:42 GMT
HTTP/1.1 304 Not Modified
Другие возможности протокола
• Множественное содержание
POST /[Link] HTTP/1.1
Host: [Link]
Content-Type: multipart/form-data;
boundary="Asrf456BGe4h"
--Asrf456BGe4h
Content-Disposition: form-data; name="DestAddress"
test@[Link]
--Asrf456BGe4h
Content-Disposition: form-data; name="MessageTitle"
…
Другие возможности протокола
• HTTP Authentication
GET /private/[Link] HTTP/1.1
Host: localhost
HTTP/1.1 401 Authorization Required
WWW-Authenticate: Basic realm="Secure Area“
GET /private/[Link] HTTP/1.1
Host: localhost
Authorization: Basic base64(username:password)
HTTP взаимодействие с помощью telnet
• Запустить консоль (Windows+R, cmd)
• В консоли набрать telnet [Link] 80
• Чтобы видеть вводимые команды сделать следующее:
• Нажать Ctrl+]
• Набрать set localecho, ввод
• Еще раз ввод
• Набрать
GET / HTTP/1.1
Host: [Link]
• Дважды нажать ввод