W jaki sposób HTTP staje się bezstanowy?

26

Mówi się, że HTTP jest bezstanowy. Oznacza to, że nie musi przechowywać informacji w celu transmisji danych.

Ale HTTP używa TCP, który jest zorientowany na stan.

W takim przypadku, w jaki sposób HTTP staje się bezstanowy?

Mrówki
źródło
6
Jak to nie jest duplikat 5 lat po uruchomieniu Super User?
Peter Mortensen
Ponieważ większość kopii jest w StackOverflow? Tylko zgaduję.
trysis
8
To, że biegnie przez kable (między innymi), nie czyni go również protokołem elektrycznym
Hagen von Eitzen,

Odpowiedzi:

42

HTTP nie przejmuje się - i jest niezależny - jakimkolwiek protokołem niższego poziomu używanym do transportu, nawet jeśli sam jest bezstanowy.

Technologią transportu może być TCP, stary SPX lub SCTP firmy Novell, lub cokolwiek innego, co można wymyślić, a HTTP nadal będzie działał tak samo. HTTP wymaga przesyłania strumieniowego lub protokołu zorientowanego na połączenie - i zależy od rozdzielczości adresów URL - ale nie obchodzi, jak to osiągnąć.

Jest to jeden z powodów istnienia modelu warstwowego lub stosu sieciowego: warstwa aplikacji nie musi zajmować się niższymi warstwami.

To, że protokół niższego poziomu jest stanowy, nie oznacza, że ​​nic nad nim automatycznie staje się stanowe lub wymaga stanu.

Sam HTTP jest bezstanowy. Oznacza to, że aplikacje muszą zaimplementować kolejną warstwę na HTTP, aby ustalić stan. Zazwyczaj odbywa się to za pomocą sesyjnych plików cookie.

LawrenceC
źródło
1
Routing odbywa się na poziomie TCP / IP.
Fiasco Labs
3
Ten obraz ładnie to wyjaśnia. vichargrave.com/wp-content/uploads/2013/01/…
JakeGould
2
W istocie fakt, że HTTP ignoruje stan połączenia bazowego (który prawie zawsze będzie TCP), jest jednym z głównych niedoborów wydajności, którym próbują zaradzić różne podejścia HTTP2 .
skolima
2
@Fiasco: Ściśle mówiąc, routing odbywa się na poziomie IP. Routing oparty jest na adresach internetowych, żadne informacje z warstwy TCP nie są wykorzystywane w routingu podstawowym.
RedGrittyBrick
1
@skolima: z drugiej strony bezpaństwowość jest przyczyną, dla której HTTP jest najbardziej skalowalnym i niezawodnym protokołem w szerokim użyciu. Protokół HTTP zawsze był specjalnie zaprojektowany ze względu na skalowalność, a nie wydajność (tak, to coś innego), więc jeśli uważasz, że potrzebujesz twardego opóźnienia, to albo używasz niewłaściwego protokołu, albo używasz go nieprawidłowo. Chociaż HTTP2 zamierza poprawić wydajność, robi to w sposób, który pozostaje wierny bezpaństwowości. Gdy jest wykorzystywany do tego, do czego jest przeznaczony, nigdy nie widziałem, że bezpaństwowość stanowi wąskie gardło dobrze zaprojektowanej aplikacji HTTP.
Lie Ryan
10

„HTTP jest bezstanowy” oznacza, że ​​każda transakcja HTTP (para żądanie-odpowiedź) może być przetwarzana niezależnie od dowolnego stanu z poprzedniej pary żądanie-odpowiedź.

Aby przetransportować określoną parę żądanie-odpowiedź, potrzebujesz protokołu, który jest w stanie przenosić dowolnie duży blok i dowolnie duży blok z powrotem, a aby to zrobić na warstwie o ograniczonym rozmiarze pakietu, TCP musi być stanowy.

Ale poza granicami transakcji nie ma stanu. Klient może porzucić połączenie i ustanowić nowe dla następnego żądania. W rzeczywistości była to jedyna opcja we wczesnych wersjach i nadal tak działa, jeśli klient nie zawiera Connection: keep-alivenagłówka.

Kolejne żądanie może być łatwo obsłużone przez inny serwer, a klient nigdy się nie dowie, ponieważ serwer nie musi utrzymywać żadnego stanu (chyba że aplikacja doda własny stan do HTTP, zwykle w formie sesji; wynikające z tego komplikacje w równoważeniu obciążenia jest kara za budowanie stanowego protokołu na HTTP). Wykorzystuje się to w obciążonych serwerach równoważących obciążenie.

