HTTP (HyperText Transfer Protocol)

Il protocollo HTTP è il cuore della comunicazione su Internet ed è alla base del World Wide Web. È il protocollo utilizzato dai browser web per comunicare con i server e trasferire documenti ipertestuali, immagini, video e altri contenuti che costituiscono una pagina web.


Introduzione: Cos’è HTTP?

HTTP (HyperText Transfer Protocol) è un protocollo di comunicazione di livello applicazione progettato per trasferire contenuti tra un client (ad esempio, un browser web) e un server. La sua prima versione, HTTP/0.9, risale al 1990, mentre oggi le versioni più comuni sono:

  • HTTP/1.1: Introdotta nel 1997, ancora ampiamente utilizzata.
  • HTTP/2: Rilasciata nel 2015, offre prestazioni migliorate.
  • HTTP/3: Basata sul protocollo QUIC (vedremo più avanti), introduce ulteriori ottimizzazioni per la velocità e la sicurezza. Ancora poco utilizzato.

HTTP e HTTPS

HTTP trasmette i dati in chiaro, il che lo rende vulnerabile a intercettazioni e attacchi. Per risolvere questo problema, è stato introdotto HTTPS (HTTP Secure), che combina HTTP con SSL/TLS per cifrare le comunicazioni.


Come funziona HTTP?

HTTP segue un modello richiesta-risposta, in cui il client invia una richiesta al server e il server risponde con i dati richiesti. Questo processo si ripete per ogni risorsa necessaria a costruire una pagina web (ad esempio, immagini, file CSS, script JavaScript).

Fasi principali di una comunicazione HTTP

  1. Connessione al server: Il client stabilisce una connessione al server utilizzando l’indirizzo IP e la porta 80 (o 443 per HTTPS) (vedremo più avanti cosa sono indirizzi IP e porte).
  2. Invio della richiesta HTTP: Il client invia una richiesta che specifica il metodo, il percorso della risorsa e altre informazioni utili.
  3. Risposta dal server: Il server elabora la richiesta e invia una risposta contenente il codice di stato e i dati richiesti (ad esempio, il file HTML della pagina).
  4. Chiusura o riutilizzo della connessione: In HTTP/1.1 e versioni successive, la connessione può essere riutilizzata per altre richieste, riducendo i tempi di latenza.

Struttura di una richiesta HTTP

Una richiesta HTTP è composta da tre parti principali:

  1. Linea di richiesta Contiene:

    • Metodo HTTP: Indica l’azione richiesta (es. GET, POST).
    • Percorso della risorsa: Specifica il file o il servizio richiesto sul server (es. /index.html).
    • Versione del protocollo: Esprime la versione di HTTP utilizzata (es. HTTP/1.1).
    GET /index.html HTTP/1.1
  2. Headers (intestazioni) Forniscono informazioni aggiuntive sulla richiesta, come:

    • Tipo di contenuto accettato dal client (Accept).
    • Informazioni sul client (User-Agent).
    • Host richiesto (Host).
    Host: www.example.com
    User-Agent: Mozilla/5.0 (Windows NT 10.0)
    Accept: text/html,application/xhtml+xml
  3. Corpo della richiesta (opzionale) Utilizzato principalmente nei metodi come POST per inviare dati al server (es. dati di un modulo).

    username=johndoe&password=1234

Struttura di una risposta HTTP

La risposta HTTP inviata dal server ha una struttura simile:

  1. Linea di stato Contiene:

    • Versione del protocollo: Indica la versione di HTTP utilizzata (es. HTTP/1.1).
    • Codice di stato: Indica il risultato della richiesta (es. 200 per successo, 404 per risorsa non trovata).
    • Messaggio di stato: Una descrizione testuale del codice di stato (es. OK, Not Found).
    HTTP/1.1 200 OK
  2. Headers Forniscono informazioni sulla risposta, come:

    • Tipo di contenuto restituito (Content-Type).
    • Dimensione dei dati (Content-Length).
    • Impostazioni di caching (Cache-Control).

    Esempio:

    Content-Type: text/html
    Content-Length: 1234
    Cache-Control: no-cache
  3. Corpo della risposta Contiene i dati richiesti, ad esempio un file HTML o un’immagine.


Metodi HTTP più comuni

I metodi HTTP definiscono l’azione che il client vuole eseguire sul server. Ecco i principali:

  • GET: Richiede una risorsa (es. una pagina HTML). Non invia dati nel corpo della richiesta.
  • POST: Invia dati al server (es. compilazione di un modulo). I dati sono contenuti nel corpo della richiesta
  • PUT: Aggiorna o crea una risorsa sul server.
  • DELETE: Elimina una risorsa specifica.
  • HEAD: Simile a GET, ma restituisce solo le intestazioni, senza il corpo della risposta.

Sono presenti molti metodi HTTP anche se la maggior parte dei sistemi gestiscono solamente GET e POST che riultano essere i più utilizzati

Richiesta GETRichiesta POST
Richieste Risposte GET HTTPRichieste Risposte POST HTTP

Codici di stato HTTP

I codici di stato indicano il risultato della richiesta HTTP. Sono divisi in categorie:

  • 1xx (Informativi): La richiesta è stata ricevuta, ma non completata.
  • 2xx (Successo): La richiesta è stata completata con successo.
    • 200 OK: Risorsa trovata e restituita.
  • 3xx (Redirect): Ulteriori azioni sono necessarie.
    • 301 Moved Permanently: La risorsa è stata spostata in modo permanente.
  • 4xx (Errore del client): La richiesta contiene un errore.
    • 404 Not Found: La risorsa richiesta non è stata trovata.
  • 5xx (Errore del server): Il server ha incontrato un problema.
    • 500 Internal Server Error: Errore interno del server.

Vantaggi di HTTP/2 e HTTP/3

Le nuove versioni di HTTP introducono miglioramenti significativi:

  • HTTP/2:
    • Supporta la multiplexing, permettendo di inviare più richieste simultaneamente sulla stessa connessione.
    • Usa la compressione degli header per ridurre la dimensione delle richieste.
  • HTTP/3:
    • Utilizza il protocollo QUIC basato su UDP per migliorare la velocità e la resilienza.
    • Riduce la latenza nelle connessioni TLS.

Come testare HTTP

  1. Strumenti del browser

    • Apri gli strumenti per sviluppatori (F12) e vai alla scheda Network per analizzare le richieste e risposte HTTP.
  2. Comando curl

    • Usa curl per inviare richieste HTTP da terminale.
      curl -I https://www.google.com

    utilizzando il comando con -I restituisce solo le intestazioni e non il contenuto della risposta. Utilizzado il comando senza -I verrebbe restituito tutto il contenuto della risposta.

  3. Postman o Httpie

  4. Wireshark

    • Cattura e analizza il traffico HTTP per vedere le comunicazioni dettagliate tra client e server.