Zum Hauptinhalt springen

14. Range Requests (Bereichsanfragen)

Clients stoßen oft auf unterbrochene Übertragungen oder müssen nur einen Teil einer großen Darstellung erhalten. Bereichsanfragen sind eine optionale Funktion, die es Clients ermöglicht, einen oder mehrere Teilbereiche der ausgewählten Darstellung anzufordern, anstatt die gesamte Darstellung.

Der Bereichsanfrage-Mechanismus ist in mehreren verschiedenen Szenarien nützlich:

  • Teilweise Downloads großer Dateien können in mehrere gleichzeitige Anfragen aufgeteilt werden, wodurch die Gesamtabrufgeschwindigkeit erhöht wird
  • Unterbrochene Übertragungen können vom Unterbrechungspunkt aus fortgesetzt werden, anstatt neu zu starten
  • Einige Medientypen erlauben inkrementelles Rendering oder Wiedergabe, und Benutzeragenten können mit der Verarbeitung von Daten beginnen, sobald sie empfangen werden

Server sind nicht verpflichtet, Bereichsanfragen zu unterstützen. Ursprungsserver SOLLTEN jedoch Bereichsanfragen unterstützen, da Bereichsanfragen die Netzwerknutzung reduzieren und die Dienstresponsivität verbessern können.

14.1. Range Units (Bereichseinheiten)

Darstellungen können auf verschiedene Weise in Teilbereiche aufgeteilt werden. Eine Bereichseinheit definiert, wie Darstellungsdaten aufgeteilt werden.

range-unit       = token

Alle Bereichseinheitennamen unterscheiden nicht zwischen Groß- und Kleinschreibung und SOLLTEN im HTTP Range Unit Registry registriert werden.

14.1.1. Range Specifiers (Bereichsspezifizierer)

Ein Bereichsspezifizierer definiert einen oder mehrere Teilbereiche von Darstellungsdaten.

range-spec       = range-unit "=" range-set
range-set = 1#range-spec-value
range-spec-value = int-range / suffix-range / other-range

Bereichseinheiten ermöglichen es Clients anzugeben, welche Art von Bereich sie anfordern.

14.1.2. Byte Ranges (Bytebereiche)

Die Bereichseinheit "bytes" ist für HTTP definiert und repräsentiert Teilbereiche einer Oktetsequenz (d.h. Bytebereiche).

byte-ranges-specifier = bytes-unit "=" byte-range-set
byte-range-set = 1#byte-range-spec
byte-range-spec = first-byte-pos "-" [ last-byte-pos ]
/ suffix-byte-range-spec
suffix-byte-range-spec = "-" suffix-length

first-byte-pos = 1*DIGIT
last-byte-pos = 1*DIGIT
suffix-length = 1*DIGIT
bytes-unit = "bytes"

Der first-byte-pos-Wert gibt den Byte-Offset des ersten Bytes im Bereich an. Der last-byte-pos-Wert gibt den Byte-Offset des letzten Bytes im Bereich an; das heißt, die angegebenen Byte-Positionen sind einschließlich. Byte-Offsets beginnen bei Null.

Beispiele:

  • bytes=0-499 repräsentiert die ersten 500 Bytes
  • bytes=500-999 repräsentiert die zweiten 500 Bytes
  • bytes=-500 repräsentiert die letzten 500 Bytes
  • bytes=500- repräsentiert alle Bytes ab Byte 500
  • bytes=0-0,-1 repräsentiert das erste und letzte Byte

14.2. Range

Das "Range"-Header-Feld wird verwendet, um einen oder mehrere Teilbereiche von Darstellungsdaten anzufordern.

Range = range-unit "=" range-set

Ein Server KANN das Range-Header-Feld ignorieren. Ursprungsserver und Zwischencaches SOLLTEN jedoch Bytebereiche unterstützen, wenn möglich, da Range-Unterstützung eine effiziente Wiederherstellung von teilweise fehlgeschlagenen Übertragungen und teilweisen Abruf großer Darstellungen ermöglicht.

Ein Server MUSS ein Range-Header-Feld ignorieren, das mit einer anderen Anfragemethode als GET empfangen wurde.

Ein Ursprungsserver, der das Range-Header-Feld unterstützt, MUSS, wenn alle Vorbedingungen wahr sind:

  1. Das Range-Header-Feld ignorieren, wenn es eine Bereichseinheit enthält, die er nicht unterstützt
  2. Einen 416 (Range Not Satisfiable)-Statuscode zurückgeben, wenn das Range-Header-Feld syntaktisch ungültig ist
  3. Eine 206 (Partial Content)-Antwort mit einer oder mehreren Teildarstellungen zurückgeben, wenn das Range-Header-Feld einen erfüllbaren Satz von Bytebereichen enthält

