Чому кажуть, що "HTTP - це протокол без громадянства"?


170

HTTP має файли cookie HTTP. Файли cookie дозволяють серверу відстежувати стан користувача, кількість підключень, останнє з'єднання тощо.

HTTP має стійкі з’єднання (Keep-Alive), де з одного і того ж TCP-з'єднання можна надіслати кілька запитів.


3
Ще одна сфера, де я не бачу "безгромадянства", - це Авторизація - зокрема Проксі-Авторизація. Складається враження, що це під час переговорів. Для аутентифікації NTLM клієнту потрібно пам'ятати тип проксі-аутентифікації, і сервер повинен мати статус, оскільки існує послідовність типів повідомлень NTLM. Тож я не впевнений, що розумію відповіді.
Ліндсей Морсільо

1
Чи варто тепер додати HTTP / 1.1? Тому що я думаю, що HTTP / 2 має стан.
Хосе Нобіле

4
HTTP / 2 є релевантним. HTTP 1 не має статусу. Пізніші доповнення, призначені для HTTP 1, як файли cookie, додали стан. Ці доповнення не відрізняються від "основної" специфікації HTTP 1. Тому, як вважають, HTTP 1 є протоколом без громадянства, хоча на практиці це не так. HTTP / 2, з іншого боку, був розроблений із складовими компонентами, запеченими. Ніяких доповнень не потрібно було задовольняти вимогам бути позначеними як "справжні".
Замікол

Відповіді:


130

Незважаючи на те, що декілька запитів можна надсилати через одне і те ж HTTP-з'єднання, сервер не надає особливого значення їх надходженню через один і той же сокет. Це виключно продуктивність, покликана мінімізувати час / пропускну здатність, які в іншому випадку будуть витрачені на встановлення з'єднання для кожного запиту.

Що стосується HTTP, вони все ще є окремими запитами і повинні містити достатньо інформації, щоб самостійно виконати запит. У цьому суть "безгромадянства". Запити не будуть пов’язані один з одним, якщо немає спільної інформації, про яку знає сервер, яка в більшості випадків є ідентифікатором сеансу у файлі cookie.


1
Що відбувається, коли сервер запам'ятовує сеанс (на стороні сервера) і налаштовує користувацький досвід відповідно до нього?
NurShomik

3
@NurShomik: Див stackoverflow.com/a/3521393/319403 для пояснення того , як сеанси зазвичай працюють.
cHao

12
@Andrew: HTTP не "побудований" на TCP, а стан TCP не є HTTP. Два цілком окремі протоколи на різних шарах в стеку. Ви можете обслуговувати HTTP через названі труби, якщо хочете, або навіть надсилаючи файли навколо, якщо у вас є достатньо мазохістів, щоб погодитися на це, і це діятиме саме тому, що HTTP є транспортно-протокольним-агностиком. На цьому рівні це все лише запити та відповіді. Це робить HTTP сам без стану, незалежно від того, який стан може використовуватися / підтримуватися / вимагатися протоколами нижчого або вищого рівня.
cHao

@cHao Гаразд, я визнаю. Якщо ми визначаємо стан без громадянства як " необов'язково, що для його функціонування потрібно мати стан" (див. Відповідь dimo414 нижче, перелічуючи параметри стану в HTTP, цитованому з Вікіпедії), і якщо ми розглядаємо кожен протокол строго сам по собі, а не грунтуючись на шарах під ним , тоді так, я можу погодитися, що HTTP "без громадянства".
Андрій

101

З Вікіпедії :

HTTP - це протокол без стану. Протокол без стану не вимагає, щоб сервер зберігав інформацію або статус про кожного користувача протягом тривалості декількох запитів.

Але деяким веб-додаткам, можливо, доведеться відстежувати хід користувача від сторінки до сторінки, наприклад, коли для налаштування вмісту веб-сторінки для користувача потрібен веб-сервер. Рішення для цих випадків включають:

  • використання файлів cookie HTTP.
  • сеанси на стороні сервера,
  • приховані змінні (коли поточна сторінка містить форму) та
  • Перезапис URL-адрес з використанням кодованих URI параметрів, наприклад, /index.php?session_id=some_unique_session_code.

