Hallo Gerald,
g.vogt hat geschrieben:ich weiß (mal wieder), dass ich nichts weiß
Aber ich bin wie immer furchtbar neugierig (und faul noch dazu). Kannst du das obige für solche wie mich übersetzen?
keine Sorge, das ist keine Magie, sondern simple Kommunikation
Wie bei vielen anderen Protokollen besteht die Kommunikation bei HTTP aus Headern und Bodies, d.h. der Client sendet einen Request-Header und ggf. einen Request-Body, worauf der Server mit einem Response-Header und ggf. einem Response-Body antwortet.
Der Request-Header enthält alle Meta-Informationen, die für eine Anforderung notwendig sind oder diese präzisieren:
Code: Alles auswählen
GET /nuforum/images/avatars/175978136241755e84bcc64.png HTTP/1.1
Host: www.nubert-forum.de
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.8,de-de;q=0.5,de;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Die erste Zeile fordert die Ressource "/nuforum/images/avatars/175978136241755e84bcc64.png" über HTTP 1.1 (aktuelle Version von HTTP) an, "Host" enthält den Servernamen, für den diese Anfrage bestimmt ist usw.
Die Antwort auf diese Anfrage besteht aus dem Header, der wie folgt aussieht, und dem Body, der die eigentliche Ressource (in diesem Fall mein Avatar) enthält:
Code: Alles auswählen
HTTP/1.x 200 OK
Date: Sat, 05 Mar 2005 18:46:53 GMT
Server: Apache/1.3.27 (Linux/SuSE) FrontPage/4.0.4.3 PHP/4.3.10 mod_perl/1.27 mod_ssl/2.8.12 OpenSSL/0.9.6i
Last-Modified: Mon, 06 Dec 2004 18:49:57 GMT
Etag: "f5cd-b8b-41b4a9d5"
Accept-Ranges: bytes
Content-Length: 2955
Keep-Alive: timeout=3, max=5
Connection: Keep-Alive
Content-Type: image/png
In der ersten Zeile wird der Status der Anfrage übergeben (200 OK), die beiden folgenden Zeilen enthalten Zeitpunkt der Antwort sowie die Identifizierung der Server-Software.
Interessant sind die beiden darauf folgenden Zeilen:
Last-Modified enthält den Zeitpunkt, an dem die angeforderte Ressource zuletzt verändert wurde, Etag enthält eine Zeichenkette, anhand der die angeforderte Ressource identifiziert werden kann.
Mit diesen beiden Informationen ist der Browser in der Lage bei erneuten Anfragen dem Server mitzuteilen, daß er diese Ressource schon kennt und nur dann eine erneute Antwort wünscht, wenn sich die Ressource geändert hat (Etag stimmt nicht mehr überein) oder verändert wurde (Last-Modified ist jünger):
Code: Alles auswählen
GET /nuforum/images/avatars/175978136241755e84bcc64.png HTTP/1.1
Host: www.nubert-forum.de
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.8,de-de;q=0.5,de;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
If-Modified-Since: Mon, 06 Dec 2004 18:49:57 GMT
If-None-Match: "f5cd-b8b-41b4a9d5"
Die ersten neun Zeilen der erneuten Anfrage sind identisch mit denen der initialen Anfrage, hinzugekommen sind die letzten beiden Zeilen:
Der Browser hat geschrieben:If-Modified-Since: Mon, 06 Dec 2004 18:49:57 GMT
Mit diesem Header weist der Browser den Webserver an nur dann die Ressource auszuliefern, wenn sie seit dem 6. Dezember 2004 18:49:57 GMT verändert wurde, andernfalls soll nur eine Bestätigung gesendet werden, daß sich nichts verändert hat.
Der Browser hat geschrieben:If-None-Match: "f5cd-b8b-41b4a9d5"
Ähnlich verfährt der Browser mit dem Etag, den er bei der initialen Anfrage als Teil der Antwort erhalten hat. Der Webserver wird angewiesen nur dann die Ressource zu senden, wenn der Etag von der Zeichenkette "f5cd-b8b-41b4a9d5" abweicht, andernfalls soll er wiederum nur eine Bestätigung senden.
Als Antwort auf die zweite Anfrage sendet der Webserver folgenden Header zurück:
Code: Alles auswählen
HTTP/1.x 304 Not Modified
Date: Sat, 05 Mar 2005 18:54:31 GMT
Server: Apache/1.3.27 (Linux/SuSE) FrontPage/4.0.4.3 PHP/4.3.10 mod_perl/1.27 mod_ssl/2.8.12 OpenSSL/0.9.6i
Connection: Keep-Alive
Keep-Alive: timeout=3, max=5
Etag: "f5cd-b8b-41b4a9d5"
Wie man in der ersten Zeile sieht, hat sich die Statusmeldung von "200 OK" in "304 Not Modified" verändert, auch die Länge des Headers hat sich deutlich verkürzt, zudem wird bei dieser Antwort kein Body und somit auch kein Bild zurückgesendet.
Der Webserver ist der Aufforderung des Browsers das Datum für die letzte Änderung sowie den Inhalt der Etag-Zeichenkette zu vergleichen nachgekommen und hat dabei festgestellt, daß sich nichts an dieser Ressource verändert hat (d.h. sie wurde nicht durch ein anderes Bild ersetzt und auch nicht mit einem neuen Zeitstempel versehen), ergo begnügt er sich damit einen kurzen Status zu senden.
greetings, Keita