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
- Ripresa del download: Continuare dopo un'interruzione
- Download segmentato: Download paralleli multi-thread
- Navigazione video: Saltare a una posizione specifica del video
- Anteprima PDF: Scaricare solo le prime pagine
- 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
-
Dichiarare il supporto:
Accept-Ranges: bytes -
Fornire ETag o Last-Modified:
ETag: "abc123"
Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT -
Validare correttamente gli intervalli:
- Verificare se l'intervallo è nell'intervallo valido
- Rifiutare intervalli non validi (restituire 416)
-
Ottimizzare grandi richieste di intervallo:
- Considerare di limitare il numero di intervalli per richiesta
- Evitare intervalli troppo piccoli che causano overhead eccessivo
Lato client
-
Verificare Accept-Ranges:
if (response.headers.get('Accept-Ranges') === 'bytes') {
// Richieste di intervallo supportate
} -
Usare If-Range per garantire coerenza:
Range: bytes=1000-
If-Range: "etag-value" -
Gestire diverse risposte:
- 200: Il server ignora Range, restituisce risorsa completa
- 206: Risposta parziale riuscita
- 416: Intervallo non valido, potrebbe essere necessario richiedere nuovamente
-
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.
Riepilogo
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