Ci sono tre standard principali che, nel loro insieme,
costituiscono l'architettura software del Web:
sistema di indirizzamento basato
su Uniform Resource Locator
(URL): è un meccanismo
standard per fare riferimento alle entità indirizzabili (risorse)
nel Web, che possono essere:
documenti (testo, immagini, suoni, ecc.);
programmi eseguibili (vedremo poi);
linguaggio HTML
(HyperText Markup Language):
è il linguaggio per la definizione delle pagine Web;
protocollo HTTP
(HyperText Transfer Protocol):
è il protocollo che i client e i server utilizzano per comunicare.
3.1) URL
Una URL costituisce un riferimento a una qualunque
risorsa accessibile nel Web.
Tale risorsa ovviamente risiede da qualche parte, ed è in generale
possibile accedervi in vari modi.
Dunque, una URL deve essere in grado di indicare:
come si vuole accedere alla risorsa;
dove è fisicamente localizzata la risorsa;
come è identificata la risorsa.
Per queste ragioni, una URL è fatta di 3 parti, che specificano:
il metodo di accesso;
l'host che detiene la
risorsa;
l'identità della
risorsa.
Un tipico esempio di una URL è:
http://somewhere.net/products/index.html
nella quale:
http://
è il metodo di accesso
somewhere.net
è il nome dell'host
/products/index.html
è l'identità della risorsa
Metodo di accesso
Indica il modo di accedere alla risorsa, cioè che tipo di protocollo
bisogna usare per colloquiare col server che controlla la risorsa.
I metodi di accesso più comuni sono:
http
protocollo nativo del Web
ftp
file transfer protocol
news
protocollo per l'accesso ai gruppi di discussione
gopher
vecchio protocollo per il reperimento di informazioni;
concettualmente simile al Web, gestisce solo testo
mailto
usato per spedire posta
telnet
protocollo di terminale virtuale, per effettuare login
remoti
file
accesso a documenti locali
Il Web nasce con l'idea di inglobare gli altri protocolli di accesso
alle informazioni, per costituire un ambiente unificato che soddisfa tutte
le esigenze.
Quando il client effettua la richiesta di una risorsa, usa nel dialogo
col server il protocollo specificato dal metodo d'accesso. Se non è
in grado di farlo, affida il compito a una
applicazione helper esterna
(questo è tipicamente il caso del protocollo telnet: il client lancia
un emulatore di terminale passandogli il nome dell'host).
Dall'altra parte risponde il server di competenza, che può essere:
un server Web in grado di gestire anche altri protocolli;
un server preesistente per lo specifico protocollo
(ftp, gopher, ecc.).
Nome dell'host
Può essere l'indirizzo IP numerico o,
più comunemente, il nome DNS
dell'host a cui si vuole chiedere la risorsa.
Identità della risorsa
Consiste, nella sua forma più completa, della specifica del nome
di un file e del cammino che porta al direttorio in cui si trova.
Ad esempio, la URL:
http://somewhere.net/products/toasters/index.html
specifica il file index.html contenuto nel direttorio
toasters,
a sua volta contenuto nel direttorio products il quale si trova
nel direttorio radice dell'host somewhere.net.
Si noti che:
la sintassi è quella di Unix;
il direttorio radice è relativo all'albero dei documenti Web, e
non è necessariamente la radice dell'intero file system
dell'elaboratore;
ciò fa sì che sia di fatto impossibile accedere per mezzo
del Web al di fuori di tale parte del file system: il server, di norma,
non consente di accedere a nulla che non sia nell'albero dei documenti
Web.
Esistono alcune regole per il completamento di URL non interamente specificate:
se manca il nome del direttorio, si assume quello della pagina
precedente;
se manca il nome del file (ma c'è quello del direttorio), a seconda
del server:
si restituisce un file prefissato del direttorio specificato (index.html,
default.html oppure welcome.html);
se tale file non esiste, talvolta si restituisce un elenco dei file nel
direttorio.
Infine, una convenzione usata spesso è la seguente. A fronte di
una URL del tipo:
http://somewhere.net/~username/
il server restituisce il file welcome.html situato nel direttorio
public_html situato nel direttorio principale
(home directory)
dell'utente username.
Questo meccanismo consente agli utenti, che di norma hanno libero accesso
al proprio home directory, di mantenere facilmente proprie pagine Web.
3.2) Il protocollo HTTP
Il protocollo HTTP sovraintende al dialogo fra un client e un server Web, ed è
il linguaggio nativo del Web.
Il protocollo prevede che ogni singola interazione fra client e server
si svolga secondo il seguente schema:
apertura di una connessione di livello transport fra
client e server (TCP è lo standard di fatto, ma qualunque altro può
essere usato);
invio di una singola richiesta da parte del client, che specifica la URL
desiderata;
invio di una risposta da parte del server e dei dati di cui alla URL
richiesta;
chiusura della connessione di livello transport.
Ogni singola interazione è storia a se ed è
del tutto indipendente dalle altre.
La richiesta del client
Quando un client effettua una richiesta invia diverse informazioni:
il metodo (cioè il comando) che si chiede al server di
eseguire;
il numero di versione del protocollo HTTP in uso;
l'indicazione dell'oggetto al quale applicare il comando;
varie altre informazioni, fra cui:
il tipo di client;
i tipi di dati che il client può accettare.
I metodi definiti in HTTP sono:
GET
Richiesta di ricevere un oggetto dal server
HEAD
Richiesta di ricevere la sola parte head di una pagina
html
PUT
Richiesta di mandare un oggetto al server
POST
Richiesta di appendere sul server un oggetto a un altro
(vedremo che si usa molto)
DELETE
Richiesta di cancellare sul server un oggetto
LINK e UNLINK
Richieste di stabilire o eliminare collegamenti fra oggetti
del server
In proposito, si noti che:
il metodo che si usa quasi sempre è GET;
POST ha il suo più significativo utilizzo in relazione all'invio
di dati tramite form, come vedremo in seguito;
HEAD si usa quando il client vuole avere delle informazioni per decidere
se richiedere o no la pagina;
PUT, DELETE, LINK, UNLINK non sono di norma disponibili per un client,
tranne che in quei casi in cui l'utente sia abilitato alla configurazione
remota (via Web) del server Web.
Ad esempio, supponiamo che nel file HTML visualizzato sul client vi sia
un'ancora:
e che l'utente attivi tale link. A tal punto il client:
chiede al DNS l'indirizzo IP di somewhere.net;
apre una connessione TCP con somewhere.net, port 80;
invia la sua richiesta.
Essa è costituita da un insieme di comandi (uno per ogni linea di
testo) terminati con una linea vuota:
GET /products/toasters/index.html HTTP/1.0
Metodo, URL e versione protocollo
User-agent: Mozilla/3.0
Tipo del client
Host: 160.10.5.43
Indirizzo IP del client
Accept: text/html
Client accetta pagine HTML
Accept: image/gif
Client accetta immagini
Accept: application/octet-stream
Client accetta file binari qualunque
If-modified-since: data e ora
Inviare il documento solo se è più recente
della data specificata
La risposta del server
La risposta del server è articolata in più parti, perché
c'è un problema di fondo: come farà il client a sapere in
che modo dovrà gestire le informazioni che gli arriveranno?
Ovviamente, non si può mostrare sotto forma di testo un'immagine
o un file sonoro! Dunque, si deve informare il client sulla natura dei
dati che gli arriveranno prima di iniziare a spedirglieli.
Per questo motivo la risposta consiste di 3 parti:
una riga di stato, che indica
quale esito ha avuto la richiesta (tutto ok, errore, ecc.);
delle metainformazioni
che descrivono la natura delle informazioni che seguono;
le informazioni vere e proprie
(ossia, l'oggetto richiesto).
La riga di stato, a sua volta, consiste di tre parti:
Versione del protocollo http;
Codice numerico di stato;
Specifica testuale dello stato.
Tipici codici di stato sono:
Esito
Codice numerico
Specifica testuale
Tutto ok
200
OK
Documento spostato
301
Moved permanently
Richiesta di autenticazione
401
Unauthorized
Richiesta di pagamento
402
Payment required
Accesso vietato
403
Forbidden
Documento non esistente
404
Not found
Errore nel server
500
Server error
Dunque, ad esempio, si potrà avere
HTTP/1.0 200 OK
Le metainformazioni dicono al client ciò che deve sapere per
poter gestire correttamente i dati che riceverà.
Sono elencate in linee di testo successive alla riga di stato e terminano
con una linea vuota.
Tipiche metainformazioni sono:
Server: ...
Identifica il tipo di server
Date: ...
Data e ora della risposta
Content-type: ...
Tipo dell'oggetto inviato
Content-length: ...
Numero di byte dell'oggetto inviato
Content-language: ...
Linguaggio delle informazioni
Last-modified: ...
Data e ora di ultima modifica
Content-encoding: ...
Tipo di decodifica per ottenere il content
Il Content-type si specifica usando lo standard
MIME (
Multipurpose Internet Mail Exchange), nato originariamente
per estendere la funzionalità della posta elettronica.
Un tipo MIME è specificato da una coppia
MIME type/MIME subtype
Vari tipi MIME sono definiti, e molti altri continuano ad aggiungersi.
I più comuni sono:
Type/Subtype
Estensione
Tipologia delle informazioni
text/plain
.txt, .java
testo
text/html
.html, .htm
pagine html
image/gif
.gif
immagini gif
image/jpeg
.jpeg, .jpg
immagini jpeg
audio/basic
.au
suoni
video/mpeg
.mpeg
filmati
application/octet-stream
.class, .cla, .exe
programmi eseguibili
application/postscript
.ps
documenti Postscript
x-world/x-vrml
.vrml, .wrl
scenari 3D
Il server viene configurato associando alle varie estensioni i corrispondenti
tipi MIME. Quando gli viene chiesto un file, deduce dall'estensione e dalla
propria configurazione il tipo MIME che deve comunicare al client.
Se la corrispondenza non è nota, si usa quella di default (tipicamente
text/html), il che può causare errori in fase di visualizzazione.
Anche la configurazione del client (in merito alle applicazioni helper)
si fa sulla base dei tipi MIME.
Tornando al nostro esempio, una richiesta del client quale:
GET /products/toasters/index.html HTTP/1.0
User-agent: Mozilla/3.0
ecc.
riceverà come risposta dal server (supponendo che non ci siano
errori) le metainformazioni, poi una riga vuota e quindi il contenuto del
documento (in questo caso una pagina HTML costituita di 6528 byte):
HTTP/1.0 200 OK
Server: NCSA/1.4
Date: Tue, july 4, 1996 19:17:05 GMT
Content-type: text/html
Content-length: 6528
Content-language: en
Last-modified: Mon, july 3, 1996 15:05:35 GMT
il protocollo HTTP è molto semplice, essendo basato su interazioni
che prevedono esclusivamente l'invio di una singola richiesta e la ricezione
della relativa risposta;
questa semplicità è insieme un punto di forza e di
debolezza:
di forza perché è facilissimo, attraverso la definizione
di nuovi tipi MIME e di corrispondenti funzioni sui client, estendere le
tipologie di informazioni gestibili (il server non entra nel merito di
ciò che contengono i file: si limita a consegnare i dati che gli
vengono richiesti, senza preoccuparsi della loro semantica);
di debolezza perché queste estensioni di funzionalità talvolta
mal si adattano alla concezione originaria (stateless) del protocollo,
come ad esempio è il caso delle transazioni commerciali.