Hypertext Transfer Protocol: Unterschied zwischen den Versionen

Aus Foxwiki
Keine Bearbeitungszusammenfassung
Zeile 8: Zeile 8:
* Über ein Rechnernetz
* Über ein Rechnernetz


Es wird hauptsächlich eingesetzt, um Webseiten (Hypertext-Dokumente) aus dem World Wide Web (WWW) in einen Webbrowser zu laden.
Es wird hauptsächlich eingesetzt, um Webseiten (Hypertext-Dokumente) aus dem World Wide Web (WWW) in einen Webbrowser zu laden
* Es ist jedoch nicht prinzipiell darauf beschränkt und auch als allgemeines Dateiübertragungsprotokoll sehr verbreitet.
* Es ist jedoch nicht prinzipiell darauf beschränkt und auch als allgemeines Dateiübertragungsprotokoll sehr verbreitet


Das '''Hypertext Transfer Protocol''' ('''HTTP''') ist ein
Das '''Hypertext Transfer Protocol''' ('''HTTP''') ist ein
Zeile 16: Zeile 16:
* 1991 eingeführt
* 1991 eingeführt
; Webseiten
; Webseiten
* Es wird hauptsächlich eingesetzt, um [[Webseite]]n (Hypertext-Dokumente) aus dem [[World Wide Web]] (WWW) in einen [[Webbrowser]] zu laden.
* Es wird hauptsächlich eingesetzt, um [[Webseite]]n (Hypertext-Dokumente) aus dem [[World Wide Web]] (WWW) in einen [[Webbrowser]] zu laden
* Es ist jedoch nicht prinzipiell darauf beschränkt und auch als allgemeines Dateiübertragungsprotokoll sehr verbreitet.
* Es ist jedoch nicht prinzipiell darauf beschränkt und auch als allgemeines Dateiübertragungsprotokoll sehr verbreitet


; HTTP wurde von der [[Internet Engineering Task Force]] (IETF) und dem [[World Wide Web Consortium]] (W3C) standardisiert
; HTTP wurde von der [[Internet Engineering Task Force]] (IETF) und dem [[World Wide Web Consortium]] (W3C) standardisiert
* Aktuelle Version ist HTTP/3, welche als [[Request for Comments|RFC]] 9114 im Juni 2022 veröffentlicht wurde.
* Aktuelle Version ist HTTP/3, welche als [[Request for Comments|RFC]] 9114 im Juni 2022 veröffentlicht wurde
* Die Weiterentwicklung wird von der HTTP-Arbeitsgruppe der IETF (HTTPbis) organisiert.
* Die Weiterentwicklung wird von der HTTP-Arbeitsgruppe der IETF (HTTPbis) organisiert


; Ergänzende und aufbauende Standards
; Ergänzende und aufbauende Standards
Zeile 28: Zeile 28:


=== Eigenschaften ===
=== Eigenschaften ===
Nach etablierten [[Schichtenmodell]]en zur Einordnung von Netzwerkprotokollen nach ihren grundlegenderen oder abstrakteren Aufgaben wird HTTP der sogenannten Anwendungsschicht zugeordnet.
Nach etablierten [[Schichtenmodell]]en zur Einordnung von Netzwerkprotokollen nach ihren grundlegenderen oder abstrakteren Aufgaben wird HTTP der sogenannten Anwendungsschicht zugeordnet
* Diese wird von den [[Anwendungsprogramm]]en angesprochen, im Fall von HTTP ist das meist ein Webbrowser.
* Diese wird von den [[Anwendungsprogramm]]en angesprochen, im Fall von HTTP ist das meist ein Webbrowser
* Im [[OSI-Modell|ISO/OSI-Schichtenmodell]] entspricht die Anwendungsschicht der 7. Schicht.
* Im [[OSI-Modell|ISO/OSI-Schichtenmodell]] entspricht die Anwendungsschicht der 7. Schicht


HTTP ist ein [[Zustandslosigkeit|zustandsloses]] Protokoll.
HTTP ist ein [[Zustandslosigkeit|zustandsloses]] Protokoll
* Informationen aus früheren Anforderungen gehen verloren.
* Informationen aus früheren Anforderungen gehen verloren
* Ein zuverlässiges Mitführen von Sitzungsdaten kann erst auf der Anwendungsschicht durch eine [[Sitzung (Informatik)|Sitzung]] über einen [[Sitzungsbezeichner]] implementiert werden.
* Ein zuverlässiges Mitführen von Sitzungsdaten kann erst auf der Anwendungsschicht durch eine [[Sitzung (Informatik)|Sitzung]] über einen [[Sitzungsbezeichner]] implementiert werden
Über [[HTTP-Cookie|Cookies]] in den Header-Informationen können aber Anwendungen realisiert werden, die Statusinformationen (Benutzereinträge, Warenkörbe) zuordnen können.
Über [[HTTP-Cookie|Cookies]] in den Header-Informationen können aber Anwendungen realisiert werden, die Statusinformationen (Benutzereinträge, Warenkörbe) zuordnen können
* Dadurch werden [[Webanwendung|Anwendungen]] möglich, die Status- beziehungsweise [[Sitzung (Informatik)|Sitzungseigenschaften]] erfordern.
* Dadurch werden [[Webanwendung|Anwendungen]] möglich, die Status- beziehungsweise [[Sitzung (Informatik)|Sitzungseigenschaften]] erfordern
* Auch eine Benutzer[[authentifizierung]] ist möglich.
* Auch eine Benutzer[[authentifizierung]] ist möglich
* Bis HTTP/2 kann die Information, die über HTTP übertragen wird, normalerweise auf allen Rechnern und [[Router]]n gelesen werden, die im [[Rechnernetz|Netzwerk]] durchlaufen werden. Über [[Hypertext Transfer Protocol Secure|HTTPS]] jedoch kann die Übertragung [[Kryptografie|verschlüsselt]] erfolgen.
* Bis HTTP/2 kann die Information, die über HTTP übertragen wird, normalerweise auf allen Rechnern und [[Router]]n gelesen werden, die im [[Rechnernetz|Netzwerk]] durchlaufen werden. Über [[Hypertext Transfer Protocol Secure|HTTPS]] jedoch kann die Übertragung [[Kryptografie|verschlüsselt]] erfolgen
* HTTP/3 baut auf [[QUIC]] auf, das eine [[Transport Layer Security|TLS]] Kodierung erzwingt.
* HTTP/3 baut auf [[QUIC]] auf, das eine [[Transport Layer Security|TLS]] Kodierung erzwingt


Durch Erweiterung seiner Anfragemethoden, [[Header]]-Informationen und Statuscodes ist HTTP nicht auf [[Hypertext]] beschränkt, sondern wird zunehmend zum Austausch beliebiger Daten verwendet, außerdem ist es Grundlage des auf Dateiübertragung spezialisierten Protokolls [[WebDAV]].
Durch Erweiterung seiner Anfragemethoden, [[Header]]-Informationen und Statuscodes ist HTTP nicht auf [[Hypertext]] beschränkt, sondern wird zunehmend zum Austausch beliebiger Daten verwendet, außerdem ist es Grundlage des auf Dateiübertragung spezialisierten Protokolls [[WebDAV]]
* Zur [[Kommunikation]] ist HTTP auf ein [[Zuverlässigkeit (Telekommunikation)|zuverlässiges]] [[Transportprotokoll]] angewiesen, wofür bis zu HTTP/2 in nahezu allen Fällen [[Transmission Control Protocol|TCP]] verwendet wird.
* Zur [[Kommunikation]] ist HTTP auf ein [[Zuverlässigkeit (Telekommunikation)|zuverlässiges]] [[Transportprotokoll]] angewiesen, wofür bis zu HTTP/2 in nahezu allen Fällen [[Transmission Control Protocol|TCP]] verwendet wird
* HTTP/3 setzt auf QUIC auf, welches seinerseits auf UDP basiert.
* HTTP/3 setzt auf QUIC auf, welches seinerseits auf UDP basiert


Derzeit werden hauptsächlich zwei Protokollversionen, HTTP/1.0 und HTTP/1.1, verwendet.
Derzeit werden hauptsächlich zwei Protokollversionen, HTTP/1.0 und HTTP/1.1, verwendet
* Neuere Versionen alltäglicher Webbrowser wie [[Chromium (Browser)|Chromium]], [[Google Chrome|Chrome]], [[Opera (Browser)|Opera]], [[Mozilla Firefox|Firefox]], [[Microsoft Edge|Edge]] und [[Internet Explorer]] sind darüber hinaus bereits kompatibel zu der neu eingeführten Version 2 des HTTP (HTTP/2)
* Neuere Versionen alltäglicher Webbrowser wie [[Chromium (Browser)|Chromium]], [[Google Chrome|Chrome]], [[Opera (Browser)|Opera]], [[Mozilla Firefox|Firefox]], [[Microsoft Edge|Edge]] und [[Internet Explorer]] sind darüber hinaus bereits kompatibel zu der neu eingeführten Version 2 des HTTP (HTTP/2)


=== Aufbau ===
=== Aufbau ===
Die Kommunikationseinheiten in HTTP zwischen [[Client]] und [[Server]] werden als ''Nachrichten'' bezeichnet, von denen es zwei unterschiedliche Arten gibt: die ''Anfrage'' (englisch ''Request'') vom Client an den Server und die ''Antwort'' (englisch ''Response'') als Reaktion darauf vom Server zum Client.
Die Kommunikationseinheiten in HTTP zwischen [[Client]] und [[Server]] werden als ''Nachrichten'' bezeichnet, von denen es zwei unterschiedliche Arten gibt: die ''Anfrage'' (englisch ''Request'') vom Client an den Server und die ''Antwort'' (englisch ''Response'') als Reaktion darauf vom Server zum Client


Jede Nachricht besteht dabei aus zwei Teilen, dem Nachrichtenkopf (englisch ''Message Header'', kurz: ''Header'' oder auch HTTP-Header genannt) und dem Nachrichtenrumpf (englisch ''Message Body'', kurz: ''Body'').
Jede Nachricht besteht dabei aus zwei Teilen, dem Nachrichtenkopf (englisch ''Message Header'', kurz: ''Header'' oder auch HTTP-Header genannt) und dem Nachrichtenrumpf (englisch ''Message Body'', kurz: ''Body'')
* Der Nachrichtenkopf enthält Informationen über den Nachrichtenrumpf wie etwa verwendete Kodierungen oder den Inhaltstyp, damit dieser vom Empfänger korrekt interpretiert werden kann (''siehe Hauptartikel: [[Liste der HTTP-Headerfelder]]'').
* Der Nachrichtenkopf enthält Informationen über den Nachrichtenrumpf wie etwa verwendete Kodierungen oder den Inhaltstyp, damit dieser vom Empfänger korrekt interpretiert werden kann (''siehe Hauptartikel: [[Liste der HTTP-Headerfelder]]'')
* Der Nachrichtenrumpf enthält schließlich die Nutzdaten.
* Der Nachrichtenrumpf enthält schließlich die Nutzdaten