Beispielanfrage:

GET /document HTTP/1.1
Host: www.example.com
Range: bytes=0-1023

14.3. Accept-Ranges

Das "Accept-Ranges"-Header-Feld ermöglicht es einem Server anzugeben, dass er Bereichsanfragen für die Zielressource unterstützt.

Accept-Ranges = acceptable-ranges
acceptable-ranges = 1#range-unit / "none"

Ein Ursprungsserver, der Bereichsanfragen für eine bestimmte Zielressource akzeptiert, SOLLTE ein Accept-Ranges-Header-Feld senden, um anzugeben, welche Bereichseinheiten unterstützt werden. Ein Client KANN Bereichsanfragen generieren, ohne dieses Header-Feld zu empfangen.

Beispiele:

Accept-Ranges: bytes
Accept-Ranges: none

Der Wert "none" zeigt an, dass keine Bereichseinheiten akzeptiert werden, was bedeutet, dass der Server keine Bereichsanfragen für diese Ressource unterstützt.

14.4. Content-Range

Das "Content-Range"-Header-Feld wird in einer einteiligen 206 (Partial Content)-Antwort gesendet, um den Bytebereich der enthaltenen Teildarstellung anzugeben, oder in einer 416 (Range Not Satisfiable)-Antwort, um Informationen über die ausgewählte Darstellung bereitzustellen.

Content-Range       = range-unit SP
( range-resp / unsatisfied-range )

range-resp = byte-content-range
/ other-range-resp
byte-content-range = bytes-unit SP
( byte-range-resp / unsatisfied-range )

byte-range-resp = first-byte-pos "-" last-byte-pos
"/" ( complete-length / "*" )
complete-length = 1*DIGIT

unsatisfied-range = "*/" complete-length

other-range-resp = *CHAR

Beispiele:

Content-Range: bytes 0-1023/5000
Content-Range: bytes 1024-2047/5000
Content-Range: bytes */5000

Das erste Beispiel zeigt an, dass die ersten 1024 Bytes einer vollständigen Darstellung (mit einer Länge von 5000 Bytes) übertragen werden. Das dritte Beispiel zeigt an, dass eine Bereichsanfrage nicht erfüllt werden konnte, da die vollständige Länge der ausgewählten Darstellung 5000 Bytes beträgt.

14.5. Partial PUT (Teilweises PUT)

Eine teilweise PUT-Anfrage ist keine Bereichsanfrage, verwendet jedoch denselben Mechanismus wie Bereichsanfragen, um den übertragenen Inhalt zu beschreiben. Ein Client kann ein teilweises PUT senden, indem er ein Content-Range-Header-Feld in die PUT-Anfrage einfügt.

Teilweises PUT wird jedoch in der Praxis selten verwendet, weil:

  1. Es erfordert, dass der Client den aktuellen Zustand der Ressource kennt
  2. Es ist anfällig für Race Conditions
  3. Die meisten Ursprungsserver es nicht unterstützen

Daher SOLLTEN Clients kein teilweises PUT verwenden, es sei denn, sie sind sicher, dass der Zielserver es unterstützt.

14.6. Media Type multipart/byteranges (Medientyp multipart/byteranges)

Beim Senden mehrerer Bereiche SOLLTE ein Server den Medientyp multipart/byteranges verwenden.

multipart/byteranges

Jeder Body-Teil dieses Medientyps MUSS Folgendes enthalten:

  • Ein Content-Type-Header-Feld, das den Medientyp der in diesem Body-Teil enthaltenen Darstellung angibt
  • Ein Content-Range-Header-Feld, das den enthaltenen Bereich angibt

Beispielantwort:

HTTP/1.1 206 Partial Content
Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES

--THIS_STRING_SEPARATES
Content-Type: text/html
Content-Range: bytes 0-100/1234

[erste 101 Bytes]
--THIS_STRING_SEPARATES
Content-Type: text/html
Content-Range: bytes 500-999/1234

[Bytes 500-999]
--THIS_STRING_SEPARATES--

Wenn ein Client mehrere nicht zusammenhängende Bereiche anfordert, SOLLTE ein Server nur dann eine mehrteilige Antwort zurückgeben, wenn:

  1. Die Bereiche sich nicht überlappen
  2. Die Reihenfolge der Bereiche mit ihrer Reihenfolge in der Darstellung übereinstimmt

Andernfalls SOLLTE der Server die gesamte Darstellung zurückgeben oder überlappende Bereiche zusammenführen.