Um Dokumente von Webservern anzufordern, verwenden Browser das HTTP-Protokoll. Möglicherweise kennen Sie diesen Namen aus Ihrer Adressleiste (möglicherweise ist er jetzt ausgeblendet. Wenn Sie jedoch auf die Adressleiste klicken, die URL kopieren und in einen Texteditor einfügen, wird dies http://
am Anfang angezeigt ). HTTP ist ein einfaches textbasiertes Protokoll. Das funktioniert so:
Zunächst stellt Ihr Browser eine Verbindung zum Server der Website her und sendet eine URL des herunterzuladenden Dokuments (auch Webseiten sind Dokumente) sowie einige Details zum Browser selbst ( User-Agent usw.). Um beispielsweise die Hauptseite auf der SuperUser-Site zu laden http://superuser.com/
, sendet mein Browser eine Anfrage, die folgendermaßen aussieht:
GET / HTTP/1.1
Host: superuser.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.0 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: [removed for security]
DNT: 1
If-Modified-Since: Tue, 09 Jul 2013 07:14:17 GMT
Die erste Zeile gibt an, welches Dokument der Server zurückgeben soll. Die anderen Zeilen heißen Überschriften; sie sehen so aus:
Header name: Header value
Diese Zeilen senden zusätzliche Informationen, anhand derer der Server entscheiden kann, was zu tun ist.
Wenn alles in Ordnung ist, sendet der Server das angeforderte Dokument. Die Antwort beginnt mit einer Statusmeldung, gefolgt von einigen Kopfzeilen (mit Details zum Dokument) und schließlich, wenn alles in Ordnung ist, dem Inhalt des Dokuments. So sieht die Antwort des SuperUser-Servers auf meine Anfrage aus:
HTTP/1.1 200 OK
Cache-Control: public, max-age=60
Content-Type: text/html; charset=utf-8
Expires: Tue, 09 Jul 2013 07:27:20 GMT
Last-Modified: Tue, 09 Jul 2013 07:26:20 GMT
Vary: *
X-Frame-Options: SAMEORIGIN
Date: Tue, 09 Jul 2013 07:26:19 GMT
Content-Length: 139672
<!DOCTYPE html>
<html>
[...snip...]
</html>
Nach der letzten Zeile schließt der SuperUser-Server die Verbindung.
Die erste Zeile ( HTTP/1.1 200 OK
) enthält den Antwortcode , in diesem Fall ist es 200 OK
. Dies bedeutet, dass der Server entschieden hat, dass er ein Dokument wie angefordert zurückgeben kann, und verspricht, dass der folgende Inhalt ein solches Dokument sein wird. Ist dies nicht der Fall, handelt es sich bei dem Code um einen anderen Code, und er gibt einen Hinweis darauf, warum der Server ein Dokument nicht nur als Antwort zurückgibt. Wenn er beispielsweise das angeforderte Dokument nicht findet, soll er es zurückgeben 404 Not Found
, und wenn Sie nicht auf den fraglichen Inhalt zugreifen dürfen, soll er zurückkehren 403 Forbidden
.
Nach dieser ersten Statuszeile folgen die Antwortheader. Sie bieten weitere Informationen zum zurückgegebenen Inhalt, z Content-type
.
Weiter ist eine leere Zeile. Es signalisiert, dass keine Antwortheader mehr folgen. Alles, was über diese Zeile hinausgeht, ist der Inhalt des angeforderten Dokuments. Im obigen Beispiel <!DOCTYPE html>
ist dies die erste Zeile der SuperUser-Homepage (ein HTML-Dokument). Wenn ich ein Dokument zum Herunterladen anfordere, handelt es sich wahrscheinlich um einige Kauderwelschzeichen, da die meisten Dokumentformate ohne vorherige Verarbeitung nicht lesbar sind.
Zurück zu den Überschriften. Das interessanteste für uns ist das letzte Content-Length
. Es teilt dem Browser mit, wie viele Datenbytes nach der Leerzeile erwartet werden sollen. Im Grunde genommen handelt es sich also um die in Bytes ausgedrückte Dokumentgröße. Dieser Header ist nicht obligatorisch und kann vom Server weggelassen werden. Manchmal kann die Dokumentgröße nicht vorhergesagt werden (zum Beispiel, wenn das Dokument im laufenden Betrieb erstellt wird), manchmal wird es von faulen Programmierern nicht berücksichtigt (was bei Websites zum Herunterladen von Treibern häufig vorkommt), manchmal werden Websites von Neulingen erstellt, die es nicht wissen von einem solchen Header.
Egal aus welchem Grund, der Header kann fehlen. In diesem Fall weiß der Browser nicht, wie viele Daten der Server senden wird, und zeigt daher die Dokumentgröße als unbekannt an , während er darauf wartet, dass der Server die Verbindung schließt. Und das ist der Grund für unbekannte Dokumentengrößen.