0251 / 590 837 15

HTTP-Transaktionen

Im Folgenden wollen wir das HTTP-Protokoll nun näher kennen lernen. Das Protokoll an sich ist dabei relativ einfach und von nur wenigen Abfolgen dominiert.

Request-Response - Modell

Bei HTTP dreht es sich alles um Fragen und Antworten (Requests und Responses). Eine HTTP-Transaktion, bei der z.B. eine Datei übertragen werden soll, folgt dabei immer dem gleichen Schema. Als erstes baut der Client eine Verbindung zum Server auf. Dies geschieht meist mittels des TCP/IP-Protokolls. Ist die Verbindung zustande gekommen, beginnt der Datenaustausch. Der Client schickt dazu eine Anfrage (Request) an den Server, in der er um die entsprechende Datei bittet. Die Anfrage ist dabei nichts anderes als normaler Text der zwischen beiden übertragen wird - also Zahlen, Zeichen und einige Sonderzeichen. Der Server hat anschließend die Möglichkeit zu antworten. Die Antwort könnte dann z.B. die angeforderte Datei oder eine Fehlermeldung usw. sein. HTTP ist hierzu so ausgelegt, dass beide Teilnehmer die Verbindung möglichst solange aufrecht erhalten, bis eine Transaktion abgeschlossen ist. Im konkreten Fall bedeutet das, dass die Verbindung mindestens bis zur Antwort des Servers gehalten wird. Sollte die Verbindung zwischenzeitlich abbrechen, muss sie eben erneut aufgebaut werden und das Spiel beginnt von vorn.

HTTP lässt allgemein nur kurzzeitige Verbindungen zu. Hat ein Server seine Antwort abgeschickt, beendet er die Verbindung zumeist auch gleich wieder. Das hat zum einen den Vorteil, dass der Server jederzeit genügend freie Verbindungen hat um andere Clienten zu bearbeiten. Zum anderen wird dadurch verhindert, dass der Server ständig Verbindungen zu bereits "toten" Clienten hält. Damit verbunden ist aber auch ein Nachteil: Will ein Client viele Dateien abrufen, muss er jedes mal eine neue Verbindung aufbauen, was letztlich mehr Zeit kostet. Aus diesem Grund ermöglicht es HTTP auch (aber nicht standardmäßig) persistente Verbindungen, also Verbindungen die über mehrere Anfragen hinaus gehen, einzurichten. Solche Verbindungen werden erst dann beendet, wenn der Server sie wegen Zeitüberschreitung kappt oder wenn der Client sie von sich aus beendet.

Request-Syntax

Schauen wir uns als erstes eine normale Anfrage an:

GET /index.html HTTP/1.1
Host: www.html-world.de
User-Agent: Mozilla/4.0
Accept: image/gif, image/jpeg, */*
Connection: Keep-Alive

Dem obigen Beispiel läßt sich relativ leicht das Schema eines Requests entnehmen.
Die erste Zeile gibt die Datei an, die abgerufen werden soll und wie das geschehen soll. Dazu wird hier das Wort GET (bekommen) notiert. Dieses erste Wort wird auch als (Abruf-)Methode bezeichnet. Nach der Methode (also dem "Wie?") folgt das "Was?" - das ist bei jeder Anfrage der Dateiname bzw. der Pfad der abgerufen werden soll. Die erste Zeile schließt dann mit dem Ausdruck HTTP /1.1, der die HTTP-Versionsnummer der Anfragedaten angibt.
Nach der ersten Zeile folgen die sogenannten Header. Diese Zeilen sind meist mehr oder minder optional und liefern dem Webserver Zusatzinformationen zur Verarbeitung, der Verbindung oder gewünschten Dateiformaten. Hierzu gibt es eine ganze Reihe von unterschiedlichen Headern, die aber nicht alle jedes mal eingesetzt werden müssen. Wird ein Header nicht verwendet, so gilt dessen Standardwert.

Wichtig: In HTTP werden alle Zeilen mit einem <CR><LF> (Zeilenvorschub und Zeilenumbruch oder #13#10) und nicht wie bei Mac üblich nur mit <LF> umgebrochen. Jede Nachricht wird außerdem von einer Leerzeile beendet (also durch <CR><LF>).

Response-Syntax

Um den Response zu beschreiben, wollen wir uns diesen doch auch erst mal ansehen:

HTTP/1.1 200 OK
Date: Thu, 15 Jul 2004 19:20:21 GMT
Server: Apache/1.3.5 (Unix)
Accept-Ranges: bytes
Content-length: 46
Connection: close
Content-type: text/html

<h1>Antwort</h1>
<p>Ich bin eine Antwort</p>

Auch bei der Antwort wird zunächst eine allgemeine Nachricht übermittelt (Zeile 1). Sie deutet dem Client, dass die folgende HTTP-Version zu verwenden ist. Als zweites folgt eine Zahl. Sie wird Response-Code genannt und gibt den Übertragungsstatus an. Das kann z.B. der Hinweis auf einen Fehler oder einfach nur eine Sendebestätigung sein. An den Response-Code schließt sich in der ersten Zeile letztlich noch ein kurzer Text an, der den Code in Textform enthält (hier also "OK").
Als weitere Zeilen schließen sich dann die sogenannten Response-Header an (hier die Zeilen 2-7). Ähnlich wie die Request-Header liefern sie Zusatzinfos zur Übertragung, dem Dokument oder anderen Dingen.
An die Header-Daten schließt sich dann, durch eine Leerzeile getrennt, die eigentliche Datei (der Entity-Body genannt) an. Der Dateiinhalt wird dabei einfach als normaler Text übermittelt und kann so auf der Clientseite gespeichert und schließlich angezeigt werden.

HTTP-Datum

Das Standard HTTP-Datumsformat wird im RFC 1123 beschrieben und folgt einem festen Schema. Der Vorteil des Formats liegt darin, dass alle Einheiten (Tag, Monat, Jahr, ...) eindeutig und maschinell eingelesen werden können, da sie immer feste Längen besitzen. Beispiel:

Tue, 06 Apr 2004 21:45:13 GMT