Warum heißt es, dass "HTTP ein zustandsloses Protokoll ist"?

170

HTTP hat HTTP-Cookies. Cookies ermöglichen es dem Server, den Benutzerstatus, die Anzahl der Verbindungen, die letzte Verbindung usw. zu verfolgen.

HTTP verfügt über dauerhafte Verbindungen (Keep-Alive), über die mehrere Anforderungen von derselben TCP-Verbindung gesendet werden können.

Jose Nobile
quelle
3
Ein weiterer Bereich, in dem ich "Staatenlosigkeit" nicht sehe, ist die Autorisierung - insbesondere die Proxy-Autorisierung. Es scheint, dass es während der Verhandlungen zuständig ist. Für die NTLM-Authentifizierung muss sich der Client den Typ der Proxy-Authentifizierung merken und der Server muss statusbehaftet sein, da die NTLM-Nachrichtentypen eine Sequenz haben. Ich bin mir also nicht sicher, ob ich die Antworten verstehe.
Lindsay Morsillo
1
Soll ich jetzt HTTP / 1.1 hinzufügen? Weil ich denke, dass HTTP / 2 Status hat.
Jose Nobile
4
HTTP / 2 ist statusbehaftet. HTTP 1 ist zustandslos. Spätere Ergänzungen für HTTP 1, wie Cookies, fügten den Status hinzu. Diese Ergänzungen sind nicht Teil der "Kern" -HTTP 1-Spezifikation. Aus diesem Grund wird HTTP 1 als zustandsloses Protokoll bezeichnet, in der Praxis jedoch nicht. HTTP / 2 wurde dagegen mit eingebrannten Stateful-Komponenten entwickelt. Es waren keine Zusätze erforderlich, um die Anforderung zu erfüllen, als "Stateful" gekennzeichnet zu werden.
Zamicol

Antworten:

130

Obwohl mehrere Anforderungen über dieselbe HTTP-Verbindung gesendet werden können, misst der Server ihrer Ankunft über denselben Socket keine besondere Bedeutung bei. Dies ist lediglich eine Leistungssache, um die Zeit / Bandbreite zu minimieren, die sonst für die Wiederherstellung einer Verbindung für jede Anforderung aufgewendet würde.

In Bezug auf HTTP handelt es sich bei allen noch um separate Anforderungen, und sie müssen selbst genügend Informationen enthalten, um die Anforderung zu erfüllen. Das ist das Wesen der "Staatenlosigkeit". Anforderungen werden nicht miteinander verknüpft, es sei denn, der Server kennt einige gemeinsame Informationen. In den meisten Fällen handelt es sich dabei um eine Sitzungs-ID in einem Cookie.

cHao
quelle
1
Was passiert, wenn sich der Server an eine Sitzung erinnert (serverseitig) und die Benutzererfahrung entsprechend anpasst?
NurShomik
3
@NurShomik: Unter stackoverflow.com/a/3521393/319403 finden Sie eine Erläuterung der typischen Funktionsweise von Sitzungen.
CHao
12
@ Andrew: HTTP ist nicht auf TCP "aufgebaut" und der Status von TCP ist nicht HTTP. Die beiden sind völlig getrennte Protokolle auf verschiedenen Ebenen im Stapel. Sie könnten HTTP über Named Pipes bereitstellen, wenn Sie möchten, oder sogar Dateien senden, wenn Sie genügend Masochisten haben, um dem zuzustimmen, und dies würde genau deshalb funktionieren, weil HTTP transportprotokollunabhängig ist. Auf dieser Ebene sind alles nur Anfragen und Antworten. Dies macht HTTP selbst zustandslos, unabhängig davon, welcher Status von Protokollen niedrigerer oder höherer Ebene verwendet / verwaltet / benötigt wird.
CHao
@cHao Okay, ich werde zugeben. Wenn wir Staatenlosigkeit als "nicht unbedingt Status benötigen, um zu funktionieren" definieren (siehe die Antwort von dimo414 unten, in der Optionen für den Status innerhalb von HTTP aufgeführt sind, die aus Wikipedia zitiert werden), und wenn wir jedes Protokoll streng für sich betrachten und nicht auf den darunter liegenden Ebenen basieren , dann ja, ich kann zustimmen, dass HTTP "zustandslos" ist.
Andrew
101

Aus Wikipedia :

HTTP ist ein zustandsloses Protokoll. Ein zustandsloses Protokoll erfordert nicht, dass der Server Informationen oder den Status über jeden Benutzer für die Dauer mehrerer Anforderungen beibehält.

Einige Webanwendungen müssen jedoch möglicherweise den Fortschritt des Benutzers von Seite zu Seite verfolgen, z. B. wenn ein Webserver erforderlich ist, um den Inhalt einer Webseite für einen Benutzer anzupassen. Lösungen für diese Fälle umfassen:

  • die Verwendung von HTTP-Cookies.
  • serverseitige Sitzungen,
  • versteckte Variablen (wenn die aktuelle Seite ein Formular enthält) und
  • URL-Umschreiben mit URI-codierten Parametern, z. B. /index.php?session_id=some_unique_session_code.

Was das Protokoll staatenlos macht , ist , dass der Server nicht erforderlich Zustand über mehrere Anforderungen, zu verfolgen , nicht , dass es nicht so tun können , wenn es will. Dies vereinfacht den Vertrag zwischen Client und Server und minimiert in vielen Fällen (z. B. beim Bereitstellen statischer Daten über ein CDN) die Datenmenge, die übertragen werden muss. Wenn Server wurden erforderlich , den Zustand der Kundenbesuche die Struktur der Ausstellung und die Reaktion auf Anfragen zu halten wäre komplexer. So wie es ist, ist die Einfachheit des Modells eines seiner größten Merkmale.

