HTTP

HTTP — протокол передачі даних, що використовується в комп'ютерних мережах. Назва скорочена від Hyper Text Transfer Protocol, протокол передачі гіпертекстових документів

HTTP належить до протоколів моделі OSI 7-го прикладного рівня.

Основним призначенням протоколу HTTP є передача вебсторінок (текстових файлів з розміткою HTML), хоча за допомогою нього успішно передаються та інші файли, які пов'язані з вебсторінками (зображення та застосунки), так і не пов'язані з ними (у цьому HTTP конкурує зі складнішим FTP).

HTTP припускає, що клієнтська програма — веббраузер — здатна відображати гіпертекстові вебсторінки та файли інших типів у зручній для користувача формі. Для правильного відображення HTTP дозволяє клієнтові дізнатися мову та кодування символів вебсторінки й/або запитати версію сторінки в потрібних мові/кодуванні, використовуючи позначення зі стандарту MIME.

Якщо в URL зі схемою http:// не вказаний порт, то за замовчуванням береться 80[1], (для схеми https — 443[2]).

Структура протоколу[ред. | ред. код]

HTTP — протокол прикладного рівня, схожими на нього є FTP і SMTP. Обмін повідомленнями йде за звичайною схемою «запит-відповідь». Для ідентифікації ресурсів HTTP використовує глобальні URI. На відміну від багатьох інших протоколів, HTTP не зберігає свого стану. Це означає відсутність збереження проміжного стану між парами «запит-відповідь». Компоненти, що використовують HTTP, можуть самостійно здійснювати збереження інформації про стан, пов'язаний з останніми запитами та відповідями. Браузер, котрий посилає запити, може відстежувати затримки відповідей. Сервер може зберігати IP-адреси та заголовки запитів останніх клієнтів. Проте, згідно з протоколом, клієнт та сервер не мають бути обізнаними з попередніми запитами та відповідями, у протоколі не передбачена внутрішня підтримка стану й він не ставить таких вимог до клієнта та сервера.

Кожен запит/відповідь складається з трьох частин:

  1. стартовий рядок;
  2. заголовки;
  3. тіло повідомлення, що містить дані запиту, запитаний ресурс або опис проблеми, якщо запит не виконано.

Обов'язковим мінімумом запиту є стартовий рядок. Починаючи з HTTP/1.1 обов'язковим став заголовок Host: (щоб розрізнити кілька доменів, які мають одну й ту ж IP-адресу).

Запит[ред. | ред. код]

Стартові рядки розрізняються для запиту й відповіді. Рядок запиту виглядає так:

‹Метод› ‹URI› HTTP/‹Версія›   

де ‹Метод› можливо:

