Dlaczego mówi się, że „HTTP jest protokołem bezstanowym”?

170

HTTP zawiera pliki cookie HTTP. Pliki cookie pozwalają serwerowi śledzić stan użytkownika, liczbę połączeń, ostatnie połączenie itp.

HTTP ma trwałe połączenia (Keep-Alive), w których kilka żądań może być wysyłanych z tego samego połączenia TCP.

Jose Nobile
źródło
3
Innym obszarem, w którym nie widzę „bezpaństwowości”, jest autoryzacja - szczególnie autoryzacja proxy. Wydaje się, że w negocjacjach jest to stanowe. W przypadku uwierzytelniania NTLM klient musi pamiętać typ uwierzytelniania proxy, a serwer musi być stanowy, ponieważ istnieje sekwencja typów komunikatów NTLM. Więc nie jestem pewien, czy rozumiem odpowiedzi.
Lindsay Morsillo
1
Czy powinienem teraz dodać HTTP / 1.1? Ponieważ myślę, że HTTP / 2 ma stan.
Jose Nobile
4
HTTP / 2 jest stanowy. HTTP 1 jest bezstanowy. Późniejsze dodatki przeznaczone dla HTTP 1, takie jak pliki cookie, dodano stan. Te dodatki nie są poza „podstawową” specyfikacją HTTP 1. To dlatego HTTP 1 jest protokołem bezstanowym, chociaż w praktyce nim nie jest. Z drugiej strony HTTP / 2 został zaprojektowany z wypalonymi składnikami stanowymi. Żadne dodatki nie były wymagane, aby spełnić wymóg oznaczenia jako „stanowy”.
Zamicol

Odpowiedzi:

130

Mimo że wiele żądań może być wysyłanych przez to samo połączenie HTTP, serwer nie przywiązuje specjalnego znaczenia do ich przychodzenia przez to samo gniazdo. Jest to wyłącznie kwestia wydajności, mająca na celu zminimalizowanie czasu / przepustowości, które w przeciwnym razie zostałyby wydane na ponowne ustanawianie połączenia dla każdego żądania.

Jeśli chodzi o HTTP, wszystkie są nadal oddzielnymi żądaniami i same muszą zawierać wystarczającą ilość informacji, aby spełnić żądanie. Na tym polega istota „bezpaństwowości”. Żądania nie będą ze sobą kojarzone bez niektórych wspólnych informacji, o których wie serwer, którymi w większości przypadków jest identyfikator sesji w pliku cookie.

cHao
źródło
1
Co się dzieje, gdy serwer zapamiętuje sesję (po stronie serwera) i dostosowuje doświadczenie użytkownika zgodnie z nią?
NurShomik,
3
@NurShomik: Zobacz stackoverflow.com/a/3521393/319403, aby uzyskać wyjaśnienie, jak zwykle działają sesje.
cHao
12
@Andrew: HTTP nie jest „zbudowany na” TCP, a stan TCP nie jest HTTP. Te dwa są całkowicie oddzielnymi protokołami na różnych warstwach stosu. Możesz obsługiwać HTTP przez nazwane potoki, jeśli chcesz, lub nawet wysyłając pliki, jeśli masz wystarczająco dużo masochistów, aby się na to zgodzić, i działałoby to właśnie dlatego, że HTTP jest niezależny od protokołu transportowego. Na tym poziomie to tylko prośby i odpowiedzi. To sprawia, że ​​sam HTTP jest bezstanowy, niezależnie od tego, jaki stan może być używany / obsługiwany / wymagany przez protokoły niższego lub wyższego poziomu.
cHao
@cHao OK, przyznaję. Jeśli zdefiniujemy bezpaństwowość jako „ niekoniecznie musi mieć stan, aby działać” (zobacz odpowiedź dimo414 poniżej, wymieniając opcje stanu w HTTP cytowaną z Wikipedii) i jeśli spojrzymy na każdy protokół ściśle samodzielnie, a nie na podstawie warstw poniżej , to tak, zgadzam się, że HTTP jest „bezstanowe”.
Andrew,
101

Z Wikipedii :

HTTP to protokół bezstanowy. Protokół bezstanowy nie wymaga od serwera przechowywania informacji lub statusu każdego użytkownika przez czas trwania wielu żądań.

Jednak niektóre aplikacje internetowe mogą wymagać śledzenia postępów użytkownika ze strony na stronę, na przykład gdy serwer sieciowy jest wymagany do dostosowania zawartości strony internetowej dla użytkownika. Rozwiązania dla tych przypadków obejmują:

  • stosowanie plików cookie HTTP.
  • sesje po stronie serwera,
  • ukryte zmienne (gdy bieżąca strona zawiera formularz) i
  • Przepisywanie adresu URL przy użyciu parametrów zakodowanych w URI, np. /Index.php?session_id=some_unique_session_code.

To, co sprawia, że ​​protokół jest bezstanowy, to fakt, że serwer nie musi śledzić stanu wielu żądań, a nie to, że nie może tego zrobić, jeśli chce. Upraszcza to umowę między klientem a serwerem, aw wielu przypadkach (na przykład serwowanie danych statycznych przez CDN) minimalizuje ilość danych, które należy przesłać. Gdyby serwery były zobowiązane do utrzymywania stanu wizyt klientów, struktura wysyłania żądań i odpowiadania na nie byłaby bardziej złożona. W tej chwili prostota modelu jest jedną z jego największych cech.