Що робить протокол без стану, це те, що сервер не вимагає відстежувати стан за кількома запитами, а не те, що він цього не може зробити, якщо цього хоче. Це спрощує контракт між клієнтом і сервером, і у багатьох випадках (наприклад, подання статичних даних через CDN) мінімізує кількість даних, які потрібно передавати. Якби сервери вимагали підтримувати стан відвідувань клієнтів, структура видачі та відповіді на запити була б складнішою. Так і є, простота моделі - одна з її найбільших особливостей.


21

Оскільки протокол без стану не вимагає, щоб сервер зберігав інформацію про сеанс або статус про кожного партнера по комунікації протягом тривалості декількох запитів.

HTTP - це протокол без стану, який означає, що зв’язок між браузером та сервером втрачається після завершення транзакції.


2
Але HTTP може зберігати інформацію на сервері, використовуючи файли cookie. HTTP не підтримує з'єднання під час кожного запиту.
Хосе Нобіле


18
Збереження інформації на сервері не означає, що з'єднання живе постійно.
srijan

1
@srijan Ну, ні. Так? Ніхто не вимагав іншого.
Марк Амері

10

HTTP називається як, stateless protocolоскільки кожен запит виконується незалежно, без будь-якого знання запитів, які були виконані перед ним, а це означає, що після завершення транзакції зв’язок між браузером і сервером також втрачається.

Протокол statelessполягає в тому, що HTTP у своєму оригінальному дизайні порівняно простий file transfer protocol:

  1. подати запит на файл, названий URL-адресою,
  2. отримати файл у відповідь,
  3. відключити.

Не було підтримувано жодного зв'язку між одним і іншим з'єднанням, навіть від одного і того ж клієнта. Це спрощує контракт між клієнтом і сервером і в багатьох випадках мінімізує кількість даних, які потрібно передати.


3

Якщо протокол HTTP надається як повний протокол State, вікно браузера використовує єдине з'єднання для спілкування з веб-сервером для декількох запитів, наданих веб-додаткам. Це дає можливість вікні браузера тривалий час залучати з'єднання між вікном браузера та веб-серверами та зберігати вони тривалий час знаходяться в режимі очікування. Це може створити ситуацію досягнення максимального з'єднання веб-сервера, навіть якщо більшість з'єднань у клієнтах не працюють.


1
HTTP вже підтримує життя, це означає, що сервер не закриває з'єднання, і клієнт може зробити багато запитів на одне і те ж з'єднання.
Хосе Нобіле

3

HTTP - це без зв'язку, і це прямий результат, що HTTP є протоколом без стану. Сервер та клієнт знають один про одного лише під час поточного запиту. Згодом вони обоє забувають один про одного. Через таку природу протоколу ні клієнт, ні браузер не можуть зберігати інформацію між різними запитами на веб-сторінках.


1

Що без громадянства ??

Після того, як запит буде зроблений і відповідь буде повернута клієнту, з'єднання буде припинено або припинено. Сервер забуде все про запитувач.

Чому без громадянства ??

В Інтернеті вибрано протокол без громадянства. Це був геніальний вибір, оскільки первісна мета Інтернету полягала в тому, щоб дозволити подання документів (веб-сторінок) надзвичайно великим. людей, які використовують дуже базове обладнання для сервера.

Підтримка тривалого зв'язку була б надзвичайно трудомісткою.

Якби в Інтернеті було обрано протокол стану, навантаження на сервер було б збільшено для підтримки зв'язку відвідувача.


1

HTTPє без громадянства. TCPє державним. Немає так званих HTTP connection, а лише HTTP requestі HTTP response. Нам не потрібно нічого підтримувати, щоб зробити інше HTTP request. Заголовок підключення, який є "збереженим в житті", означає TCP, що подальше HTTPзапити та відповіді будуть повторно використані , замість того, щоб постійно відключати та відновлювати TCPз'єднання.


0

Я думаю, що хтось обрав дуже невдалу назву для концепції STATELESS, і саме тому спричинено ціле непорозуміння. Йдеться не про зберігання будь-яких ресурсів, а про взаємини між клієнтом та сервером.

Клієнт: Я зберігаю всі ресурси на своїй стороні і надсилаю вам "список" усіх важливих елементів, які потрібно обробити. Робіть свою роботу.

Сервер: Добре. Дозвольте мені взяти на себе відповідальність за фільтрацію того, що важливо, щоб дати вам належну відповідь.

Що означає, що сервер є "рабом" клієнта і повинен забувати про свого "господаря" після кожного запиту. Власне, STATELESS посилається лише на стан сервера.

https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm#sec_5_1_3

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.