Wie wird HTTP zustandslos?

26

HTTP soll zustandslos sein. Das heißt, es müssen keine Informationen für die Datenübertragung gespeichert werden.

HTTP verwendet jedoch TCP, das zustandsorientiert ist.

Wenn dies der Fall ist, wie wird HTTP zustandslos?

Ameisen
quelle
6
Wie ist dies kein Duplikat 5 Jahre nach dem Start von Super User?
Peter Mortensen
Weil die meisten Dupes auf StackOverflow sind? Ich kann nur raten.
Trysis
8
Nur weil es (unter anderem) durch Kabel läuft, ist es auch kein elektrisches Protokoll
Hagen von Eitzen,

Antworten:

42

HTTP kümmert sich nicht um die Protokolle auf niedrigerer Ebene und ist von diesen Protokollen unabhängig, die verwendet werden, um sich selbst zu transportieren, obwohl es selbst statuslos ist.

Die Transporttechnologie kann TCP oder Novells altes SPX oder SCTP sein, oder was auch immer Sie sich vorstellen können, und HTTP wird immer noch genauso funktionieren. HTTP erfordert ein Streaming- oder verbindungsorientiertes Protokoll und hängt davon ab, dass URLs aufgelöst werden können. Dabei ist es jedoch unerheblich, wie dies erreicht wird.

Dies ist einer der Gründe, warum das Schichtenmodell oder der Netzwerkstapel vorhanden ist: Die Anwendungsschicht muss sich nicht mit niedrigeren Schichten befassen.

Nur weil ein Protokoll auf niedrigerer Ebene statusbehaftet ist, bedeutet dies nicht, dass alles darüber automatisch statusbehaftet wird oder statusbehaftet sein muss.

HTTP selbst ist zustandslos. Das bedeutet, dass Anwendungen eine weitere Schicht über HTTP implementieren müssen, um den Status festzulegen. Dies geschieht normalerweise mit Sitzungscookies.

LawrenceC
quelle
1
Das Routing erfolgt auf TCP / IP-Ebene.
Fiasco Labs
3
Dieses Bild erklärt es schön. vichargrave.com/wp-content/uploads/2013/01/…
JakeGould
2
Zusammengefasst ist die Tatsache, dass HTTP die Zustandsfülle der zugrunde liegenden Verbindung (die fast immer TCP sein wird) ignoriert, einer der größten Leistungsmängel, die verschiedene HTTP2- Ansätze zu beheben versuchen.
Skolima
2
@Fiasco: Genau genommen erfolgt das Routing auf IP-Ebene. Das Routing basiert auf Internetadressen. Für das grundlegende Routing werden keine Informationen aus der TCP-Schicht verwendet.
RedGrittyBrick
1
@skolima: Auf der anderen Seite ist Statuslosigkeit der Grund, warum HTTP das am besten skalierbare und zuverlässigste Protokoll ist, das derzeit verwendet wird. HTTP wurde immer explizit auf Skalierbarkeit und nicht auf Leistung ausgelegt (ja, das ist etwas anderes). Wenn Sie also der Meinung sind, dass Sie eine hohe Latenz benötigen, verwenden Sie entweder das falsche Protokoll oder das falsche Protokoll. Während HTTP2 die Leistung verbessern möchte, geschieht dies auf eine Weise, die der Staatenlosigkeit treu bleibt. Bei der Verwendung für das, wofür es gedacht ist, hatte ich nie gesehen, dass Staatenlosigkeit ein Engpass einer gut gestalteten HTTP-Anwendung ist.
Lie Ryan
10

"HTTP ist zustandslos" bedeutet, dass jede HTTP-Transaktion (Request-Response-Paar) unabhängig von einem Zustand des vorherigen Request-Response-Paares verarbeitet werden kann.

Um das jeweilige Request-Response-Paar zu transportieren, benötigen Sie ein Protokoll, das einen beliebig großen Block dorthin und einen beliebig großen Block zurück transportieren kann, und um dies über eine Schicht mit begrenzter Paketgröße zu tun, muss TCP statusbehaftet sein.

Aber über die Transaktionsgrenze hinweg gibt es keinen Zustand. Der Client kann die Verbindung trennen und eine neue Verbindung für die nächste Anforderung herstellen. Tatsächlich war dies die einzige Option in den frühen Versionen und funktioniert auch dann noch so, wenn der Client den Connection: keep-aliveHeader nicht enthält .

Die nächste Anforderung kann auch problemlos von einem anderen Server verarbeitet werden, und der Client wird es nie erfahren, da der Server keinen Status verwalten muss (es sei denn, die Anwendung fügt einen eigenen Status zusätzlich zu HTTP hinzu, normalerweise in Form einer Sitzung). Dies führt zu Komplikationen im Lastausgleich ist seine Bestrafung für den Aufbau eines stateful Protokolls auf HTTP). Dies wird beim Lastausgleich von ausgelasteten Servern ausgenutzt.