Jan Hudec
źródło
can also easily be handled by different server and the client will never knowChociaż technicznie jest to prawdą, jest to mylące, ponieważ wiele aplikacji internetowych używa sesji lepkich, wymagających równoważenia obciążenia w celu kierowania przyszłych żądań z tej samej sesji przeglądania do tego samego serwera. Z punktu widzenia HTTP sesje nie mają znaczenia, ale twoje ostatnie zdanie sugeruje, że wrażenia użytkownika końcowego pozostaną niezmienione, co byłoby fałszywe w przypadku sesji lepkich.
Brandon
1
@Brandon: Takie aplikacje budują stanowy protokół na podstawie HTTP i to za to ich kara!
Jan Hudec
@Brandon: Wiele serwerów z równoważeniem obciążenia, takich jak Gmail, nie wysyła żądań z powrotem do tego samego serwera. Zamiast tego sesja jest przechowywana we wspólnej bazie danych, do której mają dostęp wszystkie serwery w klastrze. Dlatego stan nie jest obsługiwany przez serwer, ale przez bazę danych.
slebetman
@slebetman: Tak, cokolwiek. Sam HTTP nie ma takiego stanu, więc dla HTTP jest to proste. Jeśli aplikacja doda swój własny stan, to walka.
Jan Hudec
Racja, nie powiedziałem wszystkiego. Powiedziałem trochę. Ja osobiście wolę unikać lepkich sesji, a jeśli to możliwe, całkowicie unikam sesji. Niemniej jednak istnieje oprogramowanie, które nie spełnia wszystkich oczekiwań.
Brandon
2

„Bezstanowy” charakter HTTP oznacza, że ​​na tej warstwie nie są tworzone ani wykorzystywane żadne informacje o stanie.

Możesz to zobaczyć w kilku przypadkach, na przykład w uwierzytelnianiu HTTP, poświadczenia są wysyłane przy każdym żądaniu, a trwałe połączenia są tak naprawdę tylko optymalizacją (tj. Jeśli wysyłam poświadczenia, serwer zapomina o nich po żądaniu, nawet jeśli opuszcza połączenie otwarte).

Natomiast mechanizmy logowania oparte na plikach cookie są stanowe, ale nie stanowią części protokołu HTTP.

Simon Richter
źródło
1

Musisz zrozumieć to jako zestaw rosyjskich lalek (lub pudełek, jeśli chcesz), każda z nich niosąca kolejną w środku, tak rażąco to działa: TCP przenosi HTTP „wewnątrz”, ale nie obchodzi go to ani jego funkcje.

Aby uzyskać cały obraz, polecam przeczytać o modelu OSI, ponieważ jest on bardziej przejrzysty.

TCP znajduje się kilka warstw poniżej HTTP w modelu OSI, każda warstwa w rzeczywistości odpowiada innemu protokołowi.

W naszym przypadku HTTP znajduje się w warstwach prezentacji i aplikacji, a TCP w warstwie transportowej. Lub jeśli używasz modelu TCP / IP, protokoły TCP i IP znajdują się w warstwie łącza sieciowego, a HTTP w warstwie aplikacji i prezentacji.

runlevel0
źródło
1
Problem z modelem OSI polega na tym, że jest on teraz teoretyczny (były faktyczne próby jego wdrożenia, ale zawiodły na rynku ze względu na swoją złożoność). W rzeczywistości nie ma warstw między TCP a HTTP. Poza tym warstwą prezentacji byłby HTML, a nie HTTP.
MSalters
W modelu TCP / IP protokół TCP nie działa w warstwie sieciowej. Żyje w warstwie transportowej na szczycie IP, która jest później w sieci. Pierwszy hit Google dla „modelu TCP” pokazuje to: technet.microsoft.com/en-us/library/cc786900(v=ws.10).aspx
Brandon
@MSalters: Czy TLS nie jest warstwą?
grawity
1
@MSalters: Czy zdajesz sobie sprawę, że HTTPS to tylko nazwa nadana przez HTTP tunelowany przez TLS? Jako taki TLS to warstwa pod HTTP, a na górze kombinacji TCP i TLS / SSL + HTTP nazywa się HTTPS.
slebetman
1
Jest też inna, nowa nazwa dla kombinacji TLS / HTTP. Jeśli TLS, który przenosi ruch HTTP, implementuje wirtualne multipleksowanie gniazd / strumieni, nazywa się to SPDY (ale adres URL w przeglądarce to nadal HTTPS).
slebetman