La comunicazione sul WEB e il protocollo HTTP
La comunicazione sul web avviene attraverso protocolli di rete che operano al livello applicazione, utilizzando il protocollo di trasporto TCP. Tra questi, il più diffuso è il protocollo HTTP (HyperText Transfer Protocol), che segue un modello di cooperazione asimmetrica tra due entità fondamentali: client e server. Questi due elementi hanno ruoli ben distinti all'interno del sistema di comunicazione.
- Il Client: Il Punto di Partenza della Comunicazione- Caratteristiche del Client:
- Esempio di richiesta HTTP da un client:
- Il Server: Il Fornitore di Risorse- Caratteristiche del Server:
- Esempio di risposta HTTP da un server:
- Il Protocollo HTTP- Come Funziona HTTP
- Conversazione Client-Server- Esempio: Richiesta di una Pagina Web
- Tipi di Connessioni HTTP- Connessione HTTP 1.1 Permanente
- Messaggi HTTP- Messaggio di Richiesta: HTTP Request- Sintassi della Richiesta HTTP
- Riga di Richiesta- Esempio di richiesta HTTP
- Intestazione HTTP (Header)
- Corpo del Messaggio (Message Body)- Esempio di richiesta HTTP completa
- Messaggi di risposta: HTTP Response- Struttura della Response HTTP
- Esempio di una Response HTTP
- Gli Header HTTP
- Il Corpo della Risposta (Body)
- I Metodi HTTP- Il metodo GET
- Il metodo POST
- Il metodo PUT
- Il metodo DELETE
- Tabella dei Metodi HTTP
- La Codifica URL
- I Codici di Stato HTTP
- Strumenti per Analizzare HTTP
Il Client: Il Punto di Partenza della Comunicazione
Il client è il dispositivo o processo che inizia la comunicazione con il server per richiedere informazioni o servizi. Nel contesto del web, il client è solitamente un browser o un'applicazione che esegue richieste HTTP verso un server web.
Caratteristiche del Client:
- ✅ È un processo attivo: prende l'iniziativa per avviare la comunicazione con il server.
- ✅ Utilizza HTTP per stabilire una connessione con il server seguendo il modello client-server a client attivo.
- ✅ Usa un URL (Uniform Resource Locator) per identificare le risorse richieste sul web.
- ✅ Invia richieste HTTP specificando un indirizzo IP e un numero di porta del servizio desiderato (solitamente la porta 80 per HTTP e 443 per HTTPS).
- ✅ Attende una risposta dal server, che potrebbe contenere pagine web, file multimediali o dati strutturati (ad esempio, in formato JSON o XML).
Esempio di richiesta HTTP da un client:
GET /index.html HTTP/1.1
Host: www.esempio.com
User-Agent: Mozilla/5.0
Il Server: Il Fornitore di Risorse
Il server è il sistema che risponde alle richieste inviate dal client, fornendo i dati richiesti o eseguendo operazioni specifiche. Nel web, il server è rappresentato da software come Apache, Nginx o IIS, che gestiscono le richieste HTTP.
Caratteristiche del Server:
- 🔊 È un processo passivo: attende richieste dai client e risponde con i dati richiesti.
- 🔊 Utilizza HTTP per gestire le richieste dei client seguendo il modello client-server a server passivo.
- 🔊 Ascolta su una porta TCP specifica (di solito la porta 80 per HTTP e 443 per HTTPS).
- 🔊 Ospita un processo server che rimane costantemente in attesa di richieste da parte dei client.
- 🔊 Invia una risposta HTTP che contiene le risorse richieste o eventuali messaggi di errore (come il celebre "404 Not Found").
Esempio di risposta HTTP da un server:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1024
Pagina di Esempio
Il protocollo HTTP (HyperText Transfer Protocol) è un protocollo di testo che fornisce il livello di trasporto per tutti i protocolli applicativi basati su di esso. Possiamo considerare il Web (WWW) come il risultato della combinazione di diverse tecnologie fondamentali, tra cui:
- HTML (HyperText Markup Language): il linguaggio utilizzato per la creazione di pagine web.
- URL (Uniform Resource Locator): il sistema di indirizzamento per identificare risorse online.
- HTTP: il protocollo che regola la comunicazione tra client e server.
Il protocollo HTTP consente di inviare e ricevere risorse web, che possono essere documenti, pagine web o elementi di una singola pagina, attraverso una comunicazione tra un server (che ospita il contenuto) e un client (che lo richiede, ad esempio un browser web).
Per stabilire una comunicazione, HTTP utilizza sessioni, ciascuna delle quali inizia con l'apertura di una connessione TCP al server. Di default, questa connessione avviene sulla porta TCP 80. Il processo si sviluppa nei seguenti passaggi:
- Il client invia una richiesta (request) contenente un URL.
- Il server elabora la richiesta e restituisce il file richiesto.
- Il server chiude la connessione TCP immediatamente dopo (nella situazione più semplice).
Conversazione Client-Server
La comunicazione tra client e server avviene tramite un meccanismo di richiesta e risposta.
- Il client crea un messaggio di richiesta HTTP e lo invia al server.
- Il server riceve la richiesta, elabora i dati e restituisce un messaggio di risposta HTTP.
Esempio: Richiesta di una Pagina Web
Immaginiamo di voler accedere alla pagina:
www.profgiagnotti.it/
Ecco i passaggi della comunicazione:
- Il client richiede una connessione TCP con il server web all'indirizzo www.istitutovolta.edu sulla porta 80.
- Il server accetta la richiesta e apre la connessione.
- Il client invia un messaggio di richiesta (request message) contenente la URL della pagina richiesta.
- Il server elabora la richiesta e invia il messaggio di risposta (response message) con il contenuto richiesto.
- Il server chiude la connessione TCP.
- Il client riceve la risposta, che contiene il file HTML della pagina.
- Il client analizza il file HTML e rileva riferimenti a immagini e altri file multimediali (ad esempio, file PNG).
- Per ogni immagine rilevata, il client ripete i passi da 1 a 5, richiedendo ogni elemento al server.
Il protocollo HTTP utilizza TCP come protocollo di trasporto per gestire le connessioni tra client e server. La connessione HTTP viene attivata dal client, che stabilisce una connessione TCP con il server attraverso il three-way handshake. Una volta completato lo scambio iniziale, il client può inviare una richiesta HTTP. Dopo aver risposto, il server chiude la connessione tramite un ulteriore scambio di segmenti TCP.
Connessione HTTP 1.1 Permanente
Nella versione HTTP 1.1, la connessione TCP rimane aperta anche dopo l'invio della risposta. Questo consente di riutilizzare la stessa connessione per più richieste consecutive, migliorando l'efficienza della comunicazione.
Le connessioni permanenti possono essere di due tipi:
- Connessione permanente non incanalata: il client invia una nuova richiesta solo dopo aver ricevuto la risposta alla precedente.
- Connessione permanente incanalata (pipelined): il client invia più richieste in sequenza senza attendere le risposte, che vengono elaborate nello stesso ordine.
Di default, HTTP 1.1 utilizza la connessione incanalata, consentendo al client di inviare più richieste consecutive senza attese (metodo back-to-back).
Durante la comunicazione HTTP, client e server scambiano messaggi di richiesta e risposta, che seguono una struttura standard composta da:
- Una riga iniziale (indica il tipo di messaggio)
- Un'intestazione (header) (opzionale, contiene metadati sulla comunicazione)
- Una riga vuota (separatore tra header e corpo)
- Un corpo del messaggio (body) (opzionale, contiene i dati trasmessi)
Messaggio di Richiesta: HTTP Request
Una richiesta HTTP ( Request) è composta da tre elementi fondamentali:
- Riga di richiesta
- Intestazione HTTP (header)
- Corpo del messaggio (message body) (se necessario)
Sintassi della Richiesta HTTP
// Riga di richiesta
// Intestazione
CRLF // Riga vuota
// Corpo del messaggio
Dove CRLF (Carriage Return Line Feed) indica un ritorno a capo per separare le sezioni del messaggio.
Riga di Richiesta
La riga di richiesta contiene:
- Metodo (Method): indica l'operazione richiesta.
- HTTP/0.9: GET
- HTTP/1.0: DELETE, GET, HEAD, LINK, POST, PUT, UNLINK
- HTTP/1.1: CONNECT, DELETE, GET, HEAD, OPTIONS, POST, PUT, TRACE
- URI (Uniform Resource Identifier): identifica la risorsa richiesta.
- Versione del protocollo HTTP: ad esempio HTTP/1.0 o HTTP/1.1.
Esempio di richiesta HTTP
GET /percorso/file.html HTTP/1.1
- Metodo: GET
- URI: /percorso/file.html
- Versione: HTTP/1.1
In questo caso, il client richiede il file HTML situato nella sottodirectory /percorso del server.
Intestazione HTTP (Header)
L'intestazione HTTP contiene informazioni sul messaggio e segue il formato:
nome_header: valore CRLF
Le intestazioni si suddividono in:
- Intestazioni generali: informazioni comuni a richiesta e risposta.
- Intestazioni della richiesta: dettagli specifici della richiesta.
- Intestazioni del corpo dell'entità: metadati sui contenuti trasmessi.
Esempio di header in una richiesta HTTP:
Accept: image/gif, image/jpeg, image/png, */*
Accept-Language: it
Accept-Encoding: gzip, deflate
Host: www.magistricumacini.it
If-Modified-Since: Fri, 14 Mar 2018 10:54:03 GMT
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Quando si utilizza il metodo GET, il corpo dell'entità (entity body) non viene incluso nella richiesta.
Corpo del Messaggio (Message Body)
Il corpo del messaggio contiene i dati trasmessi nella richiesta. La sua presenza dipende dal metodo HTTP utilizzato. Ad esempio, nei metodi POST e PUT, il corpo del messaggio include i dati da inviare al server.
Esempio di richiesta HTTP completa
GET / HTTP/1.1
Accept: image/gif, image/jpeg, image/png, */*
Accept-Language: it
Accept-Encoding: gzip, deflate
Host: www.magistricumacini.it
If-Modified-Since: Fri, 14 Mar 2018 10:54:03 GMT
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Messaggi di risposta: HTTP Response
Quando un server HTTP riceve una richiesta da un client, intraprende una serie di azioni per fornire la risorsa richiesta. Queste azioni possono includere l'esecuzione di uno script server-side o il recupero di una risorsa statica dal server. Una volta completato il processo, il server invia una risposta HTTP al client. Vediamo in dettaglio come si struttura una risposta HTTP.
Struttura della Response HTTP
La risposta HTTP è organizzata in modo simile a una richiesta HTTP, ma con una differenza fondamentale: invece della riga di richiesta, la risposta inizia con una riga di stato. La risposta HTTP è composta da tre parti principali:
- Riga iniziale: La prima parte della risposta, che contiene la versione del protocollo HTTP e il codice di stato.
- Intestazione (Header): Una serie di coppie chiave-valore che forniscono informazioni aggiuntive sulla risposta. Gli header possono essere generali, specifici dell'entità trasmessa o relativi alla richiesta.
- Corpo (Body): La sezione del messaggio che contiene la risorsa o il dato richiesto, come una pagina HTML, un'immagine o un file JSON.
Esempio di una Response HTTP
Un esempio di intestazione tipica di una risposta HTTP potrebbe essere:
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Date: Sat, 28 Nov 2021, 04:33:04 GMT
Server: Apache/1.4
Connection: close
Expires: Sat, 28 Nov 2021, 05:33:04 GMT
Cache-Control: max-age=3600, public
Content-Type: text/html
Nel corpo della risposta (body), troviamo il contenuto richiesto, ad esempio una pagina HTML:
Il protocollo HTTP
Benvenuti alla lezione sul protocollo HTTP!
Questo è un esempio di risposta HTTP con un corpo HTML.
Gli Header HTTP
Gli header della risposta, come quelli della richiesta, sono formati da coppie nome: valore che descrivono le caratteristiche del messaggio. Questi header possono riguardare:
- Informazioni generali sulla trasmissione, come il tipo di compressione (es. Transfer-Encoding).
- Caratteristiche dell'entità trasmessa, come il tipo di contenuto (es. Content-Type) o la data di scadenza della risorsa (es. Expires).
- Dettagli relativi alla richiesta, come il User-Agent (che indica il browser utilizzato) o l'host richiesto.
- Dettagli sulla risposta generata dal server, come il tipo di server (es. Server) o le modalità di autenticazione richieste (es. WWW-Authenticate).
Il Corpo della Risposta (Body)
Il corpo della risposta (entity body) è la parte della risposta che contiene effettivamente la risorsa richiesta dal client. Questo può essere un file HTML, JSON, un'immagine o qualsiasi altro tipo di dato. La sezione "Body" è quasi sempre presente nelle risposte HTTP e rappresenta il cuore della comunicazione tra client e server.
I Metodi HTTP
I metodi HTTP (noti anche come "verbi") rappresentano l'intenzione del client nella richiesta inviata al server. I più comuni includono:
- GET: Richiede una risorsa dal server (es. una pagina web).
- POST: Invia dati al server per la creazione o l'aggiornamento di risorse.
- PUT: Carica o aggiorna una risorsa sul server.
- DELETE: Rimuove una risorsa dal server.
Questi metodi sono essenziali per il funzionamento delle applicazioni web, specialmente quelle basate su architetture RESTful, che utilizzano i metodi CRUD (Create, Read, Update, Delete) per gestire le risorse.
Il metodo GET
GET è il tipo di metodo di richiesta HTTP più semplice, che mostra i dati inviati al server direttamente nella barra degli indirizzi del browser. Questo è il tipo di richiesta che un browser applica quando l’utente clicca su un link o immette un URI nell’apposito campo del browser. Il metodo GET richiede una risorsa a un server ordinando di trasmettere al client le informazioni identificate nell’URL. Una richiesta GET è di sola lettura, ma quando il client riceve le informazioni, è libero di compiere operazioni sui dati ricevuti, come per esempio formattarle per visualizzarle. La sintassi è la seguente:
GET /pathname HTTP/1.1
Attraverso questo metodo di richiesta inizia lo scambio di due messaggi. Il client inizia mandando un messaggio con metodo GET al server. Il messaggio identifica l’oggetto che il client sta richiedendo tramite il campo URI della linea di richiesta. Il metodo GET può essere:
- assoluto: la risorsa viene richiesta senza altre specificazioni
- condizionale: la risorsa viene richiesta se viene soddisfatto il criterio indicato negli header (If-match, If-modified-since, If-range ecc.)
- parziale: si richiede una parte di una risorsa memorizzata
Il server invia l’oggetto richiesto dal client, nella request, e indica il successo dell’operazione con il codice di stato 200 nella linea di stato relativa alla sua risposta, mentre l’oggetto è restituito nel corpo del messaggio. Se il server non può spedire l’oggetto (o sceglie di non farlo), inserirà un opportuno codice di stato.
Il metodo POST
Il metodo POST consente in genere di trasmettere informazioni dal client al server, per esempio per inviare dati di un form HTML a un’applicazione server identificata dall’URI specificata nella richiesta. Viene anche usato per aggiornare una risorsa esistente o fornire dati di ingresso, tenendo presente che i dati vengono forniti all’interno del message body della request.
Nel metodo POST, a differenza di GET, i dettagli di identificazione e di elaborazione della risorsa non sono indicati nell’URL, ma sono collocati nel body del messaggio. La trasmissione con il metodo POST avviene in maniera analoga rispetto alla GET: il client trasmette un messaggio POST che include l’informazione da inviare al server
Nel metodo POST non esistono limiti di lunghezza nei parametri della richiesta, in quanto , per esempio,nel caso di invio dei campi FORM, essi vengono collocati nel message body
Il metodo POST non è sicuro in sé per sé, inoltre si differenzia da GET per i seguenti motivi:
- un blocco di dati viene inviato dal client nella request all’interno del corpo del messaggio
- l’URI richiesto non è una risorsa da prelevare, bensì un programma (in genere in linguaggio CGI) per gestire i dati che vengono spediti
- la risposta HTTP viene generata dinamicamente come output di un programma CGI.
Il metodo PUT
La richiesta con metodo PUT permette al client di fornire informazioni ai server. Come per il metodo POST, il client nella sua richiesta invia un metodo, un URI e i dati, quindi il server restituisce un codice di stato e, in modo opzionale, dei dati. La differenza tra POST e PUT sta nell’interpretazione dell’URI da parte di un server. Con il metodo POST, l’URI identifica un oggetto sul server che può processare i dati inclusi nel corpo dell’entità. Con PUT, invece, l’URI indica un oggetto in cui il server dovrebbe immettere i dati. Mentre un URI POST indica generalmente un programma o uno script, l’URI PUT è di solito il percorso o il nome di un file.
Read the full article