== Funktion ==
== Funktion ==
[[Datei:HTTP-Anfrage.svg|mini|hochkant=1.8|Beispiel einer Transaktion, ausgeführt mit [[Telnet]] ]]
[[Datei:HTTP-Anfrage.svg|mini|hochkant=1.8|Beispiel einer Transaktion, ausgeführt mit [[Telnet]] ]]
Wenn in einem Web Browser der [[Hyperlink|Link]] zur URL ''<nowiki>http://www.example.net/infotext.html</nowiki>'' aktiviert wird, so wird an den Rechner mit dem Hostnamen ''www.example.net'' die Anfrage gerichtet, die Ressource ''/infotext.html'' zurückzusenden.
Wenn in einem Web Browser der [[Hyperlink|Link]] zur URL ''<nowiki>http://www.example.net/infotext.html</nowiki>'' aktiviert wird, so wird an den Rechner mit dem Hostnamen ''www.example.net'' die Anfrage gerichtet, die Ressource ''/infotext.html'' zurückzusenden


Der Name ''www.example.net'' wird dabei zuerst über das [[Domain Name System|DNS]]-Protokoll in eine [[IP-Adresse]] umgesetzt.
Der Name ''www.example.net'' wird dabei zuerst über das [[Domain Name System|DNS]]-Protokoll in eine [[IP-Adresse]] umgesetzt
* Zur Übertragung wird über TCP auf den Standard-[[Port (Protokoll)|Port]] 80 des HTTP-Servers eine HTTP-GET-Anforderung gesendet.
* Zur Übertragung wird über TCP auf den Standard-[[Port (Protokoll)|Port]] 80 des HTTP-Servers eine HTTP-GET-Anforderung gesendet
 
Anfrage:


Anfrage
  GET /infotext.html HTTP/1.1
  GET /infotext.html HTTP/1.1
  Host: www.example.net
  Host: www.example.net


Enthält der Link Zeichen, die in der Anfrage nicht erlaubt sind, werden diese [[URL Encoding|%-kodiert]].
Enthält der Link Zeichen, die in der Anfrage nicht erlaubt sind, werden diese [[URL Encoding|%-kodiert]]
* Zusätzliche Informationen wie Angaben über den Browser, zur gewünschten Sprache etc.
* Zusätzliche Informationen wie Angaben über den Browser, zur gewünschten Sprache etc
* können über den [[Liste der HTTP-Headerfelder|Header]] (Kopfzeilen) in jeder HTTP-Kommunikation übertragen werden.
* können über den [[Liste der HTTP-Headerfelder|Header]] (Kopfzeilen) in jeder HTTP-Kommunikation übertragen werden
* Mit dem „Host“-Feld lassen sich verschiedene DNS-Namen unter der gleichen IP-Adresse unterscheiden.
* Mit dem „Host“-Feld lassen sich verschiedene DNS-Namen unter der gleichen IP-Adresse unterscheiden
* Unter HTTP/1.0 ist es optional, unter HTTP/1.1 jedoch erforderlich.
* Unter HTTP/1.0 ist es optional, unter HTTP/1.1 jedoch erforderlich
* Sobald der Header mit einer Leerzeile (beziehungsweise zwei aufeinanderfolgenden Zeilenenden) abgeschlossen wird, sendet der Rechner, der einen Web-Server (an Port 80) betreibt, seinerseits eine HTTP-Antwort zurück.
* Sobald der Header mit einer Leerzeile (beziehungsweise zwei aufeinanderfolgenden Zeilenenden) abgeschlossen wird, sendet der Rechner, der einen Web-Server (an Port 80) betreibt, seinerseits eine HTTP-Antwort zurück
* Diese besteht aus den Header-Informationen des Servers, einer Leerzeile und dem tatsächlichen Inhalt der Nachricht, also dem Dateiinhalt der ''infotext.html''-Datei. Übertragen werden Dateien normalerweise in Seitenbeschreibungssprachen wie ([[Extensible Hypertext Markup Language|X]])[[Hypertext Markup Language|HTML]] und alle ihre Ergänzungen, zum Beispiel Bilder, Stylesheets ([[Cascading Style Sheets|CSS]]), Skripte ([[JavaScript]]) usw., die meistens von einem Browser in einer lesbaren Darstellung miteinander verbunden werden.
* Diese besteht aus den Header-Informationen des Servers, einer Leerzeile und dem tatsächlichen Inhalt der Nachricht, also dem Dateiinhalt der ''infotext.html''-Datei. Übertragen werden Dateien normalerweise in Seitenbeschreibungssprachen wie ([[Extensible Hypertext Markup Language|X]])[[Hypertext Markup Language|HTML]] und alle ihre Ergänzungen, zum Beispiel Bilder, Stylesheets ([[Cascading Style Sheets|CSS]]), Skripte ([[JavaScript]]) usw., die meistens von einem Browser in einer lesbaren Darstellung miteinander verbunden werden
* Prinzipiell kann jede Datei in jedem beliebigen Format übertragen werden, wobei die „Datei“ auch dynamisch generiert werden kann und nicht auf dem Server als physische Datei vorhanden zu sein braucht (zum Beispiel bei Anwendung von [[Common Gateway Interface|CGI]], [[Server Side Includes|SSI]], [[JavaServer Pages|JSP]], [[PHP]] oder [[ASP.NET]]).
* Prinzipiell kann jede Datei in jedem beliebigen Format übertragen werden, wobei die „Datei“ auch dynamisch generiert werden kann und nicht auf dem Server als physische Datei vorhanden zu sein braucht (zum Beispiel bei Anwendung von [[Common Gateway Interface|CGI]], [[Server Side Includes|SSI]], [[JavaServer Pages|JSP]], [[PHP]] oder [[ASP.NET]])
Jede Zeile im Header wird durch den [[Zeilenumbruch]] <[[Wagenrücklauf|CR]]><[[Zeilenvorschub|LF]]> abgeschlossen.
Jede Zeile im Header wird durch den [[Zeilenumbruch]] <[[Wagenrücklauf|CR]]><[[Zeilenvorschub|LF]]> abgeschlossen
* Die Leerzeile nach dem Header darf nur aus <nowiki><CR><LF></nowiki>, ohne eingeschlossenes [[Leerzeichen]], bestehen.
* Die Leerzeile nach dem Header darf nur aus <nowiki><CR><LF></nowiki>, ohne eingeschlossenes [[Leerzeichen]], bestehen


Antwort:
Antwort:
Zeile 87: Zeile 86:
''(Inhalt von infotext.html)''
''(Inhalt von infotext.html)''


Der Server sendet eine [[Fehlerseite|Fehlermeldung]] sowie einen [[HTTP-Statuscode|Fehlercode]] zurück, wenn die Information aus irgendeinem Grund nicht gesendet werden kann, allerdings werden auch dann Statuscodes verwendet, wenn die Anfrage erfolgreich war, in dem Falle (meistens) 200 OK.
Der Server sendet eine [[Fehlerseite|Fehlermeldung]] sowie einen [[HTTP-Statuscode|Fehlercode]] zurück, wenn die Information aus irgendeinem Grund nicht gesendet werden kann, allerdings werden auch dann Statuscodes verwendet, wenn die Anfrage erfolgreich war, in dem Falle (meistens) 200 OK
* Der genaue Ablauf dieses Vorgangs (Anfrage und Antwort) ist in der HTTP-Spezifikation festgelegt.
* Der genaue Ablauf dieses Vorgangs (Anfrage und Antwort) ist in der HTTP-Spezifikation festgelegt


