Passa al contenuto principale

RFC 7233 - HTTP/1.1: Richieste di intervallo (Range Requests)

  • Stato: Proposed Standard
  • Pubblicato: June 2014
  • Stream: IETF
  • Sostituisce: RFC2616
  • Sostituito da: RFC9110
  • Errata: Nessun errata

Informazioni sul documento

  • Numero RFC: 7233
  • Titolo: Hypertext Transfer Protocol (HTTP/1.1): Range Requests
  • Titolo (Italiano): Protocollo di trasferimento ipertesto (HTTP/1.1): Richieste di intervallo
  • Data di pubblicazione: Giugno 2014
  • Autori: R. Fielding (Adobe), Y. Lafon (W3C), J. Reschke (greenbytes)
  • Sostituisce il documento: RFC 2616
  • Stato: Standards Track (Percorso degli standard)

Sommario

Le richieste di intervallo consentono ai client HTTP di richiedere uno o più sottoinsiemi di una risorsa, anziché l'intera rappresentazione. Questo è fondamentale per la ripresa di download interrotti, download multi-thread e riproduzione in streaming di contenuti multimediali.

Concetti fondamentali

Cosa sono le richieste di intervallo?

Le richieste di intervallo consentono al client di dire: "Ho bisogno solo di una parte di questa risorsa".

Risorsa completa: [================100MB================]

Richiesta di intervallo: [====10MB====]

Principali casi d'uso

  1. Ripresa del download: Continuare dopo un'interruzione
  2. Download segmentato: Download paralleli multi-thread
  3. Navigazione video: Saltare a una posizione specifica del video
  4. Anteprima PDF: Scaricare solo le prime pagine
  5. Ottimizzazione file di grandi dimensioni: Caricare contenuti su richiesta

Campo intestazione Range

Sintassi di base

Range: bytes=<start>-<end>

Esempi

Intervallo singolo:

GET /video.mp4 HTTP/1.1
Host: example.com
Range: bytes=0-1023

Richiede i primi 1024 byte.

Intervalli multipli:

GET /document.pdf HTTP/1.1
Host: example.com
Range: bytes=0-499, 1000-1499, 5000-5999

Richiede tre intervalli non contigui.

Intervalli aperti:

Range: bytes=1000-          # Da 1000 alla fine
Range: bytes=-500 # Ultimi 500 byte
Range: bytes=0- # Dall'inizio alla fine (equivalente a richiesta completa)

Intestazione Accept-Ranges

Il server utilizza questa intestazione per indicare se le richieste di intervallo sono supportate.

Richieste di intervallo supportate:

HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Length: 10485760

Richieste di intervallo non supportate:

HTTP/1.1 200 OK
Accept-Ranges: none
Content-Length: 10485760

Risposta 206 Partial Content

Le richieste di intervallo riuscite restituiscono il codice di stato 206.

Risposta intervallo singolo

GET /video.mp4 HTTP/1.1
Range: bytes=1000-1999

HTTP/1.1 206 Partial Content
Content-Range: bytes 1000-1999/10485760
Content-Length: 1000
Content-Type: video/mp4

[1000 byte di dati...]

Intestazione Content-Range

Formato:

Content-Range: bytes <start>-<end>/<total>

Esempio:

Content-Range: bytes 1000-1999/10485760
^^^^^ ^^^^^ ^^^^^^^^
Inizio Fine Dimensione totale

Risposta multi-intervallo

Utilizza il tipo di media multipart/byteranges:

GET /file.txt HTTP/1.1
Range: bytes=0-50, 100-150

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

--THIS_STRING_SEPARATES
Content-Type: text/plain
Content-Range: bytes 0-50/1270

[Primi 51 byte...]
--THIS_STRING_SEPARATES
Content-Type: text/plain
Content-Range: bytes 100-150/1270

[51 byte centrali...]
--THIS_STRING_SEPARATES--

416 Range Not Satisfiable

Restituito quando l'intervallo richiesto non è valido.

GET /file.txt HTTP/1.1
Range: bytes=9999-10999

HTTP/1.1 416 Range Not Satisfiable
Content-Range: bytes */1234
Content-Length: 0

Cause comuni:

  • Posizione iniziale supera la dimensione del file
  • Posizione iniziale maggiore della posizione finale
  • Errore di formato

Richiesta di intervallo condizionale If-Range

Combina richieste condizionali e richieste di intervallo per assicurarsi che la risorsa non sia stata modificata.

GET /video.mp4 HTTP/1.1
Range: bytes=1000000-
If-Range: "etag-abc123"

Risorsa invariata (ETag corrisponde):

HTTP/1.1 206 Partial Content
ETag: "etag-abc123"
Content-Range: bytes 1000000-10485759/10485760

Risorsa modificata (ETag non corrisponde):

HTTP/1.1 200 OK
ETag: "etag-xyz789"
Content-Length: 10485760

[Restituire nuova risorsa completa...]

Scenari di applicazione pratica

Scenario 1: Ripresa del download

Primo download (interrotto):
→ GET /large-file.zip HTTP/1.1
← HTTP/1.1 200 OK
Content-Length: 104857600
ETag: "file-v1"
[Interrotto a 50MB...]

Ripresa del download:
→ GET /large-file.zip HTTP/1.1
Range: bytes=52428800-
If-Range: "file-v1"
← HTTP/1.1 206 Partial Content
Content-Range: bytes 52428800-104857599/104857600
[Continuare a scaricare i rimanenti 50MB...]

Scenario 2: Riproduzione streaming video

Utente clicca sulla barra di avanzamento (salta al 50%):
→ GET /movie.mp4 HTTP/1.1
Range: bytes=524288000-524877999