Jan Hudec
quelle
can also easily be handled by different server and the client will never knowTechnisch gesehen ist dies jedoch irreführend, da viele Webanwendungen Sticky-Sessions verwenden und ein Load Balancer erforderlich ist, um zukünftige Anforderungen von derselben Browsersitzung an denselben Server weiterzuleiten. Aus der Sicht von HTTP sind Sitzungen irrelevant, aber Ihr letzter Satz impliziert, dass die Endbenutzererfahrung nicht beeinträchtigt wird, was bei Sitzungen mit Dauerhaftigkeit falsch wäre.
Brandon
1
@Brandon: Solche Anwendungen bauen ein Stateful-Protokoll auf HTTP auf und das ist ihre Strafe dafür!
Jan Hudec
@Brandon: Viele Server mit Lastenausgleich, z. B. Google Mail, senden keine Anforderungen an denselben Server zurück. Stattdessen wird die Sitzung in einer gemeinsam genutzten Datenbank gespeichert, auf die alle Server im Cluster zugreifen können. Der Status wird daher nicht vom Server, sondern von der Datenbank verwaltet.
Slebetman
@slebetman: Ja, was auch immer. HTTP selbst hat keinen solchen Status, daher ist es für HTTP einfach. Wenn die Anwendung einen eigenen Status hinzufügt, ist es ihr Kampf.
Jan Hudec
Richtig, ich habe nicht alles gesagt. Ich sagte einiges. Ich persönlich bevorzuge es, klebrige Sitzungen zu vermeiden, und wenn möglich, Sitzungen insgesamt zu vermeiden. Dennoch gibt es Software, die nicht jedem Ideal entspricht.
Brandon
2

Die "zustandslose" Natur von HTTP bedeutet, dass auf dieser Ebene keine Statusinformationen erstellt oder verwendet werden.

Sie können dies in einigen Fällen feststellen, z. B. bei der HTTP-Authentifizierung. Die Anmeldeinformationen werden bei jeder Anforderung gesendet, und dauerhafte Verbindungen stellen in Wirklichkeit nur eine Optimierung dar (dh, wenn ich Anmeldeinformationen sende, vergisst der Server diese nach der Anforderung, auch wenn sie beendet werden die Verbindung offen).

Im Gegensatz dazu sind Cookie-basierte Anmeldemechanismen statusbehaftet, jedoch nicht Teil von HTTP.

Simon Richter
quelle
1

Man muss es als einen Satz russischer Puppen (oder Kisten, wenn man will) verstehen, von denen jede eine andere in sich trägt. So funktioniert es im Großen und Ganzen: TCP trägt HTTP "in sich", aber es kümmert sich nicht darum oder um seine Eigenschaften.

Um ein vollständiges Bild zu erhalten, empfehle ich, das OSI-Modell zu lesen, um es klarer zu machen.

TCP befindet sich im OSI-Modell einige Schichten unter HTTP. Jede Schicht entspricht tatsächlich einem anderen Protokoll.

In unserem Fall befindet sich HTTP in der Präsentations- und Anwendungsschicht und TCP in der Transportschicht. Wenn Sie das TCP / IP-Modell verwenden, befinden sich sowohl das TCP- als auch das IP-Protokoll in der Netzwerkverbindungsschicht und HTTP in der Anwendungs- und Präsentationsschicht.

runlevel0
quelle
1
Das Problem mit dem OSI-Modell ist, dass es jetzt theoretisch ist (es gab tatsächliche Versuche, es zu implementieren, aber sie scheiterten am Markt aufgrund ihrer Komplexität). In Wirklichkeit gibt es keine Schichten zwischen TCP und HTTP. Außerdem wäre die Präsentationsschicht HTML, nicht HTTP.
MSalters
Im TCP / IP-Modell befindet sich TCP nicht in der Netzwerkschicht. Es befindet sich in der Transportschicht über IP, die sich später im Netzwerk befindet. Der erste Google-Hit für "TCP-Modell" zeigt dies: technet.microsoft.com/en-us/library/cc786900(v=ws.10).aspx
Brandon
@MSalters: Ist TLS keine Schicht?
Grawity
1
@MSalters: Sie wissen, dass HTTPS nur der Name ist, der durch das Tunneln von HTTP durch TLS vergeben wird? Als solches ist TLS eine Schicht unter HTTP und wird zusätzlich zu TCP und TLS / SSL + HTTP als HTTPS bezeichnet.
Slebetman
1
Es gibt auch einen anderen neuen Namen für die TLS / HTTP-Kombination. Wenn der TLS, der den HTTP-Datenverkehr überträgt, virtuelles Socket- / Stream-Multiplexing implementiert, heißt er SPDY (die URL in Ihrem Browser lautet jedoch weiterhin HTTPS).
Slebetman