dimo414
quelle
21

Da für ein zustandsloses Protokoll nicht erforderlich ist, dass der Server Sitzungsinformationen oder den Status jedes Kommunikationspartners für die Dauer mehrerer Anforderungen beibehält.

HTTP ist ein zustandsloses Protokoll. Dies bedeutet, dass die Verbindung zwischen dem Browser und dem Server nach Beendigung der Transaktion unterbrochen wird.

Rahul Tripathi
quelle
2
HTTP kann jedoch mithilfe von Cookies Informationen auf dem Server speichern. HTTP mit Keep-Alive schließt die Verbindung nicht bei jeder Anforderung.
Jose Nobile
3
Lesen
Rahul Tripathi
18
Das Speichern von Informationen auf dem Server bedeutet nicht, dass die Verbindung ständig besteht.
Srijan
1
@ Srijan Nun, nein. So? Niemand behauptete etwas anderes.
Mark Amery
10

HTTP wird als aufgerufen, stateless protocolda jede Anforderung unabhängig ausgeführt wird, ohne dass die zuvor ausgeführten Anforderungen bekannt sind. Sobald die Transaktion beendet ist, geht auch die Verbindung zwischen dem Browser und dem Server verloren.

Was das Protokoll ausmacht, statelessist, dass HTTP in seinem ursprünglichen Design relativ einfach ist file transfer protocol:

  1. eine Anfrage für eine Datei stellen, die durch eine URL benannt ist,
  2. Holen Sie sich die Datei als Antwort,
  3. trennen.

Es gab keine Beziehung zwischen einer Verbindung und einer anderen, auch nicht vom selben Client. Dies vereinfacht den Vertrag zwischen Client und Server und minimiert in vielen Fällen die Datenmenge, die übertragen werden muss.

Mobeen Sarwar
quelle
3

Wenn das Protokoll HTTP als Status-Vollprotokoll angegeben ist, verwendet das Browserfenster eine einzelne Verbindung, um mit dem Webserver für mehrere Anforderungen an die Webanwendung zu kommunizieren. Dies gibt dem Browserfenster die Möglichkeit, die Verbindungen zwischen dem Browserfenster und den Webservern für lange Zeit zu aktivieren und beizubehalten Dies kann dazu führen, dass die maximale Anzahl von Verbindungen des Webservers erreicht wird, obwohl die meisten Verbindungen in Clients inaktiv sind.

Rajasekhar Reddy
quelle
1
HTTP verfügt bereits über Keep-Alive. Dies bedeutet, dass der Server die Verbindung nicht schließt und der Client viele Anforderungen über dieselbe Verbindung stellen kann.
Jose Nobile
3

HTTP ist verbindungslos und dies ist eine direkte Folge davon, dass HTTP ein zustandsloses Protokoll ist. Der Server und der Client kennen sich nur während einer aktuellen Anforderung. Danach vergessen sich beide. Aufgrund dieser Art des Protokolls können weder der Client noch der Browser Informationen zwischen verschiedenen Anforderungen auf den Webseiten speichern.

user3496740
quelle
1

Was ist staatenlos?

Sobald die Anfrage gestellt und die Antwort an den Client zurückgesendet wurde, wird die Verbindung getrennt oder beendet. Der Server vergisst alles über den Anforderer.

Warum staatenlos?

Das Web entscheidet sich für das zustandslose Protokoll. Es war eine geniale Wahl, weil das ursprüngliche Ziel des Webs darin bestand, Dokumente (Webseiten) für extrem große Zahlen bereitzustellen. von Menschen, die sehr einfache Hardware für den Server verwenden.

Die Aufrechterhaltung einer langjährigen Verbindung wäre äußerst ressourcenintensiv gewesen.

Wenn das Web als Stateful-Protokoll ausgewählt worden wäre, wäre die Belastung des Servers erhöht worden, um die Verbindung des Besuchers aufrechtzuerhalten.

Chirag Soni
quelle
1

HTTPist staatenlos. TCPist zustandsbehaftet. Es gibt kein sogenanntes HTTP connection, sondern nur HTTP requestund HTTP response. Wir brauchen nichts zu warten, um ein anderes zu machen HTTP request. Ein Verbindungsheader, der "Keep-Alive" ist, bedeutet "TCP von den nachfolgenden HTTPAnforderungen und Antworten wiederverwendet wird , anstatt die TCPVerbindung ständig zu trennen und wiederherzustellen .

Xing
quelle
0

Ich denke, jemand hat einen sehr unglücklichen Namen für das STATELESS-Konzept gewählt, und deshalb wird das ganze Missverständnis verursacht. Es geht nicht darum, Ressourcen zu speichern, sondern um die Beziehung zwischen Client und Server.

Kunde: Ich halte alle Ressourcen auf meiner Seite und sende Ihnen die "Liste" aller wichtigen Elemente, die verarbeitet werden müssen. Mach deinen Job.

Server: In Ordnung. Lassen Sie mich die Verantwortung für das Filtern übernehmen, was wichtig ist, um Ihnen die richtige Antwort zu geben.

Dies bedeutet, dass der Server der "Slave" des Clients ist und nach jeder Anfrage seinen "Master" vergessen muss. Tatsächlich bezieht sich STATELESS nur auf den Status des Servers.

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

JacobTheKnitter
quelle