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:
| GET | Die Antwort enthält nach dem Header den gesamten Inhalt der angeforderten Seite. |
| HEAD | Die Antwort enthält nur den Header. |
| POST | Damit übermittelt man dem Server einen Datenblock, den der Server in die angegebene URL einfügen soll. |
| PUT | Die übermittelten Daten sollen in einer neuen oder bereits existierenden Datei an der angegebenen URL gespeichert werden. |
| DELETE | Die angegebene Adresse soll vom Server entfernt werden. |
| LINK | Damit werden Links hergestellt. |
| UNLINK | Damit 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
| 200 | OK: Kein Fehler aufgetreten, Datei befindet sich hinter dem Header. |
| 201 | Created: Die neue Adresse wurde kreiert und ist nun verfügbar. |
| 202 | Accepted: Die Anfrage wurde verstanden, der angefragte Prozess ist jedoch noch nicht beendet. |
| 204 | No Content: Die Anfrage wurde verstanden, es existieren jedoch keine Informationen, die zurückgesendet werden können. |
300 bis 399: Verschiebungen und allgemeine Veränderungen
| 301 | Moved Permanently: Datei nicht vorhanden, da sie verschoben wurde. Die neue Adresse befindet sich im Header an der Stelle "Location:" |
| 302 | Moved Temporarily: Date ist momentan nicht an der angegebenen Stelle, wird jedoch bald wieder da sein. |
| 304 | Not Modified: Die Datei wurde seit der letzten Anfrage nicht verändert. |
400 bis 499: Fehler beim Client
| 400 | Bad Request: Anfrage konnte vom Server nicht verstanden werden. |
| 401 | Unauthorized: Der Client muss eine Identifikation mitgeben. |
| 403 | Forbidden: Die Anfrage konnte nicht beantwortet werden und sollte nicht wiederholt werden. Auch eine Identifizierung würde nicht helfen. |
| 404 | Not Found: Datei wurde auf diesem Server nicht gefunden. |
500 bis 599: Fehler beim Server
| 500 | Internal Server Error: Der Server hat einen Fehler und kann nicht antworten. |
| 501 | Not Implemented: Die angeforderte Anweisung kann nicht beantwortet werden, da sie nicht implementiert ist. |
| 502 | Bad Gateway: angesprochener Server konnte aufgrund des nächst höheren Servers keine korrekte Antwort liefern. |
| 503 | Service Unavilable: Der Server kann momentan nicht antworten. Vielleicht ist er überlastet. |
Die Header-Zeile können folgende Anweisungen beinhalten:
| Allow: Methode | Damit wird angegeben, welche Methoden der Client benutzen darf (was er aber nicht umbedingt befolgen muss). |
| Authorization: Authentifizierung | Damit kann ein Code übermittelt werden, der den Client berechtigt, die angeforderten Daten zu empfangen. |
| Content-Encoding: content-coding | Damit kann angegeben werden, wie die empfangenen Daten codiert sind. (Beispielsweise x-gzip) |
| Content-Length: Länge | Damit kann angegeben werden, wie lange der Datenblock ist, der übermittelt wird. |
| Content-Type: media-type | Damit kann angegeben werden, welcher Art die Daten sind. |
| Date: HTTP-date | Damit wird das Datum des Datenblockes angegeben werden. Ein Datum ist beispielsweise folgendes: "Tue, 15 Nov 1994 08:12:31 GMT" |
| Expires: HTTP-date | Damit wird das Datum angegeben, wann der Inhalt nutzlos oder falsch wird. |
| From: mailbox | Damit wird die E-Mail-Adresse des Herstellers der Daten angegeben. |
| If-Modified-Since: HTTP-date | Damit kann ein conditional-GET ermirkt werden: Übermittle die Daten nur, wenn sie seit dem angegebenen Datum geändert wurden. |
| Last-Modified: HTTP-date | Damit kann angegeben werden, wann die Daten das letzte mal verändert wurden. |
| Location: absoluteURI | Damit wird die URL angegeben, an welcher die sich die Daten befinden (Wird beispielsweise beim Fehler 301: Moved Permanently benutzt) |
| Pragma: Pragma-Direktive | Siehe Manual |
| Referer: URL | Damit wird ein Link angegeben. |
| Server: 1*( product | comment ) | Siehe Manual |
| User-Agent: 1*( product | comment ) | Siehe Manual |
| WWW-Authenticate: Authentifizierung | Damit kann ein Code übermittelt werden, der den Client berechtigt, die angeforderten Daten zu empfangen. |