HTTP / SHTTP Schwerpunkt: Technische Aspekte Ausarbeitung von Corinna Habets im Rahmen des Proseminars Methoden und Werkzeuge“ ” an der RWTH Aachen im WS 2003/04 Stand: 16. Oktober 2003 Inhaltsverzeichnis 1 Überblick 1 2 Geschichte 1 3 Einordnung 2 4 Technische Aspekte 4.1 Request . . . . . . . . . 4.2 Response . . . . . . . . . 4.3 Header . . . . . . . . . . 4.4 Caching . . . . . . . . . 4.5 Connection-Management 4.6 SHTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 . 4 . 6 . 8 . 10 . 11 . 12 5 Zusammenfassung 13 6 Ausblick 13 Literatur 14 1 Überblick Das WorldWideWeb in seiner heutigen Form wäre ohne HTTP - das Hyper Text Transfer Protocol - nicht möglich. Dieser Standard regelt zum einen wie ein Client (Beispiel: WebBrowser) über das Internet beliebige Dokumente bei einem WebServer anfordern kann. Zum anderen standardisiert er die möglichen Antworten des Servers. Und zwar völlig unabhängig von Plattform und Hardware der beiden Parteien. Diese Unabhängigkeit ist die Stärke von HTTP. Sie ist unabdingbar für die Kommunikation im Internet, das aus Millionen heterogenen Rechnern besteht. 2 Geschichte Vor HTTP wurde für Datentranfers hauptsächlich FTP (File Transfer Protocol ) benutzt. Dieses Verfahren hat folgende Nachteile: • man muß genau wissen was und wo man sucht • keine erklärende grafische Oberfläche • keine weiterführenden Hinweise Das Duo HTTP und HTML (HyperText Markup Language) - löste FTP in vielen Bereichen ab. (Per HTML lassen sich ansprechende grafische Oberfächen gestalten.) Folgendermaßen verlief die Entwicklung im Einzelnen: 0.9 Im Jahre 1991 erschien ein Prototyp von HTTP, der heute die Versionsnummer 0.9 trägt. Er war sehr primitiv und konnte ausschließlich HTML-Dateien anfordern bzw. liefern. Noch heute trägt HTTP die damalige Beschränkung im Namen. 1.0 Im Zuge der rasanten Entwicklung des Internets wurde Version 0.9 nur wenig später durch HTTP 1.0 ersetzt. Die wichtigste Neuerung war, daß HTTP MIME (Multipurpose Internet Mail Extensions) adaptierte und seitdem jedes beliebige Datenformat transportieren kann. HTTP 1.0 verbreitete sich weit. Da es jedoch kein Standard war, existieren viele verschiedene Implementierungen. 1 1.0+ Mitte der Neunziger Jahre hatte sich HTTP 1.0 durch mehrere Optimierungen zu einer, heute als 1.0+ erweiterten Version entwickelt, die 1.0 großflächig ersetzte. Die Verbesserungen betrafen vor allem Connection-Management (siehe 4.5) und VirtualHosting. 1.1 Diese Version wurde 1997 vorgestellt und 1999 offizieller Standard. In ihr wurden frühere architektonische Fehler beseitigt und die Performance optimiert. HTTP 1.1 ist immer noch aktuell. NG Im Herbst ’97 nahm die Arbeitsgruppe HTTP-NG (NG steht für Next ” Generation“) die Weiterentwicklung von HTTP auf. Allerdings stellte sie die Arbeit schon ein Jahr später wieder ein. Sie waren zeitlich wohl zu dicht an HTTP 1.1 gewesen. Auf eine der daraus entstandenen Ideen gehe ich in Abschnitt 6 ein. 3 Einordnung Ein Großteil des gesamten Datenflusses im Internet wird per HTTP übertragen. Das Protokoll ist von dualer Natur: Einerseits gibt es den Client, der Daten anfragt (sogenannter Request) und empfängt. Andererseits den Server, der das Gewünschte (oder eine Fehlermeldung) liefert (sogenannter Response). Neben diesen beiden Parteien kann es noch zwischengeschaltete Instanzen geben, die sich für den Client wie ein Server verhalten, und für den Server wie ein Client. Diese Intermediaries müssen also beide Seiten des Protokolls beherrschen. Die wichtigen Intermediaries sind: • Proxy Server Mit Proxy Servern lassen sich u. a. Filterfunktionen realisieren, indem man Messages von Client/Server bearbeitet weiterleitet. (Beispiel: Kinderschutzfilter) Viele Proxy Server sind Proxy Caches. Ein Cache ist ein Speicher in dem angeforderte Daten für zukünftige Zugriffe gespeichert werden können (zwecks Beschleunigung). 2 • Gateway Ist in der Reinform ein Übersetzer“ zwischen Anfragen aus dem Inter” net und hinter“ ihm stehenden Servern, die das HTT-Protokoll nicht ” beherrschen. (Beispiel: Web-Interface für EMail, HTTP <->POP3) (In der Praxis sind die Grenzen zwischen Proxy und Gateway fließend.) • Tunnel Hierbei wird HTTP benutzt um ganz andere Protokolle zu transportieren, denn ein Tunnel leitet Nachrichten unbesehen und -bearbeitet weiter. (Beispiel: SSH durch Firewalls die kein SSH akzeptieren) HTTP regelt nicht den Daten-Transport an sich. Dazu braucht es ein Transportprotokoll. Dieses ist zwar nicht vorgegeben, wirklich gute Lösungen existieren aber nur für die Zusammenarbeit mit TCP/IP (Transmission Control Protocol/Internet Protocol). HTTP TCP IP Network Interfaces Physical Network Hardware 4 - Application Layer Transport Layer Network Layer Data Link Layer Physical Layer Technische Aspekte Wie bereits erwähnt regelt HTTP das Anfordern und Liefern von Dokumenten. Dies geschieht durch sogenannte Messages, die Clients und Server senden. Eine Message besteht aus: • Start-Line Unterschiedlich, je nach Art der Message. • Header-Fields Header sind optional. (Keiner oder beliebig viele.) Falls vorhanden enthalten sie zusätzliche Informationen (siehe 4.3). • Body Der Body ist optional. (Kein- oder einmal.) Falls vorhanden kann er aus jeder Art Daten bestehen (binär, Text, etc.). 3 Es gibt genau zwei verschiedene Arten von Messages: Request und Response, die in den nächsten beiden Abschnitten behandelt werden. 4.1 Request Die Anfrage eines Clients bei einem Server bezeichnet man als Request. Er ist folgendermaßen aufgebaut: Header-Fields Schema <Methode><Request-URL> <Version> <Header> Body <Entity-Body> Startline Beispiel GET /index.html HTTP/1.1 User-Agent: Mozilla/5.0 [leer] Nach der Startline folgt ein CRLF (CarriageReturn, LineFeed ). Header und Body sind optional. Mehrere Header werden durch CRLF von einander getrennt. Nach den Headern ist eine Leerzeile zwingend, selbst wenn kein Body folgt. Die Methode spezifiziert die Art der Anfrage an den Server: • GET Ist die bei weitem häufigste Anfrage, denn so fordert ein Client eine Datei an. (Dies ist die einzige Methode die HTTP 0.9 beherrschte.) • HEAD Auf diese Methode hin, liefert der Server nur die Start-Line und Header der angegebenen URL, ohne den Body (- also die Datei selbst). Diese Methode ist hauptsächlich beim Cachen von Bedeutung (mehr in Abschnitt 4.4). • POST Hierbei soll der Server Daten verarbeiten, die im Body der RequestMessage übergeben werden. (Beispiel: HTML-Formulardaten) • OPTIONS Erfragt Informationen über den Server und seinen Funktionsumfang. 4 • TRACE Vor allem zum Debuggen geeignet. Man bekommt Weg und Verarbeitung der Request-Message als Response zurück. • PUT Veranlasst den Server eine neue Datei an der angegebenen URL zu erschaffen oder die dort vorhandene zu überschreiben. (Die URL muß natürlich auf dem Server liegen.) Der gewünschte Inhalt der Datei muß im Body gesendet werden. • DELETE Das Gegenstück zu PUT. Die durch die URL spezifizierte Datei auf dem Server wird gelöscht. Es werden nicht alle Methoden von allen Servern unterstützt (vor allem nicht PUT und DELETE). Verpflichtend zu implementieren sind lediglich GET und HEAD. POST ist ebenfalls weit verbreitet. HTTP ist so offen konzipiert, daß über diese Standard-Methoden hinaus, eigene Methoden definiert werden können. Eine zwar reservierte, jedoch nicht offiziell definierte Methode, die breit unterstützt wird, ist CONNECT. Mit dieser Methode werden Tunnel realisiert (siehe Abschnitt 3). Versucht man eine Methode zu benutzen, die der angesprochene Server nicht unterstützt, bekommt man eine entsprechende Statusmeldung zurück (im Normalfall ’501 - Not Implemented’). Mehr zu Responses und Statusmeldungen im Abschnitt 4.2. HTTP benutzt die üblichen URLs (Uniform Resource Locator ) um anzugeben, mit welcher Datei gearbeitet werden soll. http : // < host >:< port > / < path >? < searchpart > | {z } Scheme Wie oben dargestellt gibt der Scheme-Teil einer URL das zu benutzende Protokoll an. In unserem Fall also immer http://. Nach der Host-Angabe gibt es die kaum genutzte Möglichkeit einen Port anzugeben. Geschieht dies nicht, wird bei HTTP der Standard-Port 80 benutzt. 5 Die Versionsnummer von HTTP besteht aus einer Nummer für grundlegende Änderungen und einer für kleinere Updates, die durch einen ’.’ getrennt werden: <major>.<minor> 4.2 Response Die Antwort eines Servers an einen Client bezeichnet man als Response. Er ist folgendermaßen aufgebaut: Header-Fields Schema <Version><Status> <Reason-Phrase> <Header> Body <Entity-Body> Startline Beispiel HTTP/1.1 200 OK Content-Type: text/html <html><head>. . . Jeder Response enthält einen StatusCode, der Auskunft darüber gibt, wie es der Anfrage des Clients erging. Dieser StatusCode ist dreistellig, wobei die erste Ziffer eine Ober-Kategorie kennzeichnet und die letzten beiden Konkreteres angeben. 1** Zwischen-Informationen (selten) 2** Anfrage war erfolgreich 3** Umleitung 4** Clientseitiger Fehler 5** Serverseitiger Fehler Innerhalb der Ober-Kategorien können weitere Codes (auf freien“Zahlen) ” definiert werden. Erhält ein Client einen StatusCode, den er nicht versteht, soll er ihn der Ober-Kategorie entsprechend interpretieren. Die Reason-Phrase wird nicht vom Client verarbeitet, sondern ist nur als Kommentar für Menschen gedacht. Daher sind die Texte nicht vorgegeben, sondern können frei gewählt werden. Hier ist eine Auswahl von StatusCodes und ihren üblichen Reason-Phrases. (Eine vollständige Liste finden Sie in [1] und [3].) 6 Code 100 Reason-Phrase Continue 101 Switching Protocols 200 OK 201 Created 204 No Content 300 Multiple Choices 301 Moved Permanently 304 Not Modified 307 Temporary Redirect 400 401 Bad Request Unauthorized 403 Forbidden 404 Not Found 405 Method Not Allowed 415 Unsupported Media Type Beschreibung Der Client soll fortfahren, den Request zu senden. Der Server ist einverstanden, das Protokoll zu wechseln. Alles hat geklappt. Der Response hängt von der Request-Method ab. Antwort auf erfolgreichen PUTRequest. Wird benutzt um Meta-Informationen zu senden, ohne daß sich das Dokument im Client ändert. Enthält nie einen Body. Die Anfrage kann sich auf mehrere Repräsentationen beziehen. Die angefragte Resource ist dauerhaft umgezogen. Die Datei hat sich, seit einem im Request angegebenen Zeitpunkt, nicht geändert. Hat keinen Body. Die Resource ist nur vorübergehend umgezogen. Der Request war fehlerhaft. Der User hat sich noch nicht, oder nicht korrekt authenifiziert. Zugang verwehrt. Es ist auch keine Authorization möglich. Unter der angegebenen URL wurde nichts gefunden. Die Request-Methode ist fuer die URL nicht zulässig. Das im Body enthaltene Datenformat wird nicht unterstützt. 7 500 Internal Server Error 501 Not Implemented 505 HTTP Version not supported 4.3 Der Request ist in Ordnung, aber der Server arbeitet fehlerhaft. Die Request-Methode ist im Server nicht implementiert. Die HTTP-Version des Requests wird nicht unterstützt. Header Ein Header hat die Form: Schema <name>:<value>[CRLF] Beispiel Date: Sat, 11 Oct 2003 13:50:04 GMT Eine Message kann zwischen Null und unbegrenzt vielen Headern haben. Die Header enthalten Zusatz-Informationen. Es gibt verschiedene Typen: • General Für beide Arten von Messages erlaubt (Beispiel: Date) • Request Kann nur in Anfragen existieren • Response Darf nur in Antworten vorkommen • Entity Informationen über den Body-Inhalt - kann also in beiden MessageTypen stehen • Extension Solche Header sind kein Standard, sondern sind selbst definiert Aus der Flut definierter Header hier nur exemplarisch einige wenige: (Eine vollständige Liste finden Sie in [1] und [3].) 8 Header Date Via Connection Upgrade From Host UA-OS User-Agent Accept Accept-Language If-Modified-Since Authorization Proxy-Authorization Beschreibung General Genaue Zeitangabe, wann die Message generiert wurde Gibt an welchen Weg die Message gegangen ist Client/Server können Wünsche angeben (mehr bei 4.5) Signal, daß Client/Server gern eine höhere Protokoll-Version nutzen würde Request EMail-Adresse des Users, der den Client nutzt Name und Port des Servers an den sich die Anfrage richtet Name und Version des Betriebssystems auf dem der Client läuft Name des Clients, des Programms, das den Request schickt Sagt dem Server welche Dateiformate gesendet werden dürfen Sagt dem Server welche Sprachen gesendet werden dürfen Die Datei soll nur geschickt werden, wenn sie sich seit dem anzugebenden Datum geändert hat Enthält Daten, mit denen sich der Client beim Server ausweist Das gleiche wie ’Authorization’ nur auf einen Proxy bezogen 9 Age Retry-After Server Warning Set-Cookie Allow Location Content-Language Content-Length Content-Type Expires Last-Modified 4.4 Response Alter der Antwort Zeitangabe fuer einen erneuten Versuch, falls die Resource unerreichbar war Name und Version der Server-Software Eine detaillierte Warnung, als Ergänzung zur Reason-Phrase Plaziert eine Datei auf dem Client-Rechner, mit der der Server den Client identifizieren kann Entity Welche Methoden sind mit der Datei zulässig Wo befindet sie sich - kann ein Verweis zu einer neuen URL sein In welcher Sprache ist die Datei verfaßt Die genaue Größe des Bodies Um welchen Datei-Typ handelt es sich ’Haltbarkeitsdatum’ Zeitpunkt der letzten Änderung Caching Ein Proxy Cache Server behält Kopien der Daten, die ihn passieren. Dadurch kann er bei einer erneuten Anforderung diese Daten schneller liefern, als wenn er sie wieder beim Original-Server abholen müßte. Caching hat folgende Vorteile: • Es wird weniger Bandbreite beansprucht. • Der Original-Server muss weniger Anfragen bearbeiten. • Kürzere Übertragungswege, daher Zeitersparnis. Dieses einfache Konzept ist der Praxis sehr ausgeklügelt wenn es darum geht, welche Dateien gespeichert werden sollen (z.B. nach Häufigkeit) oder wann sie neu gecacht werden sollen (die Datei auf dem Ursprungs-Server kann sich ändern). Schließlich sollen möglichst viele und möglichst aktuelle Kopien im Cache sein. Eine neu gecachte Datei gilt zunächst als frisch“. In dieser Zeit liefert der ” 10 Proxy Cache auf Anfrage seine Kopie aus. Ist dieser Zustand abgelaufen, fragt der Cache mit der HEAD-Methode beim Server nach, ob sich die Datei seit dem Speichern verändert hat (If-Modified-Since-Header). Nur falls dies der Fall ist, wird die Datei neu gesendet. Andernfalls gilt die alte Kopie wieder als frisch“. ” [Heutzutage haben auch alle gängigen WebBrowser einen eingebauten Cache auf der Festplatte.] 4.5 Connection-Management Oft zieht eine Anfrage an einen Server weitere nach sich. Beispielsweise, wenn man innerhalb eines Web-Auftritts mehrere Links besucht oder wenn eine HTML-Seite geladen wird, die viele Elemente (Bilder, Movies, etc.) einbindet. (Diese Elemente müssen zwar nicht auf demselben Server liegen, wie die Seite selbst, es ist jedoch wahrscheinlich.) Solche Anfrage-Serien wurden nicht immer effizient behandelt. Hier die verschiedenen Arten des Connection-Management von HTTP im Laufe seiner Entwicklung: • Seriell Einfach und langsam. Jede Verbindung wird nach Beendigung eines Ladevorgangs geschlossen. Dann erst wird eine neue aufgemacht um das nächste Element zu laden, usw. • Parallel Es können mehrere TCP-Verbindungen nebeneinander aufgemacht werden. [Deren Anzahl ist oft auf vier parallele Connections begrenzt.] • Keep-Alive Eine inzwischen veraltete Technik aus HTTP 1.0+. Arbeitet prinzipiell wie die serielle Transaktion, allerdings wird durch einen speziellen Header signalisiert, dass die Verbindung nicht geschlossen werden soll. (Dies muß bei jeder Message gesendet werden.) Dennoch können beide Parteien die Verbindung jederzeit beenden. Leider gibt es große Probleme im Zusammenspiel mit Proxies. • Persistent Gab es schon bei HTTP 1.0+ und ist in HTTP 1.1 Standard. Funktioniert im Prinzip wie ’Keep-Alive’. Allerdings ist die Persistent Connec11 tion die Regel: man muß extra angeben, wenn die Verbindung geschlossen werden soll. Dadurch treten kaum noch Schwierigkeiten mit Proxies mehr auf. Diese Technik wird oft mit parallelen Verbindungen kombiniert. • Pipelined Bei dieser Strategie können Latenzzeiten im Netzwerk ausgenutzt werden, indem mehrere Requests in Serie an den Server geschickt werden, die nacheinander abgearbeitet werden. Dies kann bei nicht idempotenten Methoden wie POST zu Problemen führen. [Ein Request ist idempotent, wenn es keine Rolle spielt, wie oft er ausgeführt wird. (Beispiel: GET)] 4.6 SHTTP Obwohl HTTP ein paar sicherheitsrelevante Features enthält (u.a. besteht die Möglichkeit zur Authentifizierung) ist es für vertrauliche Datentransfers (z.B. Bankgeschäfte) nicht geeignet. Deshalb kombiniert SHTTP (das S steht für Secure) HTTP mit einem kryptografischen Protokoll. Dabei werden alle Messages sowohl vom Client als auch vom Server, vor dem Versenden verschlüsselt. Das kryptografische Protokoll ist frei wählbar. HTTP SSL/TLS TCP IP Network Interfaces Physical Network Hardware - Application Layer Security Layer Transport Layer Network Layer Data Link Layer Physical Layer In der Praxis benutzt man meist https, eine Entwicklung von Netscape. Diese Implementierung von SHTTP verwendet SSL (Secure Socket Layer ) oder dessen Nachfolger TLS (Transport Layer Security) zum Verschlüsseln. Das URL-Scheme ändert sich von http:// zu https://. Der Standard-Port hierfür ist 443. Nach Etablierung der TCP-Verbindung tauschen Client und Server aufgrund des Verschlüsselungsprotokolls zunächst Sicherheits-Daten aus, danach erst erfolgt der eigentliche Datentransfer. Das ganze System stützt sich auf Server12 Zertifikate, mit denen sich ein Server Clients gegenüber identifiziert. 5 Zusammenfassung Seit Anfang der Neunziger Jahre haben HTTP und das Web eine rasant steigende Nutzung erfahren. Dabei ist HTTP immer wieder an die sich wandelnden Bedürfnisse angepaßt worden. Am Grundkonzept der Messages, mit Meta-Informationen in den Headern und der Fracht im Body, hat sich jedoch nichts geändert. Trotz der Erfolgsstory wird HTTP nicht weiterentwickelt. 6 Ausblick Die damalige HTTP-NG-Arbeitsgruppe gebar die Idee von XMLP (EXtensible Markup Language Protocol ). Es soll eine standardisierte Schnittstelle zwischen verschiedenen Programmen bieten, über die Informationen im XML-Format ausgetauscht werden können. So etwas ähnliches existiert schon unter dem Namen WebServices. Dies bezeichnet einen losen Verbund von Absprachen und Protokollen, der es schon heute erlaubt anwendungsübergreifend Daten auszutauschen. WebServices setzen dazu vor allem auf SOAP (Simple Object Access Protocol ). Dieses Protokoll regelt wie man XML-Informationen zu Messages hinzufügen kann... HTTP-Messages versteht sich. 13 Literatur [1] RFC RFC RFC RFC 1945 2068 2616 2817 — — — — HTTP/1.0 HTTP/1.1 HTTP/1.1 Upgrading to TLS Within HTTP/1.1 Alle RFCs sind online verfügbar unter: http://www.rfc-editor.de Die RFCs sind relativ trocken, dafür aber sehr detailliert. [2] Unix Unleashed von Robin Burk erschienen 1998 bei SAMS Publishing Enthält einen gut geschriebenen Kurzüberblick, der alle wichtigen Themen und sogar ein bißchen geschichtlichen Hintergrund behandelt. [3] HTTP - The Definite Guide von David Gourley, Brain Totty u.a. erschienen 2002 bei O’Reilly & Associates Sehr ausführliches, praxisnahes Buch das nur ein paar theoretische Fragen offenläßt. [4] http://www.w3c.org/ Hier gibt es Informationen zu fast jedem internetrelevanten Standard (auch denen der Zukunft). 14