OPTIONS
Повертає методи HTTP, які підтримуються сервером. Цей метод може служити для визначення можливостей вебсервера.
GET
Запитує вміст вказаного ресурсу. Запитаний ресурс може приймати параметри (наприклад, пошукова система може приймати як параметр шуканий рядок). Вони передаються в рядку URI (наприклад: http://www.example.net/resource?param1=value1&param2=value2). Згідно зі стандартом HTTP, запити типу GET вважаються ідемпотентними — багаторазове повторення одного і того ж запиту GET повинне приводити до однакових результатів (за умови, що сам ресурс не змінився за час між запитами). Це дозволяє кешувати відповіді на запити GET. Якщо назва ресурсу не вказана (у URI наявні лише схема та доменне ім'я), то вебсервер повертає індекс директорії вебсервера.
HEAD
Аналогічний методу GET, за винятком того, що у відповіді сервера відсутнє тіло. Це корисно для витягання метаінформації, заданої в заголовках відповіді, без пересилання всього вмісту. Зокрема, клієнт чи проксі, перевіривши заголовок Last-Modified: (останній час модифікації), таким чином може переконатися, що сторінка на сервері не змінилася від часу попереднього запиту.
POST
Передає призначені для користувача дані (наприклад, з HTML-форми) заданому ресурсу. Наприклад, в блогах відвідувачі зазвичай можуть вводити свої коментарі до записів в HTML-форму, після чого вони передаються серверу методом POST, і він поміщає їх на сторінку. При цьому передані дані (у прикладі з блогами — текст коментаря) включаються в Тіло запиту (Request body). На відміну від методу GET, метод POST не вважається ідемпотентним, тобто багаторазове повторення одних і тих же запитів POST може повертати різні результати (наприклад, після кожного відправлення коментаря з'являтиметься одна копія цього коментаря).
PUT
Завантажує вказаний ресурс на сервер.
PATCH
Завантажує певну частину ресурсу на сервер.
DELETE
Видаляє вказаний ресурс.
TRACE
Повертає отриманий запит так, що клієнт може побачити, що проміжні сервери додають або змінюють в запиті.
CONNECT
Для використання разом з проксі-серверами, які можуть динамічно перемикатися в тунельний режим SSL.

Переважно використовуються методи GET і POST.

Відповідь сервера[ред. | ред. код]

Перший рядок відповіді має такий вигляд:

HTTP/‹Версія› ‹Код статусу› ‹Опис статусу› 

Коди статусу:

  • 1хх — інформаційний: запит прийнятий, продовжуй процес.
  • 2хх — успіх: дія була успішно передана, зрозуміла, та прийнята.
  • 3хх — перенаправлення: наступні дії мають бути успішно виконані для реалізації запиту.
  • 4хх — помилка клієнта: запит містить синтаксичні помилки або не може бути виконаний.
  • 5хх — помилка сервера: сервер не зміг виконати правильно сформований запит.

Найбільш поширені статуси:

  • 200 OK — запит виконано успішно.
  • 301 Moved Permanently — ресурс переміщено.
  • 403 Forbidden — доступ до запитаного ресурсу заборонений.
  • 404 Not Found — ресурс не знайдений.
  • 503 Service Unavailable — сервіс недоступний.

Заголовки[ред. | ред. код]

Заголовки HTTP — це рядки, кожен з яких складається з імені параметра, за яким слідує двокрапка і його значення. Вони несуть інформацію для браузера або для серверних програм (таких, як CGI-застосунки). Між заголовками і тілом обов'язково повинен бути порожній рядок.

Приклад HTTP діалогу[ред. | ред. код]

Запит[ред. | ред. код]

GET /wiki/HTTP HTTP/1.1 Host: uk.wikipedia.org User-Agent: firefox/5.0 (Linux; Debian 5.0.8; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 Connection: close 

Відповідь[ред. | ред. код]

HTTP/1.1 200 OK Server: Apache Content-Language: uk Content-Type: text/html; charset=utf-8 Content-Length: 1234 (пустий рядок) (далі йде текст html-сторінки) 

Важливо: HTTP-заголовок відокремлюється від повідомлення пустою стрічкою (послідовністю CRLF CRLF). Довжина повідомлення в байтах вказується в параметрі Content-Length.

В першій стрічці відповіді вказується протокол, код відповіді.

Кешування[ред. | ред. код]

Цікавою особливістю мережевих програм є те, що найкраща швидкість роботи досягається, якщо не використовувати мережу. Тому її використання намагаються уникнути запам'ятовуванням попередніх запитів (вебкешуванням), зменшенням частоти запитів або взагалі відсутністю необхідності деяких запитів за допомогою переміщення обробника даних ближче до даних, які він обробляє (див. мобільний код[en])[3].

HTTP/2[ред. | ред. код]

У лютому 2015 комітет IETF (Internet Engineering Task Force), що займається розвитком протоколів і архітектури Інтернет, надав специфікації HTTP/2.0 статус «пропозиції стандарту»[4], а також приступив до формування окремих RFC для протоколу HTTP/2.0 і формату стиснення заголовків HPACK.

Основним завданням створення HTTP/2.0 є підвищення ефективності використання мережевих ресурсів і зниження затримок при з'єднанні і обміні даними між клієнтом і сервером в умовах сучасних реалій, при яких для завантаження сайту потрібно відправити безліч окремих запитів (у середньому близько 100), пов'язаних з отриманням CSS, файлів JavaScript і картинок. Протокол HTTP/1.1, в силу блокувань при конвеєрній передачі даних і високих накладних витрат на віддачу ресурсів невеликого розміру, не може забезпечити належну ефективність і змушує встановлювати кілька одночасних TCP-з'єднань до сервера. В основу HTTP/2.0 покладений протокол SPDY, розроблений компанією Google — він дозволяє прискорити завантаження сайтів на 15-50 %.

Основні особливості (PDF) HTTP/2.0:

  • Застосування бінарного протоколу, що оперує передачею бінарних кадрів. Кожен кадр має заголовок з інформацією про тип, розмір, опції та ідентифікаторі потоку. Кадри з типом DATA використовуються для передачі даних, HEADERS — HTTP-заголовків, RST_STREAM — для дострокового переривання відправлення даних;
  • Мультиплексування і розпаралелювання потоків в рамках одного TCP-з'єднання. Пакети різних потоків змішуються і, на відміну від конвеєрної передачі HTTP/1.1, не очікують закінчення відправлення запиту. Підтримка ефективної двобічної передачі даних. Можливість мультиплексування при зверненні до різних хостів, що дозволяє додатково прискорити одночасне завантаження вебконтенту з різних сайтів (у SPDY мультиплексування підтримується тільки для одного хоста);
  • Можливість встановлення пріоритетів і залежностей для потоків, що дозволяє виділити найважливіші потоки, які потрібно виконати в першу чергу, а також визначити залежність одного потоку від іншого;
  • Стиснення HTTP-заголовків. У тому числі підтримується усунення дублікатів заголовків і Cookie, повторюваних для серії запитів до одного сайту. Допускається визначення окремих заголовків що не підлягають стисненню;
  • Низька чутливість до затримок;
  • Засоби для узгодження протоколу між клієнтом і сервером, що дозволяють вибрати HTTP/1.1, HTTP/2.0 і інші протоколи: сервер надає список підтримуваних протоколів, які може вибрати клієнт. Для шифрованих з'єднань параметри TLS узгоджуються за допомогою протоколу ALPN[en], при якому клієнт повідомляє список підтримуваних опцій, а сервер вибирає найоптимальніший для себе варіант;
  • Забезпечення високого рівня сумісності з HTTP/1.1: збережені заголовки, схема URI, коди стану і методи (GET, POST тощо). Забезпечена можливість створення проксі для доступу клієнтів HTTP/1.1 до серверів HTTP/2.0;
  • Можливість встановлення шифрованих (HTTPS) і не шифрованих з'єднань (HTTP). Шифрування здійснюється з використанням TLS 1.3 або новішої версії. Незважаючи на те, що специфікація дозволяє створення нешифрованих сполучень, розробники Firefox і Google Chrome мають намір забезпечити роботу HTTP/2.0 тільки поверх TLS;
  • Підтримка технології Server push для передачі даних від сервера до клієнта (наприклад, коли сервер вважає, що після певного запиту обов'язково будуть затребувані інші дані, він може відправити ці дані не чекаючи фактичного запиту);
  • Підтримка HTTP/2.0 на час пропозиції стандарту вже реалізована в браузерах

Google Chrome і Firefox, вони вже багато років підтримують цю технологію, і Apple додала підтримку в браузер Safari в 2014 році. В Internet Explorer 11[5][6][7] підтримка реалізована лише для Windows 10.

Великі мобільні веббраузери, в тому числі Android-браузер, Chrome для Android і iOS, а також Safari в iOS 8 і вище підтримують HTTP/2 для мобільного доступу до Інтернету.

Див. також[ред. | ред. код]

Примітки[ред. | ред. код]

  1. RFC 2616 Стандарт HTTP/1.1
  2. RFC 2818 HTTP Over TLS
  3. Fielding Roy. Architectural Styles and the Design of Network-based Software Architectures. — Каліфорнійський університет в Ірвайні, 2000. — 26 September. Архівовано з джерела 7 січня 2017. Процитовано 2009-02-20.
  4. Protocol Action: 'Hypertext Transfer Protocol version 2' to Proposed Standard (draft-ietf-httpbis-http2-17.txt)
  5. HTTP/2: The Long-Awaited Sequel. IEBlog. Процитовано April 24, 2018. 
  6. Lardinois, Frederic (June 26, 2013). Microsoft Confirms IE11 Will Support Google's SPDY Protocol. TechCrunch. Aol. Процитовано September 10, 2013. 
  7. Foley, Mary Jo (November 7, 2013). Microsoft releases for download IE11 for Windows 7. Процитовано November 7, 2013.