Questo sito utilizza cookie per raccogliere dati statistici.
Privacy Policy
# 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|
|-|-|
| |  |
---
## 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.