Hypertext Transfer Protocol
Das Netzwerkprotokoll Hypertext Transfer Protocol / HTTP wird vor allem eingesetzt, um Webseiten und andere Daten von einem Webserver aus dem World Wide Web in einen Webbrowser zu laden.
HTTP 1.0 wurde im Mai 1996 in der RFC 1945 veröffentlicht, im August 1996 folgte HTTP 1.1. Wie finger, telnet und echo ist auch HTTP ein verbindungs- oder statusloses Protokoll. Server und Client nehmen also nie einen besonderen Zustand an, sondern beenden nach jedem Befehl den Prozess vollständig, entweder mit Erfolg oder mit einer Fehlermeldung. Es obliegt dem Kommunikatiosnpartner, darauf in angemessener Weise zu reagieren.
Für Streaming eignet sich HTTP nicht gerade ideal, denn sobald durch Paketverluste Aussetzer entstehen, schaukelt sich der Effekt noch hoch, weil die verlorenen Pakete neu übertragen werden.
Protokollaufbau
HTTP-Befehle können aus mehreren Zeilen bestehen. Die erste Zeile ist immer die Befehlszeile. Daran angehängt kann ein sogenannter Message-Header folgen. Dieser Header enthält weitere Parameter, die den Befehl näher bestimmen. So kann ein "Content-Length"-Feld enthalten sein. Steht dort ein Wert grösser als 0, so folgen dem Header Daten. Die Daten werden also gleich zusammen mit dem Befehl gesendet - man spricht dann vom "Body" der Nachricht. HTTP versteht im Gegensatz zu SMTP den Umgang mit 8-Bit-Werten. Binärdaten wie Bilder oder Klänge müssen nicht umgewandelt werden. Folgen dem HTTP-Befehl und den Header-Zeilen zwei Leerzeichen, (Zeilenwechsel "\n"), so gilt der Befehl als beendet. Befehle mit Body haben kein besonderes Endezeichen, das "Content-Length"-Feld bestimmt, wieviele Byte als Inhalt der Nachricht eingelesen werden. Ein HTTP-Befehl hat immer den folgenden Aufbau. Mit "Methode" oder "HTTP-Request-Methode" wird der Befehl selbst bezeichnet.
<METHODE> ID VERSION
Die folgende Tabelle zeigt alle HTTP-Befehle. Sie sind sämtlich in Grossbuchstaben zu schreiben.
Befehl | Beschreibung |
---|---|
DELETE | Ressource löschen |
GET | Ressource anfordern |
HEAD | Header der Ressource anfordern |
LINK | Verknüpfung zweier Ressourcen beantragen |
OPTIONS | Optionen des Webservers erfragen |
POST | Daten an einen Serverprozess senden |
PUT | Ressource auf dem Webserver ablegen |
TRACE | Befehl zurückschicken lassen |
UNLINK | Verknüpfung zwischen Ressourcen löschen |
Die ID einer Ressource kann beispielsweise eine Adresse oder ein Dateiname sein. Folgender Befehl fordert die datei "index.html" an.
GET index.htm HTTP/1.0
Statuscodes
Die Antwort auf einen Befehl besteht im Senden eines Statuscodes. Dem Statuscode folgen optionale Felder, und bei der Übertragung von Ressourcen die Daten. Die Statuszeile hat folgenden Aufbau. Der Statuscode ist eine dreistellige Ziffer, von denen die erste die Zuordnung zu einer bestimmten Gruppe zeigt.
VERSION STATUSCODE STATUSTEXT
Folgende Tabelle zeigt eine Übersicht über die wichtigsten Statusmeldungen.
Statuscode | Beschreibung |
---|---|
2xx: Befehl war erfolgreich | |
200 | Die Übertragung war erfolgreich und lief ohne Fehler ab. |
201 | Ein POST-Befehl wurde ausgegeben, es wurde erfolgreich eine Ressource erstellt und ereignislos ausgeführt. |
202 | Der Befehl des Clients wurde nach Authentifizierung vom Server für weitere Verarbeitung akzeptiert. |
203 | Der Server konnte die Anfrage des Clients nur teilweise ausführen. |
204 | Die Anfrage des Clients wurde bearbeitet, der Server konnte aber keine Daten zurückgeben, weil es keinen Inhalt gibt oder dieser nicht angefordert wurde. |
3xx: Weitere Reaktion erforderlich | |
300 | Der Client hat Daten verlangt, die vor kurzem an einen anderen Ort verschoben wurden. |
301 | Der Server hat die vom Client verlangten Daten (die Ressource) unter einer alternativen, temporär dortin umgeleiteten URL gefunden. |
302 | Ressource zur Zeit nicht verfügbar, der Server hat einen alternativen Standort für die vom Client angeforderten Daten vorgeschlagen. |
303 | Es gab ein Problem, weil der Server die verlangten Daten nicht modifizieren konnte. |
304 | Ressource wurde nicht verändert (steuert Proxy) |
4xx: Fehler, Wiederholung mit anderen Daten sinnvoll | |
400 | Der Client hat eine fehlerhafte Anfrage gestartet (Syntaxfehler). Diese konnte daher nicht bearbeitet werden. |
401 | Der Client hat versucht, auf Daten zuzugreifen, für die er keine Autorisierung hat. |
402 | Ein Zahlungsschema wurde gestartet. |
403 | Nicht öffentlicher Bereich, ein Zugriff ist nicht erlaubt. |
404 | Das Dokument wurde nicht gefunden. |
5xx: Serverfehler, Wiederholung zwecklos | |
500 | Interner Server-Fehler, von dem sich der Server nicht erholen kann (Fehlfunktion). Tritt häufig auf, wenn ein Client ein fehlerhaftes CGI-Skript aufruft. |
501 | Der Client hat eine Aktion verlangt, die der Server nicht durchführen kann oder nicht unterstützt. |
502 | Feldwert oder URL ungültig (nur Proxy); der Server ist überlastet. |
503 | Dienst nicht verfügbar. Der Server wartet darauf, dass ein anderer Gateway-Dienst Daten zurückgibt, aber der externe Dienst hängt oder ist ausgefallen. |
Der HTTP-Message-Header
An einen Befehl oder an die Statuszeile können weitere Felder angehängt werden. Der Aufbau lehnt sich an den MIME-Standard an. Die Header-Felder können in drei Hauptgruppen aufgeteilt werden.
Gruppe | Beschreibung |
---|---|
F | Fragefelder (Request-Header-Fields) sind nur in Befehlen erlaubt. |
A | Antwortfelder (Response-Header-Fields) kommen nur in der Antwort (Statusnachricht) vor. |
I | Informationsfelder (General-Header-Fields) übertragen alle anderen Nachrichten, wie Grössen und Parameter. |
Nicht alle Server stellen alle Felder zur Verfügung, teilweise ergeben sich durch die Weiterleitung der Nachrichten an den Nutzer erhebliche Sicherheitslücken - immerhin werden die Daten vom Webbrowser empfangen. Muss ein Feld mehrfach übertragen werden, so kann die Angabe der Werte als durch Kommas getrennte Liste oder durch Wiederholung der Feldnamen erfolgen.
Header-Field Wert, Wert, Wert ...
Alternativ können die Werte auch folgendermassen auftreten.
Header-Field Wert Header-Field Wert Header-Field Wert
Einige Header können untergeordente (optionale) Informationen enthalten. So kann dem Feld "Content-Type" der Name der Datei übergeben werden. Die Elemente werden dabei mit Strichpunkten getrennt.
Content-Type: application/pdf; name=bestellung.pdf
Die folgende Tabelle zeigt alle Header-Felder und die zugehörigen Gruppen.
Gruppe | Feldname | Beschreibung |
---|---|---|
F | Accept | MIME-Typen, die der Cleint verarbeiten kann. |
F | Accept-Charset | Bevorzugter Zeichensatz |
F | Accept-Encoding | Kodierung des Clients |
F | Accept-Language | |
I | Allow | Liste aller erlaubten Befehle |
F | Authorization | Authentifizierung der Clients |
I | Content-Disposition | Inhaltsbeschreibung einer MIME-Quelle |
I | Content-Encoding | Kodierung der Ressource |
I | Content-Language | Sprache der Ressource |
I | Content-Length | Grösse der Ressource (in Byte) |
I | Content-Type | MIME-Typ der Ressource |
I | Date | Absende- oder Erstellungsdatum |
I | Expires | Verfallsdatum der Ressource |
F | From | E-Mail-Adresse des Nutzers |
F | Host | Domainname des Webservers |
F | If-Modified-Since | Nur dann "GET", wenn neueren Datums |
I | Last-Modified | Aktualisierungsdatum der Ressource |
I | Link | Verknüpfung |
A | Location | URL der Ressource (bei Redirect) |
I | MIME-Version | MIME-Version des Headers |
I | Pragma | Allgemeiner Schalter "Name=Wert" |
F | Referer | URL der Herkunfts-Ressource |
A | Retry-After | Datum der nächsten Verfügbarkeit |
A | Server | Name und Version des Webservers |
I | Title | Titel der Ressource |
U | URI | URI der Ressource |
F | User-Agent | Name und Versionsnummer der Ressource |
A | WWW-Authenticate | Authentifizierungsschema |
Im Gegensatz zu anderen Protokollen wird die Länge eines Datenblocks mit dem Feld "Content-Length" festgelegt, irgendwelche Begrenzungszeichen gibt es nicht. Zu beachten ist auch, dass der Server nach dem Verbindungsaufbau keine Antwort sendet. Erst der erste eintreffende Befehl löst eine Reaktion aus. Darin ist die Ursache zu sehen, wenn die Webbrowser nach der Anforderung eines unerreichbaren Servers lange Zeit nicht reagieren. Als "Totsignal" wird einfach eine vorgegebene Zeit gewartet, in welcher der Server auf den ersten Befehl reagieren sollte.
Eine einfache HTTP-Verbindung könnte nun folgendermassen aussehen.
Client: (Verbindungsaufbau des Webbrowsers) Server: (keine Antwort) Client: GET /index.html HTTP/1.0 If-Modified-Since: Wed, 30 Jul 2007 00:00:00 <CR><LF> Server: HTTP/1.0 200 Document follows Date: Mon, 18 Aug 2007 23:22:10 GMT+200 Server: IIS 5.0, Microsoft Corporation Content-Type: text/html Last-Modified: Mon, 11 Aug 2007 14:39:13 Content-Length: 7245 <CR><LF> JDGGF/(&§=$(?ED... Daten ohne Endekennung
Wenn Header selbst ausgewertet werden, muss folgendes Datumsformat beachtet werden.
www, dd MMM YYYY HH:mm:ss GMT+xxx
Verwendung
Mit einem HTTP-Server kann über eine telnet-Sitzung an Port 80 direkt kommuniziert werden.
$ telnet www.linux-user.de 80 oder $ telnet www.linux-user.de http
Beispiel: Webseite ohne Webbrowser ansehen
Ansehen des Hauptdokuments von www.linux-user.de.
$ telnet www.linux-user.de 80 Trying 62.245.157.217... Connected to www.linux-user.de. Escape character is '^]'. GET / <html> ... </html> Connection closed by foreign host.
Ansehen des Hauptdokuments der Website "www.linux-user.de" mit zusätzlichen Header-Informationen, provoziert durch das Senden einer HTTP/1.0-Anfrage.
$ telnet www.linux-user.de 80 Trying 62.245.157.217... Connected to www.linux-user.de. Escape character is '^]'. GET / HTTP/1.0 HTTP/1.1 200 OK Date: Wed, 20 Apr 2005 19:53:05 GMT Server: Zope/Zope 2.3.3 (binary release, python 1.5.2, linux2-x86) ZServer/1.1b1 Content-Type: text/html Content-Length: 35720 X-Cache: MISS from www.linux-user.de Connection: close <html> ... </html> Connection closed by foreign host.
Ansehen des Hauptdokuments von www.linux-user.de mit zusätzlichen Header-Informationen, provoziert durch das Senden einer HTTP/1.0-Anfrage.
$ telnet www.linux-user.de 80 Trying 62.245.157.217... Connected to www.linux-user.de. Escape character is '^]'. GET / HTTP/1.1 Host: meister.site HTTP/1.1 200 OK Date: Wed, 20 Apr 2005 19:59:44 GMT Server: Zope/Zope 2.3.3 (binary release, python 1.5.2, linux2-x86) ZServer/1.1b1 Content-Type: text/html Content-Length: 35727 X-Cache: MISS from www.linux-user.de <html> ... </html> Connection closed by foreign host.
Ansehen des Hauptdokuments von www.linux-user.de mit zusätzlichem Abspeichern in die Datei "file.html".
$ telnet www.linux-user.de 80 | tee file.html
Konvertieren der Datei "file.html" in eine normale Textdatei.
$ html2text -o file.txt file.html
Weblinks
Herausgeber | Sprache | Webseitentitel | Anmerkungen |
---|---|---|---|
Wikipedia | ger | Hypertext Transfer Protocolwbm | Enzyklopädischer Artikel |
Netcraft Ltd. | eng | Netcraftwbm | Statistiken zum WWW |