1. Introduzione
L'Hypertext Transfer Protocol (HTTP) è un protocollo richiesta/risposta senza stato a livello di applicazione che usa semantiche estensibili e payload di messaggio autodescrittivi per interagire in modo flessibile con sistemi informativi ipertestuali basati sulla rete. Questo documento è il primo di una serie di documenti che nel loro insieme formano la specifica HTTP/1.1:
-
"Message Syntax and Routing" (questo documento)
-
"Semantics and Content" [RFC7231]
-
"Conditional Requests" [RFC7232]
-
"Range Requests" [RFC7233]
-
"Caching" [RFC7234]
-
"Authentication" [RFC7235]
Questa specifica HTTP/1.1 sostituisce la RFC 2616 e la RFC 2145 (sul versionamento di HTTP). Questa specifica aggiorna inoltre l'uso di CONNECT per stabilire un tunnel, definito in precedenza nella RFC 2817, e definisce lo schema URI "https" che era descritto in modo informale nella RFC 2818.
HTTP è un protocollo di interfaccia generico per i sistemi informativi. È progettato per nascondere i dettagli di come un servizio è implementato, presentando ai client un'interfaccia uniforme indipendente dai tipi di risorse fornite. Allo stesso modo, i server non hanno bisogno di essere consapevoli dello scopo di ciascun client: una richiesta HTTP può essere considerata isolatamente, anziché essere associata a un tipo specifico di client o a una sequenza predeterminata di passi applicativi. Il risultato è un protocollo che può essere usato efficacemente in molti contesti diversi e le cui implementazioni possono evolvere indipendentemente nel tempo.
HTTP è inoltre progettato per essere usato come protocollo di intermediazione per tradurre la comunicazione da e verso sistemi informativi non HTTP. I proxy e i gateway HTTP possono fornire accesso a servizi informativi alternativi traducendo i loro diversi protocolli in un formato ipertestuale che può essere visualizzato e manipolato dai client allo stesso modo dei servizi HTTP.
Una conseguenza di questa flessibilità è che il protocollo non può essere definito in termini di ciò che accade dietro l'interfaccia. Siamo invece limitati a definire la sintassi della comunicazione, l'intento della comunicazione ricevuta e il comportamento atteso dei destinatari. Se la comunicazione viene considerata isolatamente, allora le azioni riuscite dovrebbero riflettersi in cambiamenti corrispondenti dell'interfaccia osservabile fornita dai server. Tuttavia, poiché più client potrebbero agire in parallelo e magari con obiettivi contrastanti, non possiamo richiedere che tali cambiamenti siano osservabili oltre l'ambito di una singola risposta.
Questo documento descrive gli elementi architetturali usati o citati in HTTP, definisce gli schemi URI "http" e "https", descrive il funzionamento complessivo della rete e la gestione delle connessioni, e definisce i requisiti di inquadratura (framing) e di inoltro dei messaggi HTTP. Il nostro obiettivo è definire tutti i meccanismi necessari alla gestione dei messaggi HTTP che sono indipendenti dalla semantica dei messaggi, definendo così l'insieme completo dei requisiti per i parser di messaggi e per gli intermediari che inoltrano messaggi.
1.1. Notazione dei requisiti
Le parole chiave "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY" e "OPTIONAL" in questo documento devono essere interpretate come descritto in [RFC2119].
I criteri di conformità e le considerazioni relative alla gestione degli errori sono definiti nella Sezione 2.5.
1.2. Notazione della sintassi
Questa specifica utilizza la notazione Augmented Backus-Naur Form (ABNF) di [RFC5234] con un'estensione di elenco, definita nella Sezione 7, che consente la definizione compatta di elenchi separati da virgole usando un operatore '#' (in modo simile a come l'operatore '*' indica la ripetizione). L'Appendice B mostra la grammatica raccolta con tutti gli operatori di elenco espansi nella notazione ABNF standard.
Le seguenti regole fondamentali sono incluse per riferimento, come definito in [RFC5234], Appendice B.1: ALPHA (lettere), CR (ritorno a capo), CRLF (CR LF), CTL (controlli), DIGIT (decimale 0-9), DQUOTE (virgoletta doppia), HEXDIG (esadecimale 0-9/A-F/a-f), HTAB (tabulazione orizzontale), LF (avanzamento di riga), OCTET (qualsiasi sequenza di dati di 8 bit), SP (spazio) e VCHAR (qualsiasi carattere visibile [USASCII]).
Per convenzione, i nomi delle regole ABNF con prefisso "obs-" denotano regole grammaticali "obsolete" che compaiono per ragioni storiche.