dimo414
źródło
21

Ponieważ protokół bezstanowy nie wymaga od serwera zachowywania informacji o sesji lub statusu każdego partnera komunikacyjnego przez czas trwania wielu żądań.

HTTP to protokół bezstanowy, co oznacza, że ​​połączenie między przeglądarką a serwerem jest tracone po zakończeniu transakcji.

Rahul Tripathi
źródło
2
Jednak HTTP może zapisywać informacje na serwerze za pomocą plików cookie. HTTP z utrzymaniem aktywności nie zamyka połączenia przy każdym żądaniu.
Jose Nobile
3
Przeczytaj ten artykuł: - ecst.csuchico.edu/~amk/foo/advjava/notes/servlets/Cookies.html
Rahul Tripathi
18
Zapisywanie informacji na serwerze nie oznacza, że ​​połączenie jest stale aktywne.
srijan
1
@srijan Cóż, nie. Więc? Nikt nie twierdził inaczej.
Mark Amery
10

HTTP jest wywoływane jako stateless protocolżądanie, ponieważ każde żądanie jest wykonywane niezależnie, bez żadnej wiedzy o żądaniach, które zostały wykonane przed nim, co oznacza, że ​​po zakończeniu transakcji połączenie między przeglądarką a serwerem jest również tracone.

Tym, co sprawia, że ​​protokół statelessjest pierwotny, jest HTTP jest stosunkowo prostym file transfer protocol:

  1. zgłoś żądanie pliku o nazwie podanej w adresie URL,
  2. otrzymać plik w odpowiedzi,
  3. rozłączyć się.

Nie było żadnego związku między jednym a drugim połączeniem, nawet od tego samego klienta. Upraszcza to umowę między klientem a serwerem, aw wielu przypadkach minimalizuje ilość przesyłanych danych.

Mobeen Sarwar
źródło
3

Jeśli protokół HTTP jest podany jako pełny protokół stanu, okno przeglądarki używa pojedynczego połączenia do komunikacji z serwerem WWW dla wielu żądań wysyłanych do aplikacji internetowej. Daje to szansę oknu przeglądarki na nawiązanie połączenia między oknem przeglądarki a serwerami sieciowymi przez długi czas i utrzymanie są w stanie bezczynności przez długi czas, co może doprowadzić do osiągnięcia maksymalnej liczby połączeń serwera WWW, mimo że większość połączeń klientów jest bezczynna.

Rajasekhar reddy
źródło
1
HTTP już utrzymuje aktywność, co oznacza, że ​​serwer nie zamyka połączenia, a klient może wysyłać wiele żądań w tym samym połączeniu.
Jose Nobile
3

HTTP jest protokołem bezpołączeniowym i bezpośrednio wynika z tego, że HTTP jest protokołem bezstanowym. Serwer i klient znają się nawzajem tylko podczas bieżącego żądania. Potem oboje zapominają o sobie. Ze względu na ten charakter protokołu ani klient, ani przeglądarka nie mogą zachować informacji między różnymi żądaniami na stronach internetowych.

user3496740
źródło
1

Co to jest bezpaństwowiec?

Gdy żądanie zostanie wykonane, a odpowiedź zostanie zwrócona klientowi, połączenie zostanie zerwane lub zakończone. Serwer zapomni o żądającym.

Dlaczego bezpaństwowcy?

Sieć wybiera protokół bezstanowy. To był genialny wybór, ponieważ pierwotnym celem sieci było umożliwienie obsługi dokumentów (stron internetowych) bardzo dużym nie. osób korzystających z bardzo podstawowego sprzętu dla serwera.

Utrzymanie długotrwałego połączenia wymagałoby ogromnych zasobów.

Gdyby sieć WWW została wybrana jako protokół stanowy, obciążenie serwera zostałoby zwiększone w celu utrzymania połączenia odwiedzającego.

chirag soni
źródło
1

HTTPjest bezpaństwowcem. TCPjest stanowy. Nie ma tzw. HTTP connection, Ale tylko HTTP requesti HTTP response. Nie potrzebujemy niczego do utrzymania, aby stworzyć kolejny HTTP request. Nagłówek połączenia, który jest „utrzymywany przy życiu” oznacza, że TCPbędzie on ponownie używany przez kolejne HTTPżądania i odpowiedzi, zamiast rozłączania i ponownego ustanawiania TCPpołączenia przez cały czas.

Xing
źródło
0

Myślę, że ktoś wybrał bardzo niefortunną nazwę dla koncepcji STATELESS i to jest przyczyną całego nieporozumienia. Nie chodzi o przechowywanie jakichkolwiek zasobów, ale raczej o relacje między klientem a serwerem.

Klient: Trzymam wszystkie zasoby po swojej stronie i przesyłam Ci „listę” wszystkich ważnych elementów, które wymagają przetworzenia. Wykonuj swoją pracę.

Serwer: W porządku… wezmę na siebie odpowiedzialność za filtrowanie tego, co jest ważne, aby dać ci właściwą odpowiedź.

Oznacza to, że serwer jest „slave” klienta i po każdym żądaniu musi zapomnieć o swoim „master”. W rzeczywistości STATELESS odnosi się tylko do stanu serwera.

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

JacobTheKnitter
źródło