# 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`). ```http 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`). ```http 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). ```http 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 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:** ```http 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 GET | Richiesta POST| |-|-| |![Richieste Risposte GET HTTP](/resources/reti//immagini/http-get-request.png) | ![Richieste Risposte POST HTTP](/resources/reti//immagini/http-post-request.png) | --- ## 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. ```shell 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** - Un tool potente per creare, inviare e analizzare richieste HTTP personalizzate. - [Postman](https://www.postman.com/) - [Httpie (gratuito)](https://httpie.io/app) 4. **Wireshark** - Cattura e analizza il traffico HTTP per vedere le comunicazioni dettagliate tra client e server.