← HTTP/1.1 206 Partial Content
Content-Range: bytes 524288000-524877999/1048576000
Content-Type: video/mp4
[Restituire 590KB di dati video...]

Scenario 3: Download multi-thread

Thread 1:
→ Range: bytes=0-34999999

Thread 2:
→ Range: bytes=35000000-69999999

Thread 3:
→ Range: bytes=70000000-104857599

[Tre thread scaricano in parallelo, poi uniscono]

Scenario 4: Caricamento parziale PDF

Caricare solo indice e prime 10 pagine del PDF:
→ GET /document.pdf HTTP/1.1
Range: bytes=0-102400

← HTTP/1.1 206 Partial Content
Content-Range: bytes 0-102400/10485760
[Restituire intestazione file e prime 10 pagine...]

Intestazione di risposta Content-Range

Sintassi completa

Content-Range: <unit> <range-start>-<range-end>/<size>
Content-Range: <unit> <range-start>-<range-end>/*
Content-Range: <unit> */<size>

Esempi

Dimensione totale nota:

Content-Range: bytes 200-1000/5000

Dimensione totale sconosciuta:

Content-Range: bytes 200-1000/*

Non soddisfacibile (risposta 416):

Content-Range: bytes */5000

Migliori pratiche per richieste di intervallo

Lato server

  1. Dichiarare il supporto:

    Accept-Ranges: bytes
  2. Fornire ETag o Last-Modified:

    ETag: "abc123"
    Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT
  3. Validare correttamente gli intervalli:

    • Verificare se l'intervallo è nell'intervallo valido
    • Rifiutare intervalli non validi (restituire 416)
  4. Ottimizzare grandi richieste di intervallo:

    • Considerare di limitare il numero di intervalli per richiesta
    • Evitare intervalli troppo piccoli che causano overhead eccessivo

Lato client

  1. Verificare Accept-Ranges:

    if (response.headers.get('Accept-Ranges') === 'bytes') {
    // Richieste di intervallo supportate
    }
  2. Usare If-Range per garantire coerenza:

    Range: bytes=1000-
    If-Range: "etag-value"
  3. Gestire diverse risposte:

    • 200: Il server ignora Range, restituisce risorsa completa
    • 206: Risposta parziale riuscita
    • 416: Intervallo non valido, potrebbe essere necessario richiedere nuovamente
  4. Segmentazione ragionevole:

    Non troppo piccolo: bytes=0-1, bytes=1-2, bytes=2-3 ✗
    Dimensione ragionevole: bytes=0-1048575 (1MB) ✓

Unità di intervallo

HTTP/1.1 supporta principalmente l'unità bytes, ma la specifica consente estensioni:

Accept-Ranges: bytes, frames, segments

L'unità bytes è la più comunemente utilizzata e standardizzata.

Considerazioni sulle prestazioni

Vantaggi

  • Risparmiare larghezza di banda: Trasferire solo la parte necessaria
  • Migliorare l'esperienza: Supportare ripresa download e salto rapido
  • Download parallelo: Aumentare la velocità di download

Problemi potenziali

  • Complessità della cache: La memorizzazione nella cache di risposte parziali è più complessa
  • Overhead del server: Richiede il supporto per l'accesso casuale
  • Frammentazione dell'intervallo: Troppe piccole richieste di intervallo possono ridurre l'efficienza

Raccomandazioni di ottimizzazione

Dimensioni di intervallo consigliate:

  • Streaming video: 1-5MB
  • Download file: 5-10MB
  • Navigazione documenti: 100KB-1MB

Considerazioni sulla sicurezza

Attacchi denial-of-service

I client dannosi potrebbero inviare numerose piccole richieste di intervallo:

Range: bytes=0-0, 1-1, 2-2, 3-3, ... (migliaia di intervalli)

Misure difensive:

  • Limitare il numero di intervalli per richiesta (ad es. massimo 5)
  • Limitare la dimensione totale della risposta
  • Implementare limitazione della frequenza

Perdita di informazioni

Le richieste di intervallo potrebbero essere utilizzate per indovinare dimensione o struttura del file:

Range: bytes=0-0
→ Content-Range: bytes 0-0/[dimensione file]

Per file sensibili, considerare di disabilitare le richieste di intervallo o richiedere autenticazione.

Interazione con altre funzionalità HTTP

Interazione con cache

Le richieste di intervallo aumentano la complessità della memorizzazione nella cache:

Vary: Range
Cache-Control: private

Interazione con compressione

Nota: Le richieste di intervallo di solito non sono utilizzate con Content-Encoding: gzip, poiché gli offset compressi sono imprevedibili.

Raccomandazione: Per file di grandi dimensioni che richiedono richieste di intervallo, non utilizzare la compressione di trasferimento.

Interazione con reindirizzamenti

Se una richiesta di intervallo incontra un reindirizzamento:

GET /old-video.mp4 HTTP/1.1
Range: bytes=1000-1999

HTTP/1.1 302 Found
Location: /new-video.mp4

Il client dovrebbe reinviare la richiesta di intervallo al nuovo URL.


Le richieste di intervallo sono una caratteristica chiave di HTTP/1.1:

  • Precisione: Implementazione precisa della semantica degli intervalli di byte
  • Chiarezza: Espressione chiara delle esigenze di contenuto parziale
  • Eleganza: Supporto elegante delle funzionalità avanzate delle applicazioni Web moderne

Attraverso le richieste di intervallo, l'esperienza utente durante il trasferimento di file di grandi dimensioni e la riproduzione di media può essere notevolmente migliorata.


RFC correlati:

  • RFC 7230: HTTP/1.1 Sintassi e routing dei messaggi
  • RFC 7231: HTTP/1.1 Semantica e contenuto
  • RFC 7232: HTTP/1.1 Richieste condizionali

Torna alla documentazione HTTP/1.1