HTTP (Hypertext Transfer Protocol) è una delle tecnologie alla base del Web; in particolare, HTTP è un protocollo a livello di applicazione nato per la trasmissione di documenti, come ad esempio i file HTML. Il protocollo HTTP è stato inizialmente pensato per la comunicazione tra web browser e web server, ma può essere usato anche per altri scopi.
HTTP segue uno schema client-server, in cui una applicazione (client) apre una connessione verso il server, effettua una richiesta e attende la risposta del server. Tra le altre caratteristiche di questo protocollo, abbiamo l’essere basato su concetti come risorse e URI (Uniform Resource Identifier) e utilizzare una struttura di messaggi semplice.
HTTP e il Web
Per capire come funziona HTTP, possiamo analizzare il comportamento di un qualsiasi web browser nel momento in cui viene richiesto di caricare una pagina web.
Web Browser come HTTP client
Nel momento in cui diciamo al browser di caricare una certa pagina web, il browser agisce come client HTTP che comunica con un server tramite HTTP. In particolare, supponendo di voler caricare la pagina https://example.com/index.html, il browser aprirà una connessione verso il server e invierà al server un messaggio di richiesta del contenuto del documento HTML index.html che si trova nella root del server web https://example.com. Il messaggio inviato dal browser si chiama richiesta (request).
Ricevuta la richiesta, il server si occuperà di recuperare il contenuto del file richiesto e inviarlo in risposta a chi gli ha fatto richiesta. Anche il server web, quindi, invierà un messaggio che si chiama risposta (response).
Una volta ricevuta il documento HTML il browser comincerà a fare il parsing della pagina per renderizzare e caricare il contenuto e si accorgerà che il documento HTML indica che sono necessari altri file remoti (risorse) per mostrarlo. Per esempio, i file https://example.com/style.css, https://example.com/main.js e https://pictures.example.com/logo.png.
Il browser, quindi, farà partire altri messaggi di richiesta a tutti i vari server, che risponderanno con altrettanti messaggi di risposta.
Lato server web, ognuna di queste richieste è indipendente dalle altre: solo il browser sa che sono collegate tra loro perché servono a caricare una certa pagina. Per questo motivo il protocollo HTTP viene detto stateless (senza stato), poiché non viene mantenuto alcun collegamento tra due richieste fatte sulla stessa connessione.
Quali sono le caratteristiche base del protocollo HTTP
Il protocollo HTTP è stato progettato per essere semplice e la comunicazione HTTP avviene con pochi componenti in gioco, in particolare:
- client: è il componente che inizia una richiesta, il web browser nel caso del web, ma potrebbe anche essere una app che comunica con un server API
- server: un server non è necessariamente una singola macchina, anche se virtualmente può apparire come tale; riceve le richieste e risponde con il contenuto richiesto, nel fare ciò potrebbero entrare in gioco componenti quali load balancer, cache, database, …
- proxy: nel mondo reale, tra il client e il server ci possono essere diversi computer che si “passano” la richiesta e la risposta per farla arrivare alla macchina giusta; basti pensare al fatto che il proprio computer potrebbe non essere l’unico in casa a richiedere la homepage di Google; i proxy intervengono a un livello più basso, ma garantiscono che richiesta e risposta siano correttamente consegnate
Altre caratteristiche importanti del protocollo HTTP che è importante annotare sono:
- semplicità: i messaggi HTTP, come vedremo tra poco, sono semplici e facilmente comprensibili anche da occhio umano, rendendo, quindi, agevole effettuare prove a mano e verificare il contenuto delle risposte
- estendibilità: è possibile introdurre nuove funzionalità, basta che client e server siano in grado di gestire l’estensione; un esempio importante di estensione del protocollo HTTP, sono gli header, non presenti nella prima versione di questo protocollo, ma aggiunti in seguito, permettono di passare informazioni aggiuntive nei messaggi (i famosi cookie sono scambiati nell’header Cookie)
Flusso HTTP e messaggi
Una comunicazione HTTP dal punto si comporta nel dettaglio nel modo seguente:
- il client apre una connessione TCP con il server: in pratica, instaura un canale per inviare e ricevere messaggi (il client può riusare una connessione già aperta o crearne una nuova, a seconda dei casi)
- il client invia un messaggio HTTP di richiesta, che contiene anche gli eventuali header, per esempio:
- GET /index.php HTTP/1.1
Host: example.com
Accept-Language: it
- il server riceve la risposta, verifica se e come elaborarla, produce e invia una risposta
- il client legge la risposta del server, per esempio
- HTTP/1.1 200 OK
Date: 09 Jan 2023 14:28:02 GMT
Server: Nginx
Last-Modified: 27 Dec 2022 20:18:22 GMT
Accept-Ranges: bytes
Content-Length: 29769
Content-Type: text/html<!DOCTYPE html>
…
- il client chiude la connessione o la lascia aperta per futuri utilizzi
Approfondimenti
- i server web moderni usano il protocollo HTTPS (HyperText Transfer Protocol over Secure Socket Layer), che è una estensione di HTTP che usa la crittografia per rendere sicura la comunicazione tra client e server
- con protocollo a livello di applicazione si fa riferimento ai vari livelli di astrazione con cui possono comunicare computer via rete; in particolare l’application layer è il livello più alto tra i vari presenti
- il protocollo HTTP è stateless, ma non è sessionless: la possibilità di creare una sessione tra client e server, resa possibile dai cookie gestiti tramite gli header di messaggio del protocollo HTTP, permette a client e server di sapere, ad esempio, che un certo utente è collegato a un sito di e-commerce per fare acquisti.