Content-Length
Der Content-Length
Header bestimmt die Byte-Länge des Request/Response-Körper. Wenn Sie den Header Content-Length
nicht angeben, fügen HTTP-Server implizit einen Header Transfer-Encoding: chunked
hinzu. Die Header Content-Length
und Transfer-Encoding
sollten nicht zusammen verwendet werden. Der Empfänger wird keine Ahnung haben, wie lang der Körper ist und kann die Download-Zeit nicht abschätzen. Wenn Sie einen Header Content-Length
hinzufügen, stellen Sie sicher, dass es den gesamten Körper in Bytes entspricht, wenn es falsch ist, ist das Verhalten von Empfängern nicht definiert.
Der Header Content-Length
erlaubt kein Streaming, ist aber für große Binärdateien nützlich, in denen Sie die teilweise Bereitstellung von Inhalten unterstützen möchten. Dies bedeutet im Wesentlichen wiederaufnehmbare Downloads, pausierte Downloads, partielle Downloads und multi-homed Downloads. Dies erfordert die Verwendung eines zusätzlichen Headers mit der Bezeichnung Range
. Diese Technik wird Byte serving genannt.
Transfer-Encoding
Die Verwendung von Transfer-Encoding: chunked
ist, was in einer einzigen Anfrage oder Antwort ermöglicht Streaming. Dies bedeutet, dass die Daten chunked übertragen werden und keinen Einfluss auf die Darstellung des Inhalts haben.
Offiziell soll ein HTTP-Client eine Anfrage mit einem Header-Feld TE
senden, das angibt, welche Arten von Transfercodierungen der Client zu akzeptieren bereit ist. Dies wird nicht immer gesendet, jedoch gehen die meisten Server davon aus, dass Clients chunked
Kodierungen verarbeiten können.
Die chunked
Übertragungscodierung verwendet besser persistente TCP-Verbindungen, von denen HTTP 1.1 standardmäßig als true angenommen wird.
Content-Encoding
Es ist auch möglich, Chunked oder nicht Chunked Daten zu komprimieren. Dies geschieht praktisch über den Header .
Beachten Sie, dass die Content-Length
gleich der Länge des Körpers nach der ist. Das heißt, wenn Sie Ihre Antwort gezippt haben, erfolgt die Längenberechnung nach der Komprimierung. Sie müssen in der Lage sein, den gesamten Körper in den Speicher zu laden, wenn Sie die Länge berechnen möchten (es sei denn, Sie haben diese Informationen an anderer Stelle).
Beim Streaming mit Chunked-Encoding muss der Komprimierungsalgorithmus auch die Online-Verarbeitung unterstützen. Glücklicherweise unterstützt gzip die Stream-Komprimierung. Ich glaube, dass der Inhalt zuerst komprimiert und dann in Stücke geschnitten wird. Auf diese Weise werden die Chunks empfangen und dann dekomprimiert, um den echten Inhalt zu erhalten. Wenn es umgekehrt wäre, würden Sie den komprimierten Stream bekommen, und dann würde uns das Dekomprimieren in Stücke verwandeln. Was keinen Sinn ergibt.
Eine typische komprimierte Strom Antwort kann diesen Header hat:
Content-Type: text/html
Content-Encoding: gzip
Transfer-Encoding: chunked
semantisch Verwendung von Content-Encoding
zeigt einen Codierschema „Ende an Ende“, das die dekodieren nur den letzten Client oder endgültige Servermittel sollte Inhalt. Proxies in der Mitte sollen den Inhalt nicht dekodieren.
Wenn Sie Proxies in der Mitte zulassen möchten, um den Inhalt zu dekodieren, ist der korrekte Header tatsächlich der Transfer-Encoding
Header. Wenn die HTTP-Anfrage einen TE: gzip chunked
Header besitzt, ist es zulässig, mit Transfer-Encoding: gzip chunked
zu antworten.
Dies wird jedoch sehr selten unterstützt. Sie sollten also nur für Ihre Komprimierung verwenden.
Chunked vs Store & Forward
Ist es selbstverständlich, dass Ihr Inhalt ist statisch und seine Länge a priori bekannt ist? Wenn nicht, wäre Chunked viel schneller für große Dateien. –