=== HTTP-Methoden ===
=== HTTP-Methoden ===
Zeile 96: Zeile 95:
! Methode !! Beschreibung
! Methode !! Beschreibung
|-
|-
| GET || Gebräuchlichste Methode.
| GET || Gebräuchlichste Methode
* Mit ihr wird eine Ressource (zum Beispiel eine Datei) unter Angabe eines [[Uniform Resource Identifier|URI]] vom Server angefordert.
* Mit ihr wird eine Ressource (zum Beispiel eine Datei) unter Angabe eines [[Uniform Resource Identifier|URI]] vom Server angefordert
* Als Argumente in dem URI können auch Inhalte zum Server übertragen werden, allerdings soll laut Standard eine GET-Anfrage nur Daten abrufen und sonst keine Auswirkungen haben (wie Datenänderungen auf dem Server oder ausloggen). ''(siehe [[#HTTP GET|unten]])''
* Als Argumente in dem URI können auch Inhalte zum Server übertragen werden, allerdings soll laut Standard eine GET-Anfrage nur Daten abrufen und sonst keine Auswirkungen haben (wie Datenänderungen auf dem Server oder ausloggen). ''(siehe [[#HTTP GET|unten]])''
|-
|-
| POST || schickt Daten (z.&nbsp;B.&nbsp;den Inhalt einer Datei) zur weiteren Verarbeitung zum Server, diese werden als Inhalt der Nachricht übertragen und können beispielsweise aus Name-Wert-Paaren bestehen, die aus einem HTML-Formular stammen.
| POST || schickt Daten (z.&nbsp;B.&nbsp;den Inhalt einer Datei) zur weiteren Verarbeitung zum Server, diese werden als Inhalt der Nachricht übertragen und können beispielsweise aus Name-Wert-Paaren bestehen, die aus einem HTML-Formular stammen
* Es können so neue Ressourcen auf dem Server entstehen oder bestehende modifiziert werden.
* Es können so neue Ressourcen auf dem Server entstehen oder bestehende modifiziert werden
* POST-Daten werden im Allgemeinen nicht von [[Cache]]s zwischengespeichert.
* POST-Daten werden im Allgemeinen nicht von [[Cache]]s zwischengespeichert
* Zusätzlich können bei dieser Art der Übermittlung auch Daten wie in der GET-Methode an den URI gehängt werden. ''(siehe [[#HTTP POST|unten]])''
* Zusätzlich können bei dieser Art der Übermittlung auch Daten wie in der GET-Methode an den URI gehängt werden. ''(siehe [[#HTTP POST|unten]])''
|-
|-
| HEAD || weist den Server an, die gleichen HTTP-Header wie bei GET, nicht jedoch den Nachrichtenrumpf mit dem eigentlichen Dokumentinhalt zu senden.
| HEAD || weist den Server an, die gleichen HTTP-Header wie bei GET, nicht jedoch den Nachrichtenrumpf mit dem eigentlichen Dokumentinhalt zu senden
* So kann zum Beispiel schnell die Gültigkeit einer Datei im [[Browser-Cache]] geprüft werden, und Dateigrößen können im Voraus abgerufen und durch die Content-Length-Zeile erlesen werden.
* So kann zum Beispiel schnell die Gültigkeit einer Datei im [[Browser-Cache]] geprüft werden, und Dateigrößen können im Voraus abgerufen und durch die Content-Length-Zeile erlesen werden
|-
|-
| PUT || dient dazu, eine Ressource (zum Beispiel eine Datei) unter Angabe des Ziel-URIs auf einen Webserver hochzuladen.
| PUT || dient dazu, eine Ressource (zum Beispiel eine Datei) unter Angabe des Ziel-URIs auf einen Webserver hochzuladen
* Besteht unter der angegebenen Ziel-URI bereits eine Ressource, wird diese ersetzt, ansonsten neu erstellt.
* Besteht unter der angegebenen Ziel-URI bereits eine Ressource, wird diese ersetzt, ansonsten neu erstellt
|-
|-
| PATCH || Ändert ein bestehendes Dokument ohne dieses wie bei PUT vollständig zu ersetzen.
| PATCH || Ändert ein bestehendes Dokument ohne dieses wie bei PUT vollständig zu ersetzen
* Wurde durch RFC 5789 spezifiziert.
* Wurde durch RFC 5789 spezifiziert
|-
|-
| DELETE || löscht die angegebene Ressource auf dem Server.
| DELETE || löscht die angegebene Ressource auf dem Server
|-
|-
| TRACE || liefert die Anfrage so zurück, wie der Server sie empfangen hat.
| TRACE || liefert die Anfrage so zurück, wie der Server sie empfangen hat
* So kann überprüft werden, ob und wie die Anfrage auf dem Weg zum Server verändert worden ist – sinnvoll für das [[Debugger|Debugging]] von Verbindungen.
* So kann überprüft werden, ob und wie die Anfrage auf dem Weg zum Server verändert worden ist – sinnvoll für das [[Debugger|Debugging]] von Verbindungen
|-
|-
| OPTIONS || liefert eine Liste der vom Server unterstützten Methoden und Merkmale.
| OPTIONS || liefert eine Liste der vom Server unterstützten Methoden und Merkmale
|-
|-
| CONNECT || wird von Proxyservern implementiert, die in der Lage sind, [[Secure Sockets Layer|SSL]]-Tunnel zur Verfügung zu stellen.
| CONNECT || wird von Proxyservern implementiert, die in der Lage sind, [[Secure Sockets Layer|SSL]]-Tunnel zur Verfügung zu stellen
|-
|-
| [[Representational State Transfer|RESTful]] || Web Services verwenden die unterschiedlichen Anfragemethoden zur Realisierung von [[Webservice]]s.
| [[Representational State Transfer|RESTful]] || Web Services verwenden die unterschiedlichen Anfragemethoden zur Realisierung von [[Webservice]]s
* Insbesondere werden dafür die HTTP-Anfragemethoden GET, POST, PUT/PATCH und DELETE verwendet.
* Insbesondere werden dafür die HTTP-Anfragemethoden GET, POST, PUT/PATCH und DELETE verwendet
|}
|}


Zeile 150: Zeile 149:


==== Argumentübertragung ====
==== Argumentübertragung ====
Häufig will ein Nutzer Informationen an eine Website senden.
Häufig will ein Nutzer Informationen an eine Website senden
* Dazu stellt HTTP prinzipiell zwei Möglichkeiten zur Verfügung:
* Dazu stellt HTTP prinzipiell zwei Möglichkeiten zur Verfügung:


; HTTP-GET
; HTTP-GET
Die Daten sind Teil der URL und bleiben deshalb beim Speichern oder der Weitergabe des Links erhalten.
Die Daten sind Teil der URL und bleiben deshalb beim Speichern oder der Weitergabe des Links erhalten
* Sie müssen [[URL Encoding|URL-kodiert]] werden, das heißt reservierte Zeichen müssen mit „%&lt;[[Hexadezimalsystem|Hex-Wert]]&gt;“ und Leerzeichen mit „+“ dargestellt werden.
* Sie müssen [[URL Encoding|URL-kodiert]] werden, das heißt reservierte Zeichen müssen mit „%&lt;[[Hexadezimalsystem|Hex-Wert]]&gt;“ und Leerzeichen mit „+“ dargestellt werden
; HTTP-POST
; HTTP-POST
: Übertragung der Daten mit einer speziell dazu vorgesehenen Anfrageart im HTTP-Nachrichtenrumpf, so dass sie in der URL nicht sichtbar sind.
: Übertragung der Daten mit einer speziell dazu vorgesehenen Anfrageart im HTTP-Nachrichtenrumpf, so dass sie in der URL nicht sichtbar sind


===== HTTP GET =====
===== HTTP GET =====
Hier werden die Parameter-Wertepaare durch das Zeichen ? in der [[Uniform Resource Locator|URL]] eingeleitet.
Hier werden die Parameter-Wertepaare durch das Zeichen ? in der [[Uniform Resource Locator|URL]] eingeleitet
Oft wird diese Vorgehensweise gewählt, um eine Liste von Parametern zu übertragen, die die Gegenstelle bei der Bearbeitung einer Anfrage berücksichtigen soll.
Oft wird diese Vorgehensweise gewählt, um eine Liste von Parametern zu übertragen, die die Gegenstelle bei der Bearbeitung einer Anfrage berücksichtigen soll
* Häufig besteht diese Liste aus Wertepaaren, welche durch das &-Zeichen voneinander getrennt sind.
* Häufig besteht diese Liste aus Wertepaaren, welche durch das &-Zeichen voneinander getrennt sind
* Die jeweiligen Wertepaare sind in der Form ''Parametername=Parameterwert'' aufgebaut.
* Die jeweiligen Wertepaare sind in der Form ''Parametername=Parameterwert'' aufgebaut
* Seltener wird das Zeichen ; zur Trennung von Einträgen der Liste benutzt.
* Seltener wird das Zeichen ; zur Trennung von Einträgen der Liste benutzt


; Beispiel
; Beispiel
* Auf der Startseite von Wikipedia wird in das Eingabefeld der Suche „Katzen“ eingegeben und auf die Schaltfläche „Artikel“ geklickt.
* Auf der Startseite von Wikipedia wird in das Eingabefeld der Suche „Katzen“ eingegeben und auf die Schaltfläche „Artikel“ geklickt
* Der Browser sendet die folgende oder eine ähnliche Anfrage an den Server:
* Der Browser sendet die folgende oder eine ähnliche Anfrage an den Server:


Zeile 192: Zeile 191:
  Parameter1=Wert1&Parameter2=Wert2
  Parameter1=Wert1&Parameter2=Wert2


mit vorangestelltem ? an die geforderte Seite angehängt.
mit vorangestelltem ? an die geforderte Seite angehängt


Dadurch erfährt der Server, dass der Nutzer den Artikel ''[[Katzen]]'' betrachten will.
Dadurch erfährt der Server, dass der Nutzer den Artikel ''[[Katzen]]'' betrachten will
* Der Server verarbeitet die Anfrage, sendet aber keine Datei, sondern leitet den Browser mit einem Location-[[Header]] zur richtigen Seite weiter, etwa mit:
* Der Server verarbeitet die Anfrage, sendet aber keine Datei, sondern leitet den Browser mit einem Location-[[Header]] zur richtigen Seite weiter, etwa mit:
<syntaxhighlight lang="http">
<syntaxhighlight lang="http">
Zeile 220: Zeile 219:


Die Katzen (Felidae) sind eine Familie aus der Ordnung der Raubtiere (Carnivora)
Die Katzen (Felidae) sind eine Familie aus der Ordnung der Raubtiere (Carnivora)
innerhalb der Überfamilie der Katzenartigen (Feloidea).
innerhalb der Überfamilie der Katzenartigen (Feloidea)
</syntaxhighlight>
</syntaxhighlight>


Der Datenteil ist meist länger, hier soll nur das Protokoll betrachtet werden.
Der Datenteil ist meist länger, hier soll nur das Protokoll betrachtet werden


Nachteil dieser Methode ist, dass die angegebenen Parameter mit der URL meist in der Historie des Browsers gespeichert werden und so persönliche Daten unbeabsichtigt im Browser gespeichert werden können.
Nachteil dieser Methode ist, dass die angegebenen Parameter mit der URL meist in der Historie des Browsers gespeichert werden und so persönliche Daten unbeabsichtigt im Browser gespeichert werden können
* Stattdessen sollte man in diesem Fall die Methode POST benutzen.
* Stattdessen sollte man in diesem Fall die Methode POST benutzen


===== HTTP POST =====
===== HTTP POST =====
Da sich die Daten nicht in der URL befinden, können per POST große Datenmengen, zum Beispiel Bilder, übertragen werden.
Da sich die Daten nicht in der URL befinden, können per POST große Datenmengen, zum Beispiel Bilder, übertragen werden


Im folgenden Beispiel wird wieder der Artikel ''Katzen'' angefordert, doch diesmal verwendet der Browser aufgrund eines modifizierten HTML-Codes (method="POST") eine POST-Anfrage.
Im folgenden Beispiel wird wieder der Artikel ''Katzen'' angefordert, doch diesmal verwendet der Browser aufgrund eines modifizierten HTML-Codes (method="POST") eine POST-Anfrage
* Die Variablen stehen dabei nicht in der URL, sondern gesondert im Rumpfteil, etwa:
* Die Variablen stehen dabei nicht in der URL, sondern gesondert im Rumpfteil, etwa:


Zeile 256: Zeile 255:
Jede HTTP-Anfrage wird vom Server mit einem HTTP-Statuscode beantwortet
Jede HTTP-Anfrage wird vom Server mit einem HTTP-Statuscode beantwortet
* ob die Anfrage erfolgreich bearbeitet wurde
* ob die Anfrage erfolgreich bearbeitet wurde
* teilt dem Client/Browser im Fehlerfall mit, wo (zum Beispiel Umleitung) beziehungsweise wie (zum Beispiel mit Authentifizierung) er die gewünschten Informationen (wenn möglich) erhalten kann.
* teilt dem Client/Browser im Fehlerfall mit, wo (zum Beispiel Umleitung) beziehungsweise wie (zum Beispiel mit Authentifizierung) er die gewünschten Informationen (wenn möglich) erhalten kann
<br clear=all>
<br clear=all>
{| class="wikitable options"
{| class="wikitable options"
Zeile 262: Zeile 261:
! Option !! Beschreibung
! Option !! Beschreibung
|-
|-
| 1xx – Informationen || Die Bearbeitung der Anfrage dauert trotz der Rückmeldung noch an.
| 1xx – Informationen || Die Bearbeitung der Anfrage dauert trotz der Rückmeldung noch an
* Eine solche Zwischenantwort ist manchmal notwendig, da viele Clients nach einer bestimmten Zeitspanne ([[Zeitüberschreitung]]) automatisch annehmen, dass ein Fehler bei der Übertragung oder Verarbeitung der Anfrage aufgetreten ist, und mit einer Fehlermeldung abbrechen.
* Eine solche Zwischenantwort ist manchmal notwendig, da viele Clients nach einer bestimmten Zeitspanne ([[Zeitüberschreitung]]) automatisch annehmen, dass ein Fehler bei der Übertragung oder Verarbeitung der Anfrage aufgetreten ist, und mit einer Fehlermeldung abbrechen
|-
|-
| 2xx – Erfolgreiche Operation ||Die Anfrage wurde bearbeitet und die Antwort wird an den Anfragesteller zurückgesendet.
| 2xx – Erfolgreiche Operation ||Die Anfrage wurde bearbeitet und die Antwort wird an den Anfragesteller zurückgesendet
|-
|-
| 3xx – Umleitung || Um eine erfolgreiche Bearbeitung der Anfrage sicherzustellen, sind weitere Schritte seitens des Clients erforderlich.
| 3xx – Umleitung || Um eine erfolgreiche Bearbeitung der Anfrage sicherzustellen, sind weitere Schritte seitens des Clients erforderlich
* Das ist etwa der Fall, wenn eine Webseite vom Betreiber umgestaltet wurde, sodass sich eine gewünschte Datei nun an einem anderen Platz befindet.
* Das ist etwa der Fall, wenn eine Webseite vom Betreiber umgestaltet wurde, sodass sich eine gewünschte Datei nun an einem anderen Platz befindet
* Mit der Antwort des Servers erfährt der Client im ''Location''-Header, wo sich die Datei jetzt befindet.
* Mit der Antwort des Servers erfährt der Client im ''Location''-Header, wo sich die Datei jetzt befindet
|-
|-
| 4xx – [[Client]]-Fehler || Bei der Bearbeitung der Anfrage ist ein Fehler aufgetreten, der im Verantwortungsbereich des Clients liegt.
| 4xx – [[Client]]-Fehler || Bei der Bearbeitung der Anfrage ist ein Fehler aufgetreten, der im Verantwortungsbereich des Clients liegt
* Ein 404 tritt etwa ein, wenn ein Dokument angefragt wurde, das auf dem Server nicht existiert.
* Ein 404 tritt etwa ein, wenn ein Dokument angefragt wurde, das auf dem Server nicht existiert
* Ein 403 weist den Client darauf hin, dass es ihm nicht erlaubt ist, das jeweilige Dokument abzurufen.
* Ein 403 weist den Client darauf hin, dass es ihm nicht erlaubt ist, das jeweilige Dokument abzurufen
* Es kann sich zum Beispiel um ein vertrauliches oder nur per [[Hypertext Transfer Protocol Secure|HTTPS]] zugängliches Dokument handeln.
* Es kann sich zum Beispiel um ein vertrauliches oder nur per [[Hypertext Transfer Protocol Secure|HTTPS]] zugängliches Dokument handeln
|-
|-
| 5xx – [[Server]]-Fehler || Es ist ein Fehler aufgetreten, dessen Ursache beim Server liegt.
| 5xx – [[Server]]-Fehler || Es ist ein Fehler aufgetreten, dessen Ursache beim Server liegt
* Zum Beispiel bedeutet 501, dass der Server nicht über die erforderlichen Funktionen (das heißt etwa Programme oder andere Dateien) verfügt, um die Anfrage zu bearbeiten.
* Zum Beispiel bedeutet 501, dass der Server nicht über die erforderlichen Funktionen (das heißt etwa Programme oder andere Dateien) verfügt, um die Anfrage zu bearbeiten
|}
|}


Zusätzlich zum Statuscode enthält der Header der Server-Antwort eine Beschreibung des Fehlers in [[Englische Sprache|englischsprachigem]] Klartext.
Zusätzlich zum Statuscode enthält der Header der Server-Antwort eine Beschreibung des Fehlers in [[Englische Sprache|englischsprachigem]] Klartext
[[Datei:404 not found.png|mini|Mit Fehler 404 kommen Web-Nutzer am häufigsten in Berührung]]
[[Datei:404 not found.png|mini|Mit Fehler 404 kommen Web-Nutzer am häufigsten in Berührung]]


Zeile 297: Zeile 296:
=== HTTP-Kompression ===
=== HTTP-Kompression ===
; Datenmenge verringern
; Datenmenge verringern
Um die übertragene Datenmenge zu verringern, kann ein HTTP-Server seine Antworten [[Datenkompression|komprimieren]].
Um die übertragene Datenmenge zu verringern, kann ein HTTP-Server seine Antworten [[Datenkompression|komprimieren]]
* Ein Client muss bei einer Anfrage mitteilen, welche Kompressionsverfahren er verarbeiten kann.
* Ein Client muss bei einer Anfrage mitteilen, welche Kompressionsverfahren er verarbeiten kann
* Dazu dient der Header ''Accept-Encoding'' (etwa ''Accept-Encoding: [[gzip]], [[deflate]]'').
* Dazu dient der Header ''Accept-Encoding'' (etwa ''Accept-Encoding: [[gzip]], [[deflate]]'')
* Der Server kann dann die Antwort mit einem vom Client unterstützten Verfahren komprimieren und gibt im Header ''Content-Encoding'' das verwendete Kompressionsverfahren an.
* Der Server kann dann die Antwort mit einem vom Client unterstützten Verfahren komprimieren und gibt im Header ''Content-Encoding'' das verwendete Kompressionsverfahren an
* HTTP-Kompression spart vor allem bei textuellen Daten (HTML, XHTML, CSS, Javascript-Code, XML, JSON) erhebliche Datenmengen, da sich diese gut komprimieren lassen.
* HTTP-Kompression spart vor allem bei textuellen Daten (HTML, XHTML, CSS, Javascript-Code, XML, JSON) erhebliche Datenmengen, da sich diese gut komprimieren lassen
* Bei bereits komprimierten Daten (etwa gängige Formate für Bilder, Audio und Video) ist die (erneute) Kompression nutzlos und wird daher üblicherweise nicht benutzt.
* Bei bereits komprimierten Daten (etwa gängige Formate für Bilder, Audio und Video) ist die (erneute) Kompression nutzlos und wird daher üblicherweise nicht benutzt


; Kompressionsangriffe
; Kompressionsangriffe
In Verbindung mit einer mit [[Transport Layer Security|TLS]] verschlüsselten Kommunikation führt die Komprimierung allerdings zum [[Transport_Layer_Security#Kompressionsangriffe|BREACH]]-[[Exploit]], wodurch die Kryptografie gebrochen werden kann.
In Verbindung mit einer mit [[Transport Layer Security|TLS]] verschlüsselten Kommunikation führt die Komprimierung allerdings zum [[Transport_Layer_Security#Kompressionsangriffe|BREACH]]-[[Exploit]], wodurch die Kryptografie gebrochen werden kann


== Versionen ==
== Versionen ==
Zeile 325: Zeile 324:
=== HTTP/0.9 ===
=== HTTP/0.9 ===
[[Datei:Tim Berners-Lee closeup.jpg|mini|200px|Sir Tim Berners-Lee gilt als Begründer des Webs und entwickelte auch HTTP mit.]]
[[Datei:Tim Berners-Lee closeup.jpg|mini|200px|Sir Tim Berners-Lee gilt als Begründer des Webs und entwickelte auch HTTP mit.]]
Ab 1989 entwickelten [[Tim Berners-Lee]] und sein Team am [[CERN]], dem [[Europäische Union|europäischen]] Kernforschungszentrum in der Schweiz, das Hypertext Transfer Protocol, zusammen mit den Konzepten [[Uniform Resource Locator|URL]] und [[Hypertext Markup Language|HTML]], womit die Grundlagen des World Wide Web geschaffen wurden. Erste Ergebnisse dieser Bemühungen war 1991 die Version HTTP 0.9.
Ab 1989 entwickelten [[Tim Berners-Lee]] und sein Team am [[CERN]], dem [[Europäische Union|europäischen]] Kernforschungszentrum in der Schweiz, das Hypertext Transfer Protocol, zusammen mit den Konzepten [[Uniform Resource Locator|URL]] und [[Hypertext Markup Language|HTML]], womit die Grundlagen des World Wide Web geschaffen wurden. Erste Ergebnisse dieser Bemühungen war 1991 die Version HTTP 0.9


=== HTTP/1.0 ===
=== HTTP/1.0 ===
Die im Mai 1996 als RFC 1945 ([[Request for Comments]] Nr. 1945) publizierte Anforderung ist als HTTP/1.0 bekannt geworden.
Die im Mai 1996 als RFC 1945 ([[Request for Comments]] Nr. 1945) publizierte Anforderung ist als HTTP/1.0 bekannt geworden
Bei HTTP/1.0 wird vor jeder Anfrage eine neue [[Transmission Control Protocol|TCP]]-Verbindung aufgebaut und nach Übertragung der Antwort standardmäßig vom Server wieder geschlossen.
Bei HTTP/1.0 wird vor jeder Anfrage eine neue [[Transmission Control Protocol|TCP]]-Verbindung aufgebaut und nach Übertragung der Antwort standardmäßig vom Server wieder geschlossen
* Sind in ein HTML-Dokument beispielsweise zehn Bilder eingebettet, so werden insgesamt elf TCP-Verbindungen benötigt, um die Seite auf einem grafikfähigen Browser aufzubauen.
* Sind in ein HTML-Dokument beispielsweise zehn Bilder eingebettet, so werden insgesamt elf TCP-Verbindungen benötigt, um die Seite auf einem grafikfähigen Browser aufzubauen


=== HTTP/1.1 ===
=== HTTP/1.1 ===
1999 wurde eine zweite Anforderung als RFC 2616 publiziert, die den HTTP/1.1-Standard wiedergibt.
1999 wurde eine zweite Anforderung als RFC 2616 publiziert, die den HTTP/1.1-Standard wiedergibt
Bei HTTP/1.1 kann ein Client durch einen zusätzlichen Headereintrag ''([[Keepalive]])'' den Wunsch äußern, keinen Verbindungsabbau durchzuführen, um die Verbindung erneut nutzen zu können (persistent connection).
Bei HTTP/1.1 kann ein Client durch einen zusätzlichen Headereintrag ''([[Keepalive]])'' den Wunsch äußern, keinen Verbindungsabbau durchzuführen, um die Verbindung erneut nutzen zu können (persistent connection)
* Die Unterstützung auf Serverseite ist jedoch optional und kann in Verbindung mit Proxys Probleme bereiten.
* Die Unterstützung auf Serverseite ist jedoch optional und kann in Verbindung mit Proxys Probleme bereiten
* Mittels [[HTTP-Pipelining]] können in der Version 1.1 mehrere Anfragen und Antworten pro TCP-Verbindung gesendet werden.
* Mittels [[HTTP-Pipelining]] können in der Version 1.1 mehrere Anfragen und Antworten pro TCP-Verbindung gesendet werden
* Für das HTML-Dokument mit zehn Bildern wird so nur eine TCP-Verbindung benötigt.
* Für das HTML-Dokument mit zehn Bildern wird so nur eine TCP-Verbindung benötigt
* Da die Geschwindigkeit von TCP-Verbindungen zu Beginn durch Verwendung des ''[[Slow Start|Slow-Start]]''-Algorithmus recht gering ist, wird so die Ladezeit für die gesamte Seite signifikant verkürzt.
* Da die Geschwindigkeit von TCP-Verbindungen zu Beginn durch Verwendung des ''[[Slow Start|Slow-Start]]''-Algorithmus recht gering ist, wird so die Ladezeit für die gesamte Seite signifikant verkürzt
* Zusätzlich können bei HTTP/1.1 abgebrochene Übertragungen fortgesetzt werden.
* Zusätzlich können bei HTTP/1.1 abgebrochene Übertragungen fortgesetzt werden


Eine Möglichkeit zum Einsatz von HTTP/1.1 in Chats ist die Verwendung des [[Internet Media Type|MIME-Typs]] ''multipart/replace'', bei dem der Browser nach Senden eines ''Boundary''-Codes und eines neuerlichen ''Content-Length''-Headerfeldes sowie eines neuen ''Content-Type''-Headerfeldes den Inhalt des Browserfensters neu aufbaut.
Eine Möglichkeit zum Einsatz von HTTP/1.1 in Chats ist die Verwendung des [[Internet Media Type|MIME-Typs]] ''multipart/replace'', bei dem der Browser nach Senden eines ''Boundary''-Codes und eines neuerlichen ''Content-Length''-Headerfeldes sowie eines neuen ''Content-Type''-Headerfeldes den Inhalt des Browserfensters neu aufbaut


Mit HTTP/1.1 ist es neben dem Abholen von Daten auch möglich, Daten zum Server zu übertragen.
Mit HTTP/1.1 ist es neben dem Abholen von Daten auch möglich, Daten zum Server zu übertragen
* Mit Hilfe der [[#PUT|PUT]]-Methode können so [[Webdesigner]] ihre Seiten direkt über den [[Webserver]] per [[WebDAV]] publizieren und mit der DELETE-Methode ist es ihnen möglich, Daten vom Server zu löschen.
* Mit Hilfe der [[#PUT|PUT]]-Methode können so [[Webdesigner]] ihre Seiten direkt über den [[Webserver]] per [[WebDAV]] publizieren und mit der DELETE-Methode ist es ihnen möglich, Daten vom Server zu löschen
* Außerdem bietet HTTP/1.1 eine TRACE-Methode, mit der der Weg zum Webserver verfolgt und überprüft werden kann, ob die Daten korrekt dorthin übertragen werden.
* Außerdem bietet HTTP/1.1 eine TRACE-Methode, mit der der Weg zum Webserver verfolgt und überprüft werden kann, ob die Daten korrekt dorthin übertragen werden
* Damit ergibt sich die Möglichkeit, den Weg zum Webserver über die verschiedenen [[Proxy-Server|Proxys]] hinweg zu ermitteln, ein [[traceroute]] auf Anwendungsebene.
* Damit ergibt sich die Möglichkeit, den Weg zum Webserver über die verschiedenen [[Proxy-Server|Proxys]] hinweg zu ermitteln, ein [[traceroute]] auf Anwendungsebene


Aufgrund von Unstimmigkeiten und Unklarheiten wurde 2007 eine Arbeitsgruppe gestartet, die die Spezifikation verbessern sollte.
Aufgrund von Unstimmigkeiten und Unklarheiten wurde 2007 eine Arbeitsgruppe gestartet, die die Spezifikation verbessern sollte
* Ziel war hier lediglich eine klarere Formulierung, neue Funktionen wurden nicht eingebaut.
* Ziel war hier lediglich eine klarere Formulierung, neue Funktionen wurden nicht eingebaut
* Dieser Prozess wurde 2014 beendet und führte zu sechs neuen RFCs:
* Dieser Prozess wurde 2014 beendet und führte zu sechs neuen RFCs:
* RFC 7230 – HTTP/1.1: Message Syntax and Routing
* RFC 7230 – HTTP/1.1: Message Syntax and Routing
Zeile 359: Zeile 358:


=== HTTP/2 ===
=== HTTP/2 ===
Im Mai 2015 wurde von der IETF HTTP/2 als Nachfolger von HTTP/1.1 verabschiedet.
Im Mai 2015 wurde von der IETF HTTP/2 als Nachfolger von HTTP/1.1 verabschiedet
* Der Standard ist durch RFC 7540 und RFC 7541 spezifiziert. Die Entwicklung war maßgeblich von [[Google Inc.|Google]] ''([[SPDY]])'' und [[Microsoft]] ''(HTTP Speed+Mobility)'' mit jeweils eigenen Vorschlägen vorangetrieben worden.
* Der Standard ist durch RFC 7540 und RFC 7541 spezifiziert. Die Entwicklung war maßgeblich von [[Google Inc.|Google]] ''([[SPDY]])'' und [[Microsoft]] ''(HTTP Speed+Mobility)'' mit jeweils eigenen Vorschlägen vorangetrieben worden
* Ein erster Entwurf, der sich weitgehend an SPDY anlehnte, war im November 2012 publiziert und seither in mehreren Schritten angepasst worden.
* Ein erster Entwurf, der sich weitgehend an SPDY anlehnte, war im November 2012 publiziert und seither in mehreren Schritten angepasst worden


Mit HTTP/2 soll die Übertragung beschleunigt und optimiert werden. Dabei soll der neue Standard jedoch vollständig abwärtskompatibel zu HTTP/1.1 sein.
Mit HTTP/2 soll die Übertragung beschleunigt und optimiert werden. Dabei soll der neue Standard jedoch vollständig abwärtskompatibel zu HTTP/1.1 sein


Wichtige neue Möglichkeiten sind
Wichtige neue Möglichkeiten sind
* die Möglichkeit des Zusammenfassens mehrerer Anfragen,
* die Möglichkeit des Zusammenfassens mehrerer Anfragen
* weitergehende [[Datenkompression]]smöglichkeiten,
* weitergehende [[Datenkompression]]smöglichkeiten
* die binär kodierte Übertragung von Inhalten und
* die binär kodierte Übertragung von Inhalten und
* Server-initiierte Datenübertragungen (push-Verfahren),
* Server-initiierte Datenübertragungen (push-Verfahren)
* einzelne Streams lassen sich priorisieren.
* einzelne Streams lassen sich priorisieren


Eine Beschleunigung ergibt sich hauptsächlich aus der neuen Möglichkeit des Zusammenfassens ([[Multiplexverfahren|Multiplex]]) mehrerer Anfragen, um sie über eine Verbindung abwickeln zu können.
Eine Beschleunigung ergibt sich hauptsächlich aus der neuen Möglichkeit des Zusammenfassens ([[Multiplexverfahren|Multiplex]]) mehrerer Anfragen, um sie über eine Verbindung abwickeln zu können
Die [[Datenkompression]] kann nun (mittels neuem Spezialalgorithmus namens HPACK) auch Kopfdaten mit einschließen.
Die [[Datenkompression]] kann nun (mittels neuem Spezialalgorithmus namens HPACK) auch Kopfdaten mit einschließen
Inhalte können binär kodiert übertragen werden.
Inhalte können binär kodiert übertragen werden
Um nicht auf serverseitig vorhersehbare Folgeanforderungen vom Client warten zu müssen, können Datenübertragungen teilweise vom Server initiiert werden (push-Verfahren).
Um nicht auf serverseitig vorhersehbare Folgeanforderungen vom Client warten zu müssen, können Datenübertragungen teilweise vom Server initiiert werden (push-Verfahren)
Durch die Verwendung von HTTP/2 können Webseitenbetreiber die Latenz zwischen Client und Server verringern und die Netzwerkhardware entlasten.
Durch die Verwendung von HTTP/2 können Webseitenbetreiber die Latenz zwischen Client und Server verringern und die Netzwerkhardware entlasten


Die ursprünglich geplante Option, dass HTTP/2 standardmäßig [[Transport Layer Security|TLS]] nutzt, wurde nicht umgesetzt.
Die ursprünglich geplante Option, dass HTTP/2 standardmäßig [[Transport Layer Security|TLS]] nutzt, wurde nicht umgesetzt
* Allerdings kündigten die Browser-Hersteller Google und Mozilla an, dass ihre Webbrowser nur verschlüsselte HTTP/2-Verbindungen unterstützen werden.
* Allerdings kündigten die Browser-Hersteller Google und Mozilla an, dass ihre Webbrowser nur verschlüsselte HTTP/2-Verbindungen unterstützen werden
* Dafür ist [[ALPN]] eine Kryptografies-Erweiterung, die TLSv1.2 oder neuer braucht.
* Dafür ist [[ALPN]] eine Kryptografies-Erweiterung, die TLSv1.2 oder neuer braucht


HTTP/2 wird von den meisten Browsern unterstützt, darunter Google Chrome (inkl. Chrome unter iOS und Android) ab Version 41, Mozilla Firefox ab Version 36, Internet Explorer 11 unter Windows 10, Opera ab Version 28 (sowie Opera Mobile ab Version 24) und Safari ab Version 8.
HTTP/2 wird von den meisten Browsern unterstützt, darunter Google Chrome (inkl. Chrome unter iOS und Android) ab Version 41, Mozilla Firefox ab Version 36, Internet Explorer 11 unter Windows 10, Opera ab Version 28 (sowie Opera Mobile ab Version 24) und Safari ab Version 8


=== HTTP/3 ===
=== HTTP/3 ===
[[Datei:HTTP-2 vs. HTTP-3 Protocol Stack.svg|mini|200px]]
[[Datei:HTTP-2 vs. HTTP-3 Protocol Stack.svg|mini|200px]]


Im Juni 2022 wurde HTTP/3 als RFC 9114 standardisiert.
Im Juni 2022 wurde HTTP/3 als RFC 9114 standardisiert
* Im November 2018 wurde von der [[Internet Engineering Task Force|IETF]] beschlossen, dass HTTP/3 [[QUIC]] verwenden solle
* Im November 2018 wurde von der [[Internet Engineering Task Force|IETF]] beschlossen, dass HTTP/3 [[QUIC]] verwenden solle
* Google arbeitet schon seit 2012 an einer Alternative unter dem Namen [[QUIC]]
* Google arbeitet schon seit 2012 an einer Alternative unter dem Namen [[QUIC]]


QUIC setzt nicht mehr auf das verbindungsorientierte [[TCP/IP-Netzwerk|TCP]], sondern auf das verbindungslose [[User Datagram Protocol]] (UDP).
QUIC setzt nicht mehr auf das verbindungsorientierte [[TCP/IP-Netzwerk|TCP]], sondern auf das verbindungslose [[User Datagram Protocol]] (UDP)
* Auch bei dem darauf aufbauenden HTTP/3 werden Datenströme getrennt verarbeitet.
* Auch bei dem darauf aufbauenden HTTP/3 werden Datenströme getrennt verarbeitet
* Geht ein Paket unterwegs verloren, betrifft es nicht mehr alle Datenströme, wie es bei TCP der Fall ist.
* Geht ein Paket unterwegs verloren, betrifft es nicht mehr alle Datenströme, wie es bei TCP der Fall ist
* Bei HTTP/3 wird der betroffene Strom warten, bis das fehlende Paket eintrifft.
* Bei HTTP/3 wird der betroffene Strom warten, bis das fehlende Paket eintrifft
* HTTP/3 ist generell verschlüsselt und verspricht deutliche Geschwindigkeitsvorteile.
* HTTP/3 ist generell verschlüsselt und verspricht deutliche Geschwindigkeitsvorteile


Google Chrome Canary war ab Mitte 2019 der erste verfügbare Browser, der eine experimentelle #QUIC- und HTTP/3-Unterstützung integriert hatte. [[cURL]] zog bald nach.
Google Chrome Canary war ab Mitte 2019 der erste verfügbare Browser, der eine experimentelle #QUIC- und HTTP/3-Unterstützung integriert hatte. [[cURL]] zog bald nach
* Die Vorab-Versionen von [[Firefox]] (nightly und beta) versuchen seit April 2021 automatisch, '''HTTP/3''' zu verwenden, wenn es vom Webserver (derzeit z.B [[Google]] oder [[Facebook]]) angeboten wird.
* Die Vorab-Versionen von [[Firefox]] (nightly und beta) versuchen seit April 2021 automatisch, '''HTTP/3''' zu verwenden, wenn es vom Webserver (derzeit z.B [[Google]] oder [[Facebook]]) angeboten wird
* Webserver können die Unterstützung anzeigen, indem sie den [[Liste der HTTP-Headerfelder|Alt-Svc-Antwortheader]] verwenden oder die HTTP/3-Unterstützung mit einem [[Domain Name System|HTTPS-DNS-Eintrag]] ankündigen.
* Webserver können die Unterstützung anzeigen, indem sie den [[Liste der HTTP-Headerfelder|Alt-Svc-Antwortheader]] verwenden oder die HTTP/3-Unterstützung mit einem [[Domain Name System|HTTPS-DNS-Eintrag]] ankündigen
* Sowohl der Client als auch der Server müssen dieselbe [[QUIC]]- und HTTP/3-Entwurfsversion unterstützen, um sich verbinden zu können.
* Sowohl der Client als auch der Server müssen dieselbe [[QUIC]]- und HTTP/3-Entwurfsversion unterstützen, um sich verbinden zu können
* Firefox unterstützt beispielsweise derzeit die Entwürfe 27 bis 32 der Spezifikation, sodass der Server die Unterstützung einer dieser Versionen (z.&nbsp;B.&nbsp;„h3-32“) im Alt-Svc- oder HTTPS-Eintrag melden muss, damit Firefox versucht, QUIC und HTTP/3 mit diesem Server zu verwenden.
* Firefox unterstützt beispielsweise derzeit die Entwürfe 27 bis 32 der Spezifikation, sodass der Server die Unterstützung einer dieser Versionen (z.&nbsp;B.&nbsp;„h3-32“) im Alt-Svc- oder HTTPS-Eintrag melden muss, damit Firefox versucht, QUIC und HTTP/3 mit diesem Server zu verwenden
* Beim Besuch einer solchen Website sollte in den Netzwerkanforderungsinformationen darauf hingewiesen werden, dass HTTP/3 verwendet wird.
* Beim Besuch einer solchen Website sollte in den Netzwerkanforderungsinformationen darauf hingewiesen werden, dass HTTP/3 verwendet wird


== Applikationen über HTTP ==
== Applikationen über HTTP ==
HTTP als textbasiertes Protokoll wird nicht nur zur Übertragung von Webseiten verwendet, es kann auch in eigenständigen Applikationen, den [[Webservice]]s, verwendet werden.
HTTP als textbasiertes Protokoll wird nicht nur zur Übertragung von Webseiten verwendet, es kann auch in eigenständigen Applikationen, den [[Webservice]]s, verwendet werden
* Dabei werden die HTTP-eigenen Befehle wie GET und POST für [[CRUD]]-Operationen weiterverwendet.
* Dabei werden die HTTP-eigenen Befehle wie GET und POST für [[CRUD]]-Operationen weiterverwendet
* Dies hat den Vorteil, dass kein eigenes Protokoll für die [[Datenübertragung]] entwickelt werden muss.
* Dies hat den Vorteil, dass kein eigenes Protokoll für die [[Datenübertragung]] entwickelt werden muss
* Beispielhaft wird dies bei [[Representational State Transfer|REST]] eingesetzt.
* Beispielhaft wird dies bei [[Representational State Transfer|REST]] eingesetzt


== Anhang ==
== Anhang ==

Version vom 1. März 2024, 11:03 Uhr

Hypertext Transfer Protocol (HTTP) - Protokoll zur Übertragung von Daten auf der Anwendungsschicht

Beschreibung

Hypertext-Übertragungsprotokoll
  • 1991
  • zustandslos
  • Protokoll zur Übertragung von Daten auf der Anwendungsschicht
  • Über ein Rechnernetz

Es wird hauptsächlich eingesetzt, um Webseiten (Hypertext-Dokumente) aus dem World Wide Web (WWW) in einen Webbrowser zu laden

  • Es ist jedoch nicht prinzipiell darauf beschränkt und auch als allgemeines Dateiübertragungsprotokoll sehr verbreitet

Das Hypertext Transfer Protocol (HTTP) ist ein

Webseiten
  • Es wird hauptsächlich eingesetzt, um Webseiten (Hypertext-Dokumente) aus dem World Wide Web (WWW) in einen Webbrowser zu laden
  • Es ist jedoch nicht prinzipiell darauf beschränkt und auch als allgemeines Dateiübertragungsprotokoll sehr verbreitet
HTTP wurde von der Internet Engineering Task Force (IETF) und dem World Wide Web Consortium (W3C) standardisiert
  • Aktuelle Version ist HTTP/3, welche als RFC 9114 im Juni 2022 veröffentlicht wurde
  • Die Weiterentwicklung wird von der HTTP-Arbeitsgruppe der IETF (HTTPbis) organisiert
Ergänzende und aufbauende Standards
  • HTTPS für die Kryptografie übertragener Inhalte
  • WebDAV Übertragungsprotokoll

Eigenschaften

Nach etablierten Schichtenmodellen zur Einordnung von Netzwerkprotokollen nach ihren grundlegenderen oder abstrakteren Aufgaben wird HTTP der sogenannten Anwendungsschicht zugeordnet

HTTP ist ein zustandsloses Protokoll

  • Informationen aus früheren Anforderungen gehen verloren
  • Ein zuverlässiges Mitführen von Sitzungsdaten kann erst auf der Anwendungsschicht durch eine Sitzung über einen Sitzungsbezeichner implementiert werden

Über Cookies in den Header-Informationen können aber Anwendungen realisiert werden, die Statusinformationen (Benutzereinträge, Warenkörbe) zuordnen können

Durch Erweiterung seiner Anfragemethoden, Header-Informationen und Statuscodes ist HTTP nicht auf Hypertext beschränkt, sondern wird zunehmend zum Austausch beliebiger Daten verwendet, außerdem ist es Grundlage des auf Dateiübertragung spezialisierten Protokolls WebDAV

Derzeit werden hauptsächlich zwei Protokollversionen, HTTP/1.0 und HTTP/1.1, verwendet

Aufbau

Die Kommunikationseinheiten in HTTP zwischen Client und Server werden als Nachrichten bezeichnet, von denen es zwei unterschiedliche Arten gibt: die Anfrage (englisch Request) vom Client an den Server und die Antwort (englisch Response) als Reaktion darauf vom Server zum Client

Jede Nachricht besteht dabei aus zwei Teilen, dem Nachrichtenkopf (englisch Message Header, kurz: Header oder auch HTTP-Header genannt) und dem Nachrichtenrumpf (englisch Message Body, kurz: Body)

  • Der Nachrichtenkopf enthält Informationen über den Nachrichtenrumpf wie etwa verwendete Kodierungen oder den Inhaltstyp, damit dieser vom Empfänger korrekt interpretiert werden kann (siehe Hauptartikel: Liste der HTTP-Headerfelder)
  • Der Nachrichtenrumpf enthält schließlich die Nutzdaten

Funktion

Beispiel einer Transaktion, ausgeführt mit Telnet

Wenn in einem Web Browser der Link zur URL http://www.example.net/infotext.html aktiviert wird, so wird an den Rechner mit dem Hostnamen www.example.net die Anfrage gerichtet, die Ressource /infotext.html zurückzusenden

Der Name www.example.net wird dabei zuerst über das DNS-Protokoll in eine IP-Adresse umgesetzt

  • Zur Übertragung wird über TCP auf den Standard-Port 80 des HTTP-Servers eine HTTP-GET-Anforderung gesendet

Anfrage

GET /infotext.html HTTP/1.1
Host: www.example.net

Enthält der Link Zeichen, die in der Anfrage nicht erlaubt sind, werden diese %-kodiert

  • Zusätzliche Informationen wie Angaben über den Browser, zur gewünschten Sprache etc
  • können über den Header (Kopfzeilen) in jeder HTTP-Kommunikation übertragen werden
  • Mit dem „Host“-Feld lassen sich verschiedene DNS-Namen unter der gleichen IP-Adresse unterscheiden
  • Unter HTTP/1.0 ist es optional, unter HTTP/1.1 jedoch erforderlich
  • Sobald der Header mit einer Leerzeile (beziehungsweise zwei aufeinanderfolgenden Zeilenenden) abgeschlossen wird, sendet der Rechner, der einen Web-Server (an Port 80) betreibt, seinerseits eine HTTP-Antwort zurück
  • Diese besteht aus den Header-Informationen des Servers, einer Leerzeile und dem tatsächlichen Inhalt der Nachricht, also dem Dateiinhalt der infotext.html-Datei. Übertragen werden Dateien normalerweise in Seitenbeschreibungssprachen wie (X)HTML und alle ihre Ergänzungen, zum Beispiel Bilder, Stylesheets (CSS), Skripte (JavaScript) usw., die meistens von einem Browser in einer lesbaren Darstellung miteinander verbunden werden
  • Prinzipiell kann jede Datei in jedem beliebigen Format übertragen werden, wobei die „Datei“ auch dynamisch generiert werden kann und nicht auf dem Server als physische Datei vorhanden zu sein braucht (zum Beispiel bei Anwendung von CGI, SSI, JSP, PHP oder ASP.NET)

Jede Zeile im Header wird durch den Zeilenumbruch <CR><LF> abgeschlossen

  • Die Leerzeile nach dem Header darf nur aus <CR><LF>, ohne eingeschlossenes Leerzeichen, bestehen

Antwort:

HTTP/1.1 200 OK
Server: Apache/1.3.29 (Unix) PHP/4.3.4
Content-Length: 123456 (Größe von infotext.html in Byte)
Content-Language: de (nach RFC 3282 sowie RFC 1766)
Connection: close
Content-Type: text/html

(Inhalt von infotext.html)

Der Server sendet eine Fehlermeldung sowie einen Fehlercode zurück, wenn die Information aus irgendeinem Grund nicht gesendet werden kann, allerdings werden auch dann Statuscodes verwendet, wenn die Anfrage erfolgreich war, in dem Falle (meistens) 200 OK

  • Der genaue Ablauf dieses Vorgangs (Anfrage und Antwort) ist in der HTTP-Spezifikation festgelegt

HTTP-Methoden

Anfrage

Methode  Beschreibung
GET Gebräuchlichste Methode
  • Mit ihr wird eine Ressource (zum Beispiel eine Datei) unter Angabe eines URI vom Server angefordert
  • Als Argumente in dem URI können auch Inhalte zum Server übertragen werden, allerdings soll laut Standard eine GET-Anfrage nur Daten abrufen und sonst keine Auswirkungen haben (wie Datenänderungen auf dem Server oder ausloggen). (siehe unten)
POST schickt Daten (z. B. den Inhalt einer Datei) zur weiteren Verarbeitung zum Server, diese werden als Inhalt der Nachricht übertragen und können beispielsweise aus Name-Wert-Paaren bestehen, die aus einem HTML-Formular stammen
  • Es können so neue Ressourcen auf dem Server entstehen oder bestehende modifiziert werden
  • POST-Daten werden im Allgemeinen nicht von Caches zwischengespeichert
  • Zusätzlich können bei dieser Art der Übermittlung auch Daten wie in der GET-Methode an den URI gehängt werden. (siehe unten)
HEAD weist den Server an, die gleichen HTTP-Header wie bei GET, nicht jedoch den Nachrichtenrumpf mit dem eigentlichen Dokumentinhalt zu senden
  • So kann zum Beispiel schnell die Gültigkeit einer Datei im Browser-Cache geprüft werden, und Dateigrößen können im Voraus abgerufen und durch die Content-Length-Zeile erlesen werden
PUT dient dazu, eine Ressource (zum Beispiel eine Datei) unter Angabe des Ziel-URIs auf einen Webserver hochzuladen
  • Besteht unter der angegebenen Ziel-URI bereits eine Ressource, wird diese ersetzt, ansonsten neu erstellt
PATCH Ändert ein bestehendes Dokument ohne dieses wie bei PUT vollständig zu ersetzen
  • Wurde durch RFC 5789 spezifiziert
DELETE löscht die angegebene Ressource auf dem Server
TRACE liefert die Anfrage so zurück, wie der Server sie empfangen hat
  • So kann überprüft werden, ob und wie die Anfrage auf dem Weg zum Server verändert worden ist – sinnvoll für das Debugging von Verbindungen
OPTIONS liefert eine Liste der vom Server unterstützten Methoden und Merkmale
CONNECT wird von Proxyservern implementiert, die in der Lage sind, SSL-Tunnel zur Verfügung zu stellen
RESTful Web Services verwenden die unterschiedlichen Anfragemethoden zur Realisierung von Webservices
  • Insbesondere werden dafür die HTTP-Anfragemethoden GET, POST, PUT/PATCH und DELETE verwendet
WebDAV

WebDAV fügt folgende Methoden hinzu

Methode  Beschreibung
PROPFIND
PROPPATCH
MKCOL
COPY
MOVE
LOCK
UNLOCK

Argumentübertragung

Häufig will ein Nutzer Informationen an eine Website senden

  • Dazu stellt HTTP prinzipiell zwei Möglichkeiten zur Verfügung:
HTTP-GET

Die Daten sind Teil der URL und bleiben deshalb beim Speichern oder der Weitergabe des Links erhalten

  • Sie müssen URL-kodiert werden, das heißt reservierte Zeichen müssen mit „%<Hex-Wert>“ und Leerzeichen mit „+“ dargestellt werden
HTTP-POST
Übertragung der Daten mit einer speziell dazu vorgesehenen Anfrageart im HTTP-Nachrichtenrumpf, so dass sie in der URL nicht sichtbar sind
HTTP GET

Hier werden die Parameter-Wertepaare durch das Zeichen ? in der URL eingeleitet Oft wird diese Vorgehensweise gewählt, um eine Liste von Parametern zu übertragen, die die Gegenstelle bei der Bearbeitung einer Anfrage berücksichtigen soll

  • Häufig besteht diese Liste aus Wertepaaren, welche durch das &-Zeichen voneinander getrennt sind
  • Die jeweiligen Wertepaare sind in der Form Parametername=Parameterwert aufgebaut
  • Seltener wird das Zeichen ; zur Trennung von Einträgen der Liste benutzt
Beispiel
  • Auf der Startseite von Wikipedia wird in das Eingabefeld der Suche „Katzen“ eingegeben und auf die Schaltfläche „Artikel“ geklickt
  • Der Browser sendet die folgende oder eine ähnliche Anfrage an den Server:
GET /wiki/Spezial:Search?search=Katzen&go=Artikel HTTP/1.1
Host: de.wikipedia.org
…

Dem Wikipedia-Server werden zwei Wertepaare übergeben:

Argument Wert
search Katzen
go Artikel

Diese Wertepaare werden in der Form

Parameter1=Wert1&Parameter2=Wert2

mit vorangestelltem ? an die geforderte Seite angehängt

Dadurch erfährt der Server, dass der Nutzer den Artikel Katzen betrachten will

  • Der Server verarbeitet die Anfrage, sendet aber keine Datei, sondern leitet den Browser mit einem Location-Header zur richtigen Seite weiter, etwa mit:
HTTP/1.0 302 Found
Date: Fri, 13 Jan 2006 15:12:44 GMT
Location: http://de.wikipedia.org/wiki/Katzen

Der Browser befolgt diese Anweisung und sendet aufgrund der neuen Informationen eine neue Anfrage, etwa:

GET /wiki/Katzen HTTP/1.1
Host: de.wikipedia.org

Und der Server antwortet und gibt den Artikel Katzen aus, etwa:

HTTP/1.1 200 OK
Date: Fri, 13 Jan 2006 15:12:48 GMT
Last-Modified: Tue, 10 Jan 2006 11:18:20 GMT
Content-Language: de
Content-Type: text/html; charset=utf-8

Die Katzen (Felidae) sind eine Familie aus der Ordnung der Raubtiere (Carnivora)
innerhalb der Überfamilie der Katzenartigen (Feloidea)
…

Der Datenteil ist meist länger, hier soll nur das Protokoll betrachtet werden

Nachteil dieser Methode ist, dass die angegebenen Parameter mit der URL meist in der Historie des Browsers gespeichert werden und so persönliche Daten unbeabsichtigt im Browser gespeichert werden können

  • Stattdessen sollte man in diesem Fall die Methode POST benutzen
HTTP POST

Da sich die Daten nicht in der URL befinden, können per POST große Datenmengen, zum Beispiel Bilder, übertragen werden

Im folgenden Beispiel wird wieder der Artikel Katzen angefordert, doch diesmal verwendet der Browser aufgrund eines modifizierten HTML-Codes (method="POST") eine POST-Anfrage

  • Die Variablen stehen dabei nicht in der URL, sondern gesondert im Rumpfteil, etwa:
POST /wiki/Spezial:Search HTTP/1.1
Host: de.wikipedia.org
Content-Type: application/x-www-form-urlencoded
Content-Length: 24

search=Katzen&go=Artikel

Auch das versteht der Server und antwortet wieder mit beispielsweise folgendem Text:

HTTP/1.1 302 Found
Date: Fri, 13 Jan 2006 15:32:43 GMT
Location: http://de.wikipedia.org/wiki/Katzen

HTTP-Statuscodes

Jede HTTP-Anfrage wird vom Server mit einem HTTP-Statuscode beantwortet

  • ob die Anfrage erfolgreich bearbeitet wurde
  • teilt dem Client/Browser im Fehlerfall mit, wo (zum Beispiel Umleitung) beziehungsweise wie (zum Beispiel mit Authentifizierung) er die gewünschten Informationen (wenn möglich) erhalten kann


Option  Beschreibung
1xx – Informationen Die Bearbeitung der Anfrage dauert trotz der Rückmeldung noch an
  • Eine solche Zwischenantwort ist manchmal notwendig, da viele Clients nach einer bestimmten Zeitspanne (Zeitüberschreitung) automatisch annehmen, dass ein Fehler bei der Übertragung oder Verarbeitung der Anfrage aufgetreten ist, und mit einer Fehlermeldung abbrechen
2xx – Erfolgreiche Operation Die Anfrage wurde bearbeitet und die Antwort wird an den Anfragesteller zurückgesendet
3xx – Umleitung Um eine erfolgreiche Bearbeitung der Anfrage sicherzustellen, sind weitere Schritte seitens des Clients erforderlich
  • Das ist etwa der Fall, wenn eine Webseite vom Betreiber umgestaltet wurde, sodass sich eine gewünschte Datei nun an einem anderen Platz befindet
  • Mit der Antwort des Servers erfährt der Client im Location-Header, wo sich die Datei jetzt befindet
4xx – Client-Fehler Bei der Bearbeitung der Anfrage ist ein Fehler aufgetreten, der im Verantwortungsbereich des Clients liegt
  • Ein 404 tritt etwa ein, wenn ein Dokument angefragt wurde, das auf dem Server nicht existiert
  • Ein 403 weist den Client darauf hin, dass es ihm nicht erlaubt ist, das jeweilige Dokument abzurufen
  • Es kann sich zum Beispiel um ein vertrauliches oder nur per HTTPS zugängliches Dokument handeln
5xx – Server-Fehler Es ist ein Fehler aufgetreten, dessen Ursache beim Server liegt
  • Zum Beispiel bedeutet 501, dass der Server nicht über die erforderlichen Funktionen (das heißt etwa Programme oder andere Dateien) verfügt, um die Anfrage zu bearbeiten

Zusätzlich zum Statuscode enthält der Header der Server-Antwort eine Beschreibung des Fehlers in englischsprachigem Klartext

Mit Fehler 404 kommen Web-Nutzer am häufigsten in Berührung

Zum Beispiel ist ein Fehler 404 an folgendem Header zu erkennen:

HTTP/1.1 404 Not Found

siehe auch HTTP/Statuscode

HTTP-Authentifizierung

HTTP/Authentifizierung

HTTP-Kompression

Datenmenge verringern

Um die übertragene Datenmenge zu verringern, kann ein HTTP-Server seine Antworten komprimieren

  • Ein Client muss bei einer Anfrage mitteilen, welche Kompressionsverfahren er verarbeiten kann
  • Dazu dient der Header Accept-Encoding (etwa Accept-Encoding: gzip, deflate)
  • Der Server kann dann die Antwort mit einem vom Client unterstützten Verfahren komprimieren und gibt im Header Content-Encoding das verwendete Kompressionsverfahren an
  • HTTP-Kompression spart vor allem bei textuellen Daten (HTML, XHTML, CSS, Javascript-Code, XML, JSON) erhebliche Datenmengen, da sich diese gut komprimieren lassen
  • Bei bereits komprimierten Daten (etwa gängige Formate für Bilder, Audio und Video) ist die (erneute) Kompression nutzlos und wird daher üblicherweise nicht benutzt
Kompressionsangriffe

In Verbindung mit einer mit TLS verschlüsselten Kommunikation führt die Komprimierung allerdings zum BREACH-Exploit, wodurch die Kryptografie gebrochen werden kann

Versionen

Version Beschreibung
0.9
1.0
1.1
2
3

HTTP/0.9

Sir Tim Berners-Lee gilt als Begründer des Webs und entwickelte auch HTTP mit.

Ab 1989 entwickelten Tim Berners-Lee und sein Team am CERN, dem europäischen Kernforschungszentrum in der Schweiz, das Hypertext Transfer Protocol, zusammen mit den Konzepten URL und HTML, womit die Grundlagen des World Wide Web geschaffen wurden. Erste Ergebnisse dieser Bemühungen war 1991 die Version HTTP 0.9

HTTP/1.0

Die im Mai 1996 als RFC 1945 (Request for Comments Nr. 1945) publizierte Anforderung ist als HTTP/1.0 bekannt geworden Bei HTTP/1.0 wird vor jeder Anfrage eine neue TCP-Verbindung aufgebaut und nach Übertragung der Antwort standardmäßig vom Server wieder geschlossen

  • Sind in ein HTML-Dokument beispielsweise zehn Bilder eingebettet, so werden insgesamt elf TCP-Verbindungen benötigt, um die Seite auf einem grafikfähigen Browser aufzubauen

HTTP/1.1

1999 wurde eine zweite Anforderung als RFC 2616 publiziert, die den HTTP/1.1-Standard wiedergibt Bei HTTP/1.1 kann ein Client durch einen zusätzlichen Headereintrag (Keepalive) den Wunsch äußern, keinen Verbindungsabbau durchzuführen, um die Verbindung erneut nutzen zu können (persistent connection)

  • Die Unterstützung auf Serverseite ist jedoch optional und kann in Verbindung mit Proxys Probleme bereiten
  • Mittels HTTP-Pipelining können in der Version 1.1 mehrere Anfragen und Antworten pro TCP-Verbindung gesendet werden
  • Für das HTML-Dokument mit zehn Bildern wird so nur eine TCP-Verbindung benötigt
  • Da die Geschwindigkeit von TCP-Verbindungen zu Beginn durch Verwendung des Slow-Start-Algorithmus recht gering ist, wird so die Ladezeit für die gesamte Seite signifikant verkürzt
  • Zusätzlich können bei HTTP/1.1 abgebrochene Übertragungen fortgesetzt werden

Eine Möglichkeit zum Einsatz von HTTP/1.1 in Chats ist die Verwendung des MIME-Typs multipart/replace, bei dem der Browser nach Senden eines Boundary-Codes und eines neuerlichen Content-Length-Headerfeldes sowie eines neuen Content-Type-Headerfeldes den Inhalt des Browserfensters neu aufbaut

Mit HTTP/1.1 ist es neben dem Abholen von Daten auch möglich, Daten zum Server zu übertragen

  • Mit Hilfe der PUT-Methode können so Webdesigner ihre Seiten direkt über den Webserver per WebDAV publizieren und mit der DELETE-Methode ist es ihnen möglich, Daten vom Server zu löschen
  • Außerdem bietet HTTP/1.1 eine TRACE-Methode, mit der der Weg zum Webserver verfolgt und überprüft werden kann, ob die Daten korrekt dorthin übertragen werden
  • Damit ergibt sich die Möglichkeit, den Weg zum Webserver über die verschiedenen Proxys hinweg zu ermitteln, ein traceroute auf Anwendungsebene

Aufgrund von Unstimmigkeiten und Unklarheiten wurde 2007 eine Arbeitsgruppe gestartet, die die Spezifikation verbessern sollte

  • Ziel war hier lediglich eine klarere Formulierung, neue Funktionen wurden nicht eingebaut
  • Dieser Prozess wurde 2014 beendet und führte zu sechs neuen RFCs:
  • RFC 7230 – HTTP/1.1: Message Syntax and Routing
  • RFC 7231 – HTTP/1.1: Semantics and Content
  • RFC 7232 – HTTP/1.1: Conditional Requests
  • RFC 7233 – HTTP/1.1: Range Requests
  • RFC 7234 – HTTP/1.1: Caching
  • RFC 7235 – HTTP/1.1: Authentication

HTTP/2

Im Mai 2015 wurde von der IETF HTTP/2 als Nachfolger von HTTP/1.1 verabschiedet

  • Der Standard ist durch RFC 7540 und RFC 7541 spezifiziert. Die Entwicklung war maßgeblich von Google (SPDY) und Microsoft (HTTP Speed+Mobility) mit jeweils eigenen Vorschlägen vorangetrieben worden
  • Ein erster Entwurf, der sich weitgehend an SPDY anlehnte, war im November 2012 publiziert und seither in mehreren Schritten angepasst worden

Mit HTTP/2 soll die Übertragung beschleunigt und optimiert werden. Dabei soll der neue Standard jedoch vollständig abwärtskompatibel zu HTTP/1.1 sein

Wichtige neue Möglichkeiten sind

  • die Möglichkeit des Zusammenfassens mehrerer Anfragen
  • weitergehende Datenkompressionsmöglichkeiten
  • die binär kodierte Übertragung von Inhalten und
  • Server-initiierte Datenübertragungen (push-Verfahren)
  • einzelne Streams lassen sich priorisieren

Eine Beschleunigung ergibt sich hauptsächlich aus der neuen Möglichkeit des Zusammenfassens (Multiplex) mehrerer Anfragen, um sie über eine Verbindung abwickeln zu können Die Datenkompression kann nun (mittels neuem Spezialalgorithmus namens HPACK) auch Kopfdaten mit einschließen Inhalte können binär kodiert übertragen werden Um nicht auf serverseitig vorhersehbare Folgeanforderungen vom Client warten zu müssen, können Datenübertragungen teilweise vom Server initiiert werden (push-Verfahren) Durch die Verwendung von HTTP/2 können Webseitenbetreiber die Latenz zwischen Client und Server verringern und die Netzwerkhardware entlasten

Die ursprünglich geplante Option, dass HTTP/2 standardmäßig TLS nutzt, wurde nicht umgesetzt

  • Allerdings kündigten die Browser-Hersteller Google und Mozilla an, dass ihre Webbrowser nur verschlüsselte HTTP/2-Verbindungen unterstützen werden
  • Dafür ist ALPN eine Kryptografies-Erweiterung, die TLSv1.2 oder neuer braucht

HTTP/2 wird von den meisten Browsern unterstützt, darunter Google Chrome (inkl. Chrome unter iOS und Android) ab Version 41, Mozilla Firefox ab Version 36, Internet Explorer 11 unter Windows 10, Opera ab Version 28 (sowie Opera Mobile ab Version 24) und Safari ab Version 8

HTTP/3

Im Juni 2022 wurde HTTP/3 als RFC 9114 standardisiert

  • Im November 2018 wurde von der IETF beschlossen, dass HTTP/3 QUIC verwenden solle
  • Google arbeitet schon seit 2012 an einer Alternative unter dem Namen QUIC

QUIC setzt nicht mehr auf das verbindungsorientierte TCP, sondern auf das verbindungslose User Datagram Protocol (UDP)

  • Auch bei dem darauf aufbauenden HTTP/3 werden Datenströme getrennt verarbeitet
  • Geht ein Paket unterwegs verloren, betrifft es nicht mehr alle Datenströme, wie es bei TCP der Fall ist
  • Bei HTTP/3 wird der betroffene Strom warten, bis das fehlende Paket eintrifft
  • HTTP/3 ist generell verschlüsselt und verspricht deutliche Geschwindigkeitsvorteile

Google Chrome Canary war ab Mitte 2019 der erste verfügbare Browser, der eine experimentelle #QUIC- und HTTP/3-Unterstützung integriert hatte. cURL zog bald nach

  • Die Vorab-Versionen von Firefox (nightly und beta) versuchen seit April 2021 automatisch, HTTP/3 zu verwenden, wenn es vom Webserver (derzeit z.B Google oder Facebook) angeboten wird
  • Webserver können die Unterstützung anzeigen, indem sie den Alt-Svc-Antwortheader verwenden oder die HTTP/3-Unterstützung mit einem HTTPS-DNS-Eintrag ankündigen
  • Sowohl der Client als auch der Server müssen dieselbe QUIC- und HTTP/3-Entwurfsversion unterstützen, um sich verbinden zu können
  • Firefox unterstützt beispielsweise derzeit die Entwürfe 27 bis 32 der Spezifikation, sodass der Server die Unterstützung einer dieser Versionen (z. B. „h3-32“) im Alt-Svc- oder HTTPS-Eintrag melden muss, damit Firefox versucht, QUIC und HTTP/3 mit diesem Server zu verwenden
  • Beim Besuch einer solchen Website sollte in den Netzwerkanforderungsinformationen darauf hingewiesen werden, dass HTTP/3 verwendet wird

Applikationen über HTTP

HTTP als textbasiertes Protokoll wird nicht nur zur Übertragung von Webseiten verwendet, es kann auch in eigenständigen Applikationen, den Webservices, verwendet werden

  • Dabei werden die HTTP-eigenen Befehle wie GET und POST für CRUD-Operationen weiterverwendet
  • Dies hat den Vorteil, dass kein eigenes Protokoll für die Datenübertragung entwickelt werden muss
  • Beispielhaft wird dies bei REST eingesetzt

Anhang

Siehe auch

Dokumentation

RFC Titel
2616 HTTP/1.1
9113 HTTP/2
9114 HTTP/3
7541 Header Compression
7230 Message Syntax and Routing
7231 Semantics and Content
7232 Conditional Requests
7233 Range Requests
7234 Caching
7235 Authentication
Weblinks
  1. https://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol