Uniform Resource Identifiers

URI

Ora ci interessa evidenziare il fatto che in corrispondenza di un nodo (sia esso identificato da un indirizzo IP o da un nome di dominio) possono essere presenti diverse risorse messe a disposizione per essere raggiungibili attraverso l'Internet.

Lo standard che attualmente consente di ottenere un riferimento universale e univoco per ogni risorsa disponibile nell'Internet si chiama URI (Uniform Resource Identifiers) ed è così definito perché progettato secondo le seguenti linee guida (l'esposizione che segue è una traduzione praticamente letterale di parti estratte dalla RFC2396):

Uniforme
L'uniformità offre importanti vantaggi:
  • differenti tipi di risorse possono essere usate nello stesso contesto, anche se il meccanismo di accesso è differente di caso in caso;
  • permette di adottare un'interpretazione semantica uniforme di convenzioni sintattiche comuni a diversi indentificatori di risorse;
  • permette di introdurre nuovi tipi di identificatori senza interferire nel modo in cui sono usati quelli esistenti;
  • gli identificatori possono essere riusati in molti contesti differenti, consentendo così a nuove applicazioni o protocolli di utilizzare identificatori già definiti e ben noti.
Risorsa
Si definisce risorsa qualunque cosa possa avere un'identità. Esempi comuni sono documenti elettronici, immagini, servizi a collezioni di altre risorse. Non tutte le risorse risulano effettivamente reperibili attraverso la rete: per esempio gli esseri umani, le organizzazioni i libri in una biblioteca possono essere considerate risorse.
La risorsa è una mappa concettuale di un'entità o di un insieme di entità. Una risorsa non coincide necessariamente con l'entità mappata in un determinato istante di tempo. Quindi una risorsa può restare costante anche se il suo contenuto (ossia le entità che le corrispondono di volta in volta) cambia nel tempo, purché la mappa concettuale non cambi durante il processo.
Identificatore
Un identificatore è un oggetto che può fare da riferimento a qualche cosa che abbia un'identità. Nel caso degli URI tale oggetto è una sequenza di caratteri che rispetta una precisa sintassi.

Una volta identificata una risorsa, un sistema può eseguire su di essa diverse operazioni, come per esempio: "accedere", "aggiornare" o "rilevarne gli attributi" («Qual è in questo momento la temperatura a Bombay ?»).


URI, URL, URN

Un identificatore (URI) può essere ulteriormente classificato come una locazione, un nome o entrambi.

Esistono un certo numero di schemi per le URI, corrispondenti alle tipologie di servizi che differenti risorse possono offrire o costituire. Frequentemente gli schemi corrispondono ai diversi protocolli usati a livello applicativo in internet (gli stessi nomi degli schemi corrispondono spesso ai nomi dei rispettivi protocolli). Tuttavia non è necessariamente vero che per accedere a una risorsa si debba necessariamente fare uso del protocollo dichiarato nello schema dell'URI; la risoluzione di alcuni URI può anche richiedere l'uso di più di un protocollo (per esempio, per raggiungere una risorsa identificata da un URL http richiede tipicamente l'uso tanto del protocollo DNS quanto dell'HTTP).

Il concetto di URN è focalizzato sulla persistenza del nome, più che dalla costanza della localizzazione. Tali identificatori sono tratti da un insieme di "namespaces" definiti, ciascuno dei quali possiede la propria struttura di insiemi di nomi e le proprie regole di assegnamento.


Esempi di URI

ftp://ftp.is.co.za/rfc/rfc1808.txt
schema ftp per un servizio di File Transfer Protocol (la risorsa in questo caso è un file)
http://www.math.uio.no/faq/compression-faq/part1.html
schema http per una pagina web
mailto:marco.panizza@unipv.it
schema mailto per un indirizzo di posta elettronica
news:comp.infosystems.www.servers.unix
schema news per news group e articoli USENET
telnet://melvyl.ucop.edu/
schema telnet per servizi interattivi mediante protocollo TELNET

Sintassi comune

La sintassi generale delle URI è molto complessa e viene espressa nelle specifiche da un insieme di regole di layout e BNF (Backus-Naur Form, un metalinguaggio comunemente utilizzato per definire le regole sintattiche di linguaggi artificiali). Ne diamo qui solo una vista ristretta, valida comunque nella maggior parte dei casi incontrati in pratica.

La sintassi più generale per gli URI è esprimibile con la seguente forma di layout:
   <scheme>:<scheme-specific-part>

Molti schemi tuttavia (anche se non necessariamente tutti) sono formati secondo un comune layout più di dettaglio:
    <scheme>://<authority><path>?<query>

Ove (non tutte le parti sono sempre presenti):

<scheme>
rappresenta il servizio, solitamente riferito al nome di un protocollo applicativo
<authority>
è a sua volta strutturata come
<userinfo>@<host>:<port>
ove (non tutte le parti sono sempre presenti):
<userinfo>
rappresenta i dati di accreditamento di un utente (a volte nella forma user:password, oramai sostanzialmente deprecata in quanto la presenza di una password in chiaro costituisce un rischio per la sicurezza)
<host>
è un indirizzo IP oppure un nome di dominio (DNS)
<port>
è un numero di porta, su cui è il server ha aperto un socket in ascolto
<path>
è un path gerarchico, con i vari livelli separati da slash ('/')
<query>
è una successione di dichiarazioni di parametri valorizzati, separate da '&', ciascuna nella forma <name>=<value>


Codifica

Gli URI sono codificati in US-ASCII a 7 bit con esclusione dei caratteri di controllo (tabella G0 dello standard ISO/IEC 2022).

Di tale insieme di caratteri, come abbiamo visto, alcuni sono impiegati come separatori, di conseguenza, all'interno dei token non tutti i caratteri sono ammessi. In particolare vi sono vietati o sconsigliati:
    spazio, '/', ':', '@', '?', '&', '#', '%', '<', '>', '=', '"', '+', '$', '{', '}', '[', ']', '|', '\', '^'
vi possono tuttavia essere casi in cui è necessario (se riconosciuto nello schema o nel namespace di pertinenza) usare anche all'interno dei token di un URI alcuni di tali caratteri. In tali casi si deve ricorrere all'escaping formato dal carattere di percentuale seguito dalle due cifre esadecimali del codice ASCII del carattere in questione. Per esempio %20 rappresenta lo spazio; in questo particolare caso va tuttavia ricordato anche che, in alcuni schemi di URL, il carattere '+' viene interpretato come spazio.

uri (7K)