Mandalex

HTTP heisst "HyperText Transfer Protocol" und bedeutet "Hypertext Übertragungs Protokoll". HTTP ist das Protokoll, welches verwendet wird, um Homepages vom Internet herunterzuladen, und in einem Browser darstellen zu lassen.

Man unterscheidet zwischen den beiden Versionen 1.0 (RFC 1945) und 1.1 (RFC 2616). Beide Versionen erstellen bei Gebrauch eine TCP-Verbindung über den (standartisierten) Port 80: Der Client sendet einen Request an den Server, worauf dieser mit einem Reply-Objekt antwortet. Daraufhin können Anfragen und Antworten (Bei HTTP 1.0 nur jeweils eine!) ausgetauscht werden. Schlussendlich wird die TCP-Verbindung wieder vollständig geschlossen.

Wie bereits angedeutet schliesst der Server unter HTTP 1.0 nach jeder einzelnen Anforderung die Verbindung wieder. So muss also bei Homepages, die noch irgendwelche weitere Links (hauptsächlich Bilder) beinhalten, für jeden einzelnen Link die Verbindung von neuem hergestellt werden. Diese Verbindungsart nennt man "nicht-persistent"

Eine persistente Verbindung kann mittels HTTP 1.1 aufgebaut werden. Hierbei wartet der Server nach jeder Antwort darauf, dass vielleicht noch eine weitere Anfrage kommt (dass noch weitere Links heruntergeladen werden sollen). Sobald alles geladen ist, sendet der Client ein Signal, dass keine weiteren Links mehr geladen werden sollen, und der Server schliesst die Verbindung.

HTTP ist sogenannt Statuslos (stateless), was bedeutet, dass weder Client noch Server wissen, was in anderen, früheren HTTP-Verbindungen passierte, jede Anfrage ist völlig neu. Es gibt die Möglichkeit, Cookies zu versenden, dazu aber später mehr.

Die Befehle von HTTP sind in Klartext geschrieben, man sendet also Beispielsweise Befehle wie GET, POST oder HEAD. Um ein Ende-Signal (wo hört die Anfrage auf) zu schicken, wird ein carriage return plus line feed (cr,lf, in Ascii-Codes: 13,10), gesendet, was durch einfache Betätigung der Enter-Taste erreicht wird (wird im folgenden auch so genannt).

Die Allgemeine Struktur von HTTP-Anfrage-Befehlen sieht folgendermassen aus:

Methode -space- URL -space- Version -Enter-
Header-Feld : Wert -Enter-
Header-Feld : Wert -Enter-
...
-Enter-
Datenblock
-Enter-

In der ersten Linie wird die Aktion definiert, die vom Server verlangt wird: Die Methode ist der Befehl selbst (Bsp. GET). Die URL ist die Adresse des Links, den man bearbeitet haben möchte. Die Version gibt die Version von HTML an, die benutzt werden soll (nicht alle Server unterstützen die Version 1.1).

Die folgenden Linien sind für die Spezifikation der verlangten Datei, genauer des Headers, gedacht. Hier kann genau angegeben werden, welche Werte akzeptiert oder verlangt werden.

Die Anfrage ist zu Ende, sobald ein einzelnes Enter in einer Linie steht. Besteht die gesamte Anfrage nur aus einem Enter, so bedeutet dies (das ist wichtig für Version 1.1), dass keine weiteren Anfragen mehr kommen.

Nehmen wir nun an, wir seien über den Befehl

telnet www.sbb.ch 80

mit dem Port 80 vom Server der SBB verbunden. Ein einfaches Beispiel für eine HTTP-Anforderung sind die folgenden zwei Linien:

GET /index.htm HTTP/1.0
-Enter-

Dies wird zu einem Ausdruck der index-Seite ins Terminal führen (natürlich in reinem Textformat). Unter HTTP 1.1 muss bei jeder Anfrage der Host (Bsp www.sbb.ch) neu angegeben werden. Die folgenden drei Linien erzeugen die (fast) gleiche Ausgabe, wie mit HTTP/1.0:

GET /index.htm HTTP/1.1
host: www.sbb.ch
-Enter-

Hier muss nach erfolgreicher Ausgabe der Datei noch einmal -Enter- gedrückt werden, damit die Verbindung geschlossen wird. Die wichtigsten Requests, die man stellen kann, sind die folgenden:

GETDie Antwort enthält nach dem Header den gesamten Inhalt der angeforderten Seite.
HEADDie Antwort enthält nur den Header.
POSTDamit übermittelt man dem Server einen Datenblock, den der Server in die angegebene URL einfügen soll.
PUTDie übermittelten Daten sollen in einer neuen oder bereits existierenden Datei an der angegebenen URL gespeichert werden.
DELETEDie angegebene Adresse soll vom Server entfernt werden.
LINKDamit werden Links hergestellt.
UNLINKDamit werden Links wieder entfernt.

Die Antwort (die html-Seite), die zurückgegeben wird, hat einen sogenannten Header. In diesem Header stehen einige nützliche Dinge über die Seite. In der ersten Linie kommt jeweils Statusbericht mit folgendem Format:

HTTP/Version Fehlercode Fehlermeldung

Also Beispielsweise

HTTP/1.1 200 OK

Dabei sind die Fehlercodes und Fehlermeldungen nicht alle standartisiert. Hier diejenigen die HTTP 1.0 vorsieht:

100 bis 199: Informationen
200 bis 299: Erfolgreiche Anfragen
200OK: Kein Fehler aufgetreten, Datei befindet sich hinter dem Header.
201Created: Die neue Adresse wurde kreiert und ist nun verfügbar.
202Accepted: Die Anfrage wurde verstanden, der angefragte Prozess ist jedoch noch nicht beendet.
204No Content: Die Anfrage wurde verstanden, es existieren jedoch keine Informationen, die zurückgesendet werden können.
300 bis 399: Verschiebungen und allgemeine Veränderungen
301Moved Permanently: Datei nicht vorhanden, da sie verschoben wurde. Die neue Adresse befindet sich im Header an der Stelle "Location:"
302Moved Temporarily: Date ist momentan nicht an der angegebenen Stelle, wird jedoch bald wieder da sein.
304Not Modified: Die Datei wurde seit der letzten Anfrage nicht verändert.
400 bis 499: Fehler beim Client
400Bad Request: Anfrage konnte vom Server nicht verstanden werden.
401Unauthorized: Der Client muss eine Identifikation mitgeben.
403Forbidden: Die Anfrage konnte nicht beantwortet werden und sollte nicht wiederholt werden. Auch eine Identifizierung würde nicht helfen.
404Not Found: Datei wurde auf diesem Server nicht gefunden.
500 bis 599: Fehler beim Server
500Internal Server Error: Der Server hat einen Fehler und kann nicht antworten.
501Not Implemented: Die angeforderte Anweisung kann nicht beantwortet werden, da sie nicht implementiert ist.
502Bad Gateway: angesprochener Server konnte aufgrund des nächst höheren Servers keine korrekte Antwort liefern.
503Service Unavilable: Der Server kann momentan nicht antworten. Vielleicht ist er überlastet.

Die Header-Zeile können folgende Anweisungen beinhalten:

Allow: MethodeDamit wird angegeben, welche Methoden der Client benutzen darf (was er aber nicht umbedingt befolgen muss).
Authorization: AuthentifizierungDamit kann ein Code übermittelt werden, der den Client berechtigt, die angeforderten Daten zu empfangen.
Content-Encoding: content-codingDamit kann angegeben werden, wie die empfangenen Daten codiert sind. (Beispielsweise x-gzip)
Content-Length: LängeDamit kann angegeben werden, wie lange der Datenblock ist, der übermittelt wird.
Content-Type: media-typeDamit kann angegeben werden, welcher Art die Daten sind.
Date: HTTP-dateDamit wird das Datum des Datenblockes angegeben werden. Ein Datum ist beispielsweise folgendes: "Tue, 15 Nov 1994 08:12:31 GMT"
Expires: HTTP-dateDamit wird das Datum angegeben, wann der Inhalt nutzlos oder falsch wird.
From: mailboxDamit wird die E-Mail-Adresse des Herstellers der Daten angegeben.
If-Modified-Since: HTTP-dateDamit kann ein conditional-GET ermirkt werden: Übermittle die Daten nur, wenn sie seit dem angegebenen Datum geändert wurden.
Last-Modified: HTTP-dateDamit kann angegeben werden, wann die Daten das letzte mal verändert wurden.
Location: absoluteURIDamit wird die URL angegeben, an welcher die sich die Daten befinden (Wird beispielsweise beim Fehler 301: Moved Permanently benutzt)
Pragma: Pragma-DirektiveSiehe Manual
Referer: URLDamit wird ein Link angegeben.
Server: 1*( product | comment )Siehe Manual
User-Agent: 1*( product | comment )Siehe Manual
WWW-Authenticate: AuthentifizierungDamit kann ein Code übermittelt werden, der den Client berechtigt, die angeforderten Daten zu empfangen.