X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=sockctrl.tex;h=5efe128ba47c01c7c95b5ad630c5c2993f2d4de5;hp=24c752fc16cca510da7ca5a3be8850f1cd06c713;hb=062e1036f07efd623e11b5bb194bcf2684dd7866;hpb=8bfe80f7fe2470bf0a26d656b281ea44c69d8fe5 diff --git a/sockctrl.tex b/sockctrl.tex index 24c752f..5efe128 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -84,31 +84,95 @@ direttive che possono essere usate in questi file, che si trovano nelle relative pagine di manuale. Con il tempo però è divenuto possibile fornire diversi sostituti per -l'utilizzo delle associazione statiche in \file{/etc/hosts}, inoltre oltre all -risoluzione dei nomi a dominio si sono aggiunti altri nomi da risolvere, come -quelli associati alle reti ed ai gruppi di macchine definiti dal servizio NIS, -o quelli dei protocolli e dei servizi mantenuti nei file statici -\file{/etc/protocols} e \file{/etc/services}, tutte informazioni che -normalmente non si trovano su un DNS, ma che in un ambiente distribuito +l'utilizzo delle associazione statiche in \file{/etc/hosts}, inoltre oltre +alla risoluzione dei nomi a dominio ci sono anche altri nomi da risolvere, +come quelli che possono essere associati ad una rete (invece che ad una +singola macchina) o ai gruppi di macchine definiti dal servizio NIS, o come +quelli dei protocolli e dei servizi che sono mantenuti nei file statici +\file{/etc/protocols} e \file{/etc/services}. Tutte queste sono informazioni +che normalmente non si trovano su un DNS, ma che in un ambiente distribuito possono essere centralizzate su opportuni server (ad esempio su LDAP) in grado di mantenerle. + + +Il sistema del \textit{Name Service Switch} (cui faremo riferimento in seguito +con l'acronimo NSS) è un sistema di librerie dinamiche che permette di +definire in maniera generica sia i supporti su cui mantenere i dati di +corrispondenza fra nomi e valori numerici, sia l'ordine in cui effettuare le +ricerche sui vari supporti disponibili. Il sistema prevede una serie di +possibili classi di corrispondenza, riportate in +tab.~\ref{tab:sys_NSS_classes}. + +\begin{table}[htb] + \footnotesize + \centering + \begin{tabular}[c]{|l|p{8cm}|} + \hline + \textbf{Classe} & \textbf{Tipo di corrispondenza}\\ + \hline + \hline + \texttt{shadow} & corrispondenze fra username e proprietà dell'utente + (\acr{uid}, ecc.).\\ + \texttt{group} & corrispondenze fra nome del gruppo e proprietà dello + stesso.\\ + \texttt{aliases} & alias per la posta elettronica\\ + \texttt{ethers} & corrispondenze fra numero IP e MAC address della + scheda di rete.\\ + \texttt{hosts} & corrispondenze fra nome a dominio e numero IP.\\ + \texttt{netgroup} & corrispondenze gruppo di rete e macchine che lo + compongono.\\ + \texttt{networks} & corrispondenze fra nome di una rete e suo indirizzo + IP.\\ + \texttt{protocols}& corrispondenze fra nome di un protocollo e relativo + numero identificativo.\\ + \texttt{rpc} & corrispondenze fra nome di un servizio RPC e relativo + numero identificativo.\\ + \texttt{services} & corrispondenze fra nome di un servizio e numero di + porta. \\ + \hline + \end{tabular} + \caption{Le diverse classi di corrispondenze definite + all'interno del \textit{Name Service Switch}.} + \label{tab:sys_NSS_classes} +\end{table} + + + Questo ha portato alla creazione di un sistema di risoluzione più ampio, il \textit{Name Service Switch} di cui il \textit{resolver} viene a costituire un -sottoinsieme. Questo sistema, che si applica anche alla risoluzioni fra nomi -di utenti e gruppi e relativi identificatori, permette di definire in maniera -generica (attraverso una serie di librerie dinamiche) sia i supporti su cui -mantenere i dati di corrispondenza fra nomi e valori numerici, sia l'ordine in -cui effettuare le ricerche sui vari supporti disponibili. Il sistema è +sottoinsieme. Questo sistema permette di definire in maniera generica +(attraverso una serie di librerie dinamiche) sia i supporti su cui mantenere i +dati di corrispondenza fra nomi e valori numerici, sia l'ordine in cui +effettuare le ricerche sui vari supporti disponibili. Il sistema è controllato dal file \file{/etc/nsswitch.conf}, ed anche per questo si può fare riferimento alle pagine di manuale ed al relativo capitolo nel manuale \cite{glibc} delle \textsl{glibc}. +Il +sistema è controllato dal file \file{/etc/nsswitch.conf}, ed anche per questo +si può fare riferimento alle pagine di manuale ed al relativo capitolo nel +manuale \cite{glibc} delle \textsl{glibc}. + + + +Per questo motivo anche il sistema del \textit{resolver} è stato poi incluso +all'interno del sistema sistema di risoluzione più ampio costituito dal +\textit{Name Service Switch} che abbiamo visto in +sez.~\ref{sec:sys_user_group}, dove sono previste le funzionalità di controllo +per la risoluzione anche di questo tipo di corrispondenze. Questo significa +allora, per quanto riguarda la risoluzione dei nomi a dominio, che oltre ai +file che abbiamo appena illustrato, dovremo tenere in considerazione anche il +contenuto del file \file{/etc/nsswitch.conf}. + In ogni caso, qualunque sia la modalità con cui ricevono i dati o il supporto -su cui vengono mantenuti, dal punto di vista di un programma che deve -effettuare la risoluzione di un nome, tutto quello che conta sono le funzioni -che il \textit{resolver} mette a disposizione, e sono queste quelle che -tratteremo nelle sezioni successive. +su cui vengono mantenuti, e che si usino o meno funzionalità aggiuntive +fornire dal sistema del \textit{Name Service Switch}, dal punto di vista di un +programma che deve effettuare la risoluzione di un nome, tutto quello che +conta sono le funzioni che il \textit{resolver} mette a +disposizione,\footnote{è cura della implementazione fattane nelle \acr{glibc} + tenere conto della presenza del \textit{Name Service Switch}.} e sono queste +quelle che tratteremo nelle sezioni successive. @@ -146,32 +210,33 @@ fallita. \begin{minipage}[c]{15cm} \includestruct{listati/hostent.h} \end{minipage} - \caption{La struttura \structd{hostent} .} + \caption{La struttura \structd{hostent}.} \label{fig:sock_hostent_struct} \end{figure} Per questo motivo all'interno del resolver è stata definita una apposita variabile di errore, \var{h\_errno} che viene utilizzata dalle funzioni di libreria per indicare quale problema ha causato il fallimento della -risoluzione. Ad essa si può accedere una volta che la si dichiara con: -\includecodesnip{listati/herrno.c} +risoluzione del nome. Ad essa si può accedere una volta che la si dichiara +con: +\includecodesnip{listati/herrno.c} ed i valori che può assumere sono i seguenti: \begin{basedescript}{\desclabelwidth{3cm}\desclabelstyle{\nextlinelabel}} \item[\const{HOST\_NOT\_FOUND}] l'indirizzo richiesto non è valido e la macchina indicata è sconosciuta. \item[\const{NO\_ADDRESS}] il nome a dominio richiesto è valido, ma non ha un - indirizzo associato ad esso. + indirizzo associato ad esso (alternativamente può essere indicato come + \const{NO\_DATA}). \item[\const{NO\_RECOVERY}] si è avuto un errore non recuperabile nell'interrogazione di un server DNS. \item[\const{TRY\_AGAIN}] si è avuto un errore temporaneo nell'interrogazione di un server DNS, si può ritentare l'interrogazione in un secondo tempo. \end{basedescript} - Per capire meglio il contenuto della struttura \struct{hostent} conviene spendere alcune parole sul funzionamento del DNS. Questo in sostanza è un database distribuito organizzato in maniera gerarchica, interrogando il quale -si possono avere una serie di informazioni la principale delle quali è la +si possono avere una serie di informazioni, la principale delle quali è la corrispondenza fra un nome (a dominio) ed indirizzo IP. Un server DNS contiene comunque una serie di altre informazioni; ciascuna voce nel database viene chiamata \textit{resource record} e vi è associato un certo @@ -202,22 +267,31 @@ effettuare la risoluzione del nome, vengono riempite le varie parti della struttura \struct{hostent}. Il primo campo della struttura, \var{h\_name} contiene sempre il \textsl{nome canonico}, che nel caso del DNS è appunto il nome associato ad un record -\texttt{A}. Il secondo campo della struttura invece è un puntatore ad vettore -di puntatori, terminato da un puntatore nullo. Ciascun puntatore del vettore -fa riferimento ad una delle stringhe che contengono tutti i possibili altri -nomi associati allo stesso indirzzo (quelli che nel DNS sarebbero record -\texttt{CNAME}). - -Il terzo campo, \var{h\_addrtype}, indica il tipo di indirizzo che è stato -restituito, e può essere solo \const{AF\_INET} o \const{AF\_INET6}, mentre il -quarto campo, \var{h\_length}, indica la lunghezza dell'indirizzo stesso in -byte. Infine il campo \var{h\_addr\_list} è il puntatore ad un vettore di -puntatori ai singoli indirizzi; il vettore è terminato da un puntatore nullo. -Inoltre, come illustrato in fig.~\ref{fig:sock_hostent_struct}, viene definito -per compatibilità il campo \var{h\_addr} corrispondente al puntatore al primo +\texttt{A}. Il secondo campo della struttura, \var{h\_aliases}, invece è un +puntatore ad vettore di puntatori, terminato da un puntatore nullo. Ciascun +puntatore del vettore punta ad una stringa contenente uno degli altri +possibili nomi associati allo stesso \textsl{nome canonico} (quelli che nel +DNS vengono inseriti come record di tipo \texttt{CNAME}). + +Il terzo campo della struttura, \var{h\_addrtype}, indica il tipo di indirizzo +che è stato restituito, e può assumere soltanto i valori \const{AF\_INET} o +\const{AF\_INET6}, mentre il quarto campo, \var{h\_length}, indica la +lunghezza dell'indirizzo stesso in byte. Infine il campo \var{h\_addr\_list} è +il puntatore ad un vettore di puntatori ai singoli indirizzi; il vettore è +terminato da un puntatore nullo. Inoltre, come illustrato in +fig.~\ref{fig:sock_hostent_struct}, viene definito il campo \var{h\_addr} come +sinonimo di \code{h\_addr\_list[0]}, cioè un riferimento diretto al primo indirizzo della lista. -In sostanza + + +Oltre ai normali nomi a dominio la funzione accetta come argomento +\param{name} anche indirizzi numerici, in formato dotted decimal per IPv4 o +con la notazione illustrata in sez.~\ref{sec:IP_ipv6_notation}. In tal caso +\func{gethostbyname} non eseguirà nessuna interrogazione remota, ma si +limiterà a copiare la stringa nel campo \var{h\_name} ed a creare la +corrispondente struttura \var{in\_addr} da indirizzara con +\code{h\_addr\_list[0]}.