Che cosa significa HTTP
HTTP è l'acronimo di “Hypertext Transfer Protocol”, il protocollo di rete impiegato per distribuire virtualmente sul World Wide Web (WWW) file HTML, immagini, o qualunque altro genere di informazioni. Più in generale il protocollo HTTP è utilizzato per trasmettere risorse, intendendo con questo termine qualsiasi blocco di informazione che possa essere identificata tramite un URL: le risorse più comuni sono certamente i file HTML, ma rientrano in questa categoria anche le pagine generate dinamicamente da un server, l'output di uno script CGI, ecc.
La comunicazione avviene tramite socket TCP e le entità che partecipano allo scambio dei dati sono il client HTTP (solitamente un browser web) ed il server HTTP.
Le transazioni del protocollo
Come molti altri protocolli di rete, HTTP segue il modello client-server: la transazione tipica ha inizio con il client che stabilisce una connessione con il server, inoltra la propria richiesta e rimane in attesa della risposta; il server, ricevuta la richiesta del client, la elabora, spedisce una risposta e chiude la connessione. Questo meccanismo si ripete per ogni transazione senza che il server mantenga alcuna memoria di ciò che è avvenuto durante le connessioni precedenti.
I formati di una richiesta e di una risposta HTTP sono molto simili, entrambi sono formati da: una linea iniziale, zero o più linee di intestazione, una linea bianca ed un messaggio opzionale (vedi il Riquadro seguente).
<linea iniziale, differente per la richiesta e la risposta>
Intestazione_1: valore_1
Intestazione_2: valore_2
Intestazione_3: valore_3
<messaggio opzionale (contenente le informazioni della risorsa);
può essere lungo molte linee e contenere perfino dati binati>
Ciascuna linea del messaggio HTTP dovrebbe terminare con CRLF (valori ASCII 10 e 13), sebbene molto più comunemente termini con LF solamente.
Si immagini di voler recuperare la risorsa identificata dall'URL seguente:
http://<a href="/main/default.asp">www.sanlab.it>default.asp.aspx<a>
Volendo analizzare nel dettaglio il comportamento del client e del server a seguito della richiesta precedente, potremmo individuare quattro fasi diverse nella transazione HTTP.
1. Il client crea una connessione
Il client stabilisce una connessione TCP con il server www.sanlab.it sulla porta 80 (default); eventualmente l'utente può specificare una porta diversa da quella di default aggiungendola nel URL. Ad esempio la richiesta:
http://<a href="/main/default.asp">www.sanlab.it:8080/main/default.asp</a>
forza il client ad aprire una connessione sulla porta 8080.
2. Il client trasmette una richiesta
Il client spedisce un messaggio al server richiedendo la risorsa specificata nell'URL. Generalmente la linea iniziale della richiesta è formata di tre parti distinte, separate da uno spazio: il nome del metodo, il percorso locale della risorsa e la versione del protocollo utilizzato. La linea successiva rappresenta un esempio di richiesta.
GET /main/default.asp HTTP/1.0
Sebbene la sola linea iniziale sia già un messaggio HTTP completo, alcuni client possono includere altre informazioni che assumono la forma seguente:
Keyword: Value
La più comune delle keyword è Accepted, che specifica al server quale tipi di dati il client sia in grado di elaborare. Un'altra parola chiave molto utilizzata è User-Agent, che specifica il tipo di browser utilizzato dal client. Infine una linea vuota termina la richiesta ("\r\n\r\n"). Il Riquadro successivo mostra una possibile richiesta completa.
GET /main/default.asp HTTP/1.0
Accept: text/html
Accept: text/plain
User-Agent: Lynx/2.4 libwww/2.1.4
[Linea bianca]
3. Il server risponde
Come nella richiesta, anche la linea iniziale della risposta, detta anche linea di stato, è composta di tre parti separate da spazi: la versione del protocollo HTTP, un codice di stato che informa sull'esito della richiesta, ed una frase in lingua inglese che descrive il significato del codice di stato, ad esempio:
HTTP/1.0 200 OK
Alla linea di stato seguono le linee di intestazione che forniscono informazioni sulla richiesta, la risposta oppure l'oggetto spedito nel corpo del messaggio. Se supponiamo che il file richiesto sia stato trovato dal server, allora una possibile risposta potrebbe essere:
HTTP/1.0 200 OK
Server: Microsoft-IIS/5.0
Date: Sun, 14 Nov 2004 20:57:44 GMT
Content-Length: 21435
Content-Type: text/html
Cache-Control: private
<html>
<head>
<title>
Un semplice file HTML
</title>
</head>
<body>
Il resto del documento va qui
</body>
</html>
Come si può notare da Riquadro 3, dopo le linee di intestazione segue una linea bianca e poi il corpo del messaggio. Se la risposta del server HTTP include un corpo, allora vi sono anche due linee di intestazione che descrivono la lunghezza (Content-Length: 21435) e la natura (Content-Type: text/html) del corpo.
4. Il server ed il client chiudono la connessione
Entrambi chiudono la connessione e per ogni successiva richiesta è utilizzata una nuova connessione. Inoltre se il client esegue una nuova richiesta al medesimo server viene aperta una nuova connessione anche se quella precedente non è ancora stata chiusa.
A questo punto il browser interpreta i dati ricevuti e li visualizza; nel caso in cui il documento contenga altri documenti o immagini, il Web browser inoltra ulteriori richieste al server finché tutte le informazioni non siano state elaborate. E' importante evidenziare che il server HTTP decide autonomamente ed in base alla sua configurazione se il documento richiesto sia un file che può essere recuperato dal file system, o se corrisponda ad un'applicazione. In questo ultimo caso, il server HTTP esegue l'applicazione e restituisce il suo output.
Le richieste HTTP
I metodi di richiesta più comuni del protocollo HTTP sono GET e POST. Il metodo GET è utilizzato per richiamare una risorsa dal server, mentre il metodo POST è utilizzato per spedire informazioni ad una risorsa sul server. Una risorsa è definita come un qualunque oggetto o servizio.
Un esempio del metodo GET potrebbe essere il seguente:
GET /ModGenConf.html HTTP/1.0
Accept: image/gif
Accept: image/jpg
Accept: image/x-xbitmap
User-Agent: Lean Mean BrowserBoy/ Strictly beta
If-Modified-Since: Monday, 1-Jan-96 19:04:09 GMT
Mentre un esempio del metodo POST potrebbe essere:
POST /ModGenConf.html HTTP/1.0
Accept: image/gif
Accept: image/jpg
Accept: image/x-xbitmap
User-Agent: Lean Mean BrowserBoy/ Strictly beta
DATE: 06%2F06%2F96&IP=134.141.48.201&SAVE=YES
Entrambi i metodi trasmettono alcune coppie Header/Value, mentre per delimitare ciascun metodo viene utilizzata una linea bianca.
Le risposte HTTP
In generale quando il server riceve una richiesta dal client, localizza la risorsa indicata nella richiesta, esegue il metodo richiesto dal client su quella risorsa, infine trasmette il risultato al client. Nel caso del metodo GET il server semplicemente forma una risposta che include la risorsa specificata nella richiesta. Nel caso del metodo POST, il server passa i dati inclusi nel POST alla risorsa e riceve un risultato dalla risorsa da includere nella risposta da trasmettere al client.
Le risposte cominciano con una linea di stato che consiste nella versione del protocollo del server, seguita da un codice di stato di risposta e da un messaggio di stato opzionale. Alcuni tipici codici di risposta con i relativi messaggi sono:
200 OK: Resource found
400 Bad Request: Unintelligible Request
401 Unauthorized: Unauthorized Request
404 Not Found: Requested Resource not found
500 Internal Server Error: Unknown server error
503 Service Unavailable: Server capacity reached
Come già visto, di seguito alla linea di stato vi sono una o più coppie header/valore e poi i dati.
Quindi, come per la richiesta, anche la risposta include una lista opzionale di coppie header/valore. Due di questi campi header (intestazione), "Content-Type" e "Content-Length", indicano rispettivamente il tipo e la lunghezza della risorsa che sta per essere ritornata. Il tipo della risorsa è descritto come un tipo MIME (RFC 1521), che può essere utilizzato per identificare qualunque risorsa inclusi tipi specifici di applicazioni.
Autenticazione
L'HTTP utilizza un meccanismo di autenticazione semplice ed estensibile. Il server emette una richiesta di autenticazione mandando al client una risposta con codice 401 (richiesta non autorizzata). Nella risposta sono specificati gli schemi di autenticazione supportati e tutti i parametri necessari per raggiungere l'autenticazione con lo schema adottato. Uno di questi parametri indica un dominio o uno spazio di protezione sul server. Questo permette che le risorse del server siano partizionate in regioni protette, ognuna con il suo schema di autenticazione e/o database di autorizzazione. Il client, a seguito di una risposta con codice 401, può riemettere la richiesta con un'intestazione di autenticazione che identifica lo schema in uso insieme con le necessarie credenziali per provare la propria identità per il dominio in questione.
Il linguaggio HTML
L'HTML è un linguaggio per la descrizione di documenti indipendente dalla piattaforma; è un sottoinsieme del SGML, che è uno standard ISO più elaborato per la composizione di documenti. L'HTML è stato ideato per collegamenti con piccola larghezza di banda. Questa sua caratteristica lo rende particolarmente adatto per trasportare informazioni formattate anche da sistemi "embedded".
La filosofia generale del linguaggio consiste nel non controllare tutti gli aspetti della visualizzazione. Attraverso il linguaggio il progettista della pagina da delle indicazioni alla stazione visualizzatrice sul layout del documento, senza controllare tutti gli aspetti fino al livello dei pixel. Questo minimizza la quantità di informazione necessaria che deve essere trasferita per visualizzare una particolare risorsa.
HTML è definito un linguaggio per ipertesti perché consente di specificare collegamenti ad altri documenti identificati tramite un URL (Uniform Resource Locator). Un URL è un modo per identificare univocamente la locazione di un file in Internet.
URL, URI e URN
Uniform Resource Identifier (URI) è un mezzo per localizzare in modo non ambiguo una risorsa su Internet. In genere la risorsa è un file, ma può essere anche un indirizzo email, un messaggio di un gruppo di discussione, un programma CGI, o qualunque altra cosa. Esistono due tipi di URI: Uniform Resource Locator (URL) e Uniform Resource name (URN). Un URL è un puntatore ad una particolare risorsa su Internet ad una specifica locazione. Per esempio, http://www.sanlab.it e ftp://sunsite.unc.edu/pub/javafaq sono entrambi URL. Un URN è un puntatore ad una particolare risorsa, ma senza un riferimento ad una specifica locazione. Gli URN sono stati pensati per poter gestire con facilità risorse duplicate in più locazioni o che possono essere spostate in più locazioni. Essi identificano la risorsa, non la locazione dove tale risorsa si trova.
Un URL specifica il protocollo utilizzato per accedere al server (ftp, http...), il nome del server e la locazione del file su quel server. La sintassi di un URL è la seguente:
protocol://hostname/[:port]/path/filename#section
protocol, qualche volta chiamato anche schema, definisce il protocollo da utilizzare per lo scambio dei dati e può essere uno dei seguenti:
|
Protocollo
|
Descrizione
|
|
file
|
Un file nel disco fisso locale
|
|
ftp
|
Un server FTP
|
|
http
|
Un server HTTP
|
|
gopher
|
Un server GOPHER
|
|
news
|
Un server NEWS
|
|
telnet
|
Un server TELNET
|
|
wise
|
Un server WISE
|
La parte hostname definisce il server che fornisce la risorsa, ad esempio www.sanlab.it, e può essere rappresentato anche tramite il suo indirizzo IP.
port rappresenta il numero di porta ed è opzionale nel caso in cui il servizio sia in ascolto sulla porta di default (per i server HTTP la porta di default è la numero 80).
path, invece, punta ad una particolare directory sul server ed il percorso è relativo alla directory radice dei documenti, non necessariamente alla directory radice del file system.
filename punta ad un particolare file nella directory specificata dal path. Spesso il nome del file è omesso, in qesto caso il server spedisce un file a propria discrezione, in genere il file index.html, altri presentano la lista dei file presenti nella directory, altri ancora spediscono un messaggio di errore.
Infine section è utilizzato per far riferimento ad un punto specifico all'interno di un documento HTML.
Conclusioni
HTTP differisce da altri protocolli di livello 7 come FTP, per il fatto che le connessioni vengono generalmente chiuse una volta che una particolare richiesta (o una serie di richieste correlate) è stata soddisfatta; l'HTTP ha uno scambio di dati fondamentalmente stateless, cioè non mantiene memoria della storia delle richieste e delle risposte. La scelta di un protocollo "stateless", cioè di un protocollo che non "conserva memoria" delle connessioni effetuate, è conseguenza della natura del World Wide Web, che è costituito da un insieme di pagine connesse tra loro attraverso link ipertestuali e residenti su molti server differenti. Se da un lato, l'adozione di un protocollo stateless ha semplificato la realizzazione dei server HTTP, dall'altra ha notevolmente complicato la vita agli sviluppatori di applicazioni web che sono stati costresti a ricorrere a metodi alternativi (ad esempio i cookie) per conservare lo stato dell'utente.