Christian Seiler: HTTP-Datenaustausch

Beitrag lesen

Hallo Tom,

"Für den Fall, dass die Anzahl der zu übertragenden Bytes nicht feststeht, beendet der Server die Verbindung"

Nun hab' ich aber auch noch im Kopf, dass es sich bei HTTP um ein verbindungs- und zustandsloses Protokoll handeln soll.

Ja.

Hab ich mir da 'was Falsches gemerkt?

Nein. Jetzt kommt das große 'Aber':

Wie wird eine Resource über HTTP ausgeliefert?

Einfachstes Beispiel:

1. Der Client öffnet eine TCP-Verbindung zum Server.
2. Der Client fordert die Resource an.
3. Der Server liefert diese Resource an den Client.
4. Der Server schließt die Verbindung.

'Verbindung' ist hier eine Ebene tiefer: Nämlich auf TCP-Ebene. Auf HTTP-Ebene gibt es tatsächlich keine Verbindungen. Auf TCP-Ebene dagegen schon.

Wenn der Server die Dateigrößen genau kennt ist auch folgende Möglich:

1. Der Client öffnet eine TCP-Verbindung zum Server.
2. Der Client fordert die Resource an.
3. Der Server liefert diese Resource an den Client mitsamt der Dateigröße.
4. Der Client fordert eine weitere Resource an.
5. Der Server liefert diese weitere Resource an den Client mitsamt der Dateigröße.
6. Wdh. 4-5 ein paar Mal
7. Der Client sendet bei der letzen Resource die Anfrage mit, dass die Verbindung geschlossen bei der nächsten Resource werden soll.
8. Der Server liefert die letzte Resource aus.
9. Der Server schließt die Verbindung.

Schritt 7 ist optional, der Server kann auch 'von alleine' (per Konfiguration) angewiesen werden, pro TCP-Verbindung maximal n Resourcen auszuliefern. Der Server gibt bei jeder Resource mit an, ob er vorhat, die Verbindung daraufhin zu schließen. (Connection: close als Response-Header)

In HTTP/1.1 gibt es außerdem noch eine bestimmte Kodierung: 'Transfer-Encoding: chunked'. Wenn der Server diesen Response-Header mitsendet, wird die Datei in lauter kleine Teile aufgeteilt. Der Server sendet dann ein Byte, das die Menge an Bytes enthält, die als nächstes folgen wird. Danach kommt diese Menge an Bytes. Danach kommt wieder so ein Längen-Byte, gefolgt von den Bytes selbst. Wenn die Datei zuende ist, wird als Längen-Byte 0 gesendet. So kann 'Connection: keep-alive' (d.h. TCP-Verbindung wird für weitere Resourcen offen gehalten) auch funktionieren, wenn die Größe der Resource dem Server unbekannt ist (serverseitige Scripte).

Viele Grüße,
Christian

--
Losung und Lehrtext für Mittwoch, 29. Oktober 2003:
Er hat ein Gedächtnis gestiftet seiner Wunder, der gnädige und barmherzige Herr. (Psalm 111,4)
Jesus nahm das Brot, dankte und brach's und gab's ihnen und sprach: Das ist mein Leib, der für euch gegeben wird; das tut zu meinem Gedächtnis. (Lukas 22,19)
(http://www.losungen.de/heute.php3, i.V. Götz)