3 %% Copyright (C) 2004 Simone Piccardi. Permission is granted to
4 %% copy, distribute and/or modify this document under the terms of the GNU Free
5 %% Documentation License, Version 1.1 or any later version published by the
6 %% Free Software Foundation; with the Invariant Sections being "Prefazione",
7 %% with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the
8 %% license is included in the section entitled "GNU Free Documentation
11 \chapter{La gestione dei socket}
12 \label{cha:sock_generic_management}
14 Esamineremo in questo capitolo una serie di funzionalità aggiuntive relative
15 alla gestione dei socket, come la gestione della risoluzione di nomi e
16 indirizzi, le impostazioni delle varie proprietà ed opzioni relative ai
17 socket, e le funzioni di controllo che permettono di modificarne il
21 \section{La risoluzione dei nomi}
22 \label{sec:sock_name_resolution}
24 Negli esempi dei capitoli precedenti abbiamo sempre identificato le singole
25 macchine attraverso indirizzi numerici, sfruttando al più le funzioni di
26 conversione elementare illustrate in sez.~\ref{sec:sock_addr_func} che
27 permettono di passare da un indirizzo espresso in forma dotted decimal ad un
28 numero. Vedremo in questa sezione le funzioni utilizzate per poter utilizzare
29 dei nomi simbolici al posto dei valori numerici, e viceversa quelle che
30 permettono di ottenere i nomi simbolici associati ad indirizzi, porte o altre
31 proprietà del sistema.
34 \subsection{La struttura del \textit{resolver}}
35 \label{sec:sock_resolver}
37 La risoluzione dei nomi è associata tradizionalmente al servizio del
38 \textit{Domain Name Service} che permette di identificare le macchine su
39 internet invece che per numero IP attraverso il relativo \textsl{nome a
40 dominio}. In realtà per DNS si intendono spesso i server che forniscono su
41 internet questo servizio, mentre nel nostro caso affronteremo la problematica
42 dal lato client, di un qualunque programma che necessita di compiere questa
47 \includegraphics[width=10cm]{img/resolver}
48 \caption{Schema di funzionamento delle routine del \textit{resolver}.}
49 \label{fig:sock_resolver_schema}
52 Inoltre quella fra nomi a dominio e indirizzi IP non è l'unica corrispondenza
53 possibile fra nomi simbolici e valori numerici, come abbiamo visto anche in
54 sez.~\ref{sec:sys_user_group} per le corrispondenze fra nomi di utenti e
55 gruppi e relativi identificatori numerici; per quanto riguarda però tutti i
56 nomi associati a identificativi o servizi relativi alla rete il servizio di
57 risoluzione è gestito in maniera unificata da un insieme di routine fornite
58 con le librerie del C, detto appunto \textit{resolver}.
60 Lo schema di funzionamento del \textit{resolver} è illustrato in
61 fig.~\ref{fig:sock_resolver_schema}; in sostanza i programmi hanno a
62 disposizione un insieme di funzioni di libreria con cui chiamano il
63 \textit{resolver}, indicate con le freccie nere. Ricevuta la richiesta è
64 quest'ultimo che, sulla base della sua configurazione, esegue le operazioni
65 necessarie a fornire la risposta, che possono essere la lettura delle
66 informazioni mantenute nei relativi dei file statici presenti sulla macchina,
67 una interrogazione ad un DNS (che a sua volta, per il funzionamento del
68 protocollo può interrogarene altri) o la richiesta ad altri server per i quali
69 sia fornito il supporto, come LDAP.
71 La configurazione del resolver attiene più alla amministrazione di sistema che
72 alla programmazione, ciò non di meno, prima di trattare le varie funzioni che
73 vale la pena farne una panoramica. Originariamente la configurazione
74 riguardava esclusivamente le questioni relative alla gestione dei nomi a
75 dominio, e prevedeva solo l'utilizzo del DNS e del file statico
78 In questo caso il file di configurazione principale è \file{/etc/resolv.conf}
79 che contiene in sostanza l'elenco dei server DNS da contattare, a cui si
80 affianca il file \file{/etc/host.conf} il cui scopo principale è indicare
81 l'ordine in cui eseguire la risoluzione dei nomi (se usare prima i valori di
82 \file{/etc/hosts} o il DNS); tralasciamo i dettagli relativi alle varie
83 direttive che possono essere usate in questi file, che si trovano nelle
84 relative pagine di manuale.
86 Con il tempo però è divenuto possibile fornire diversi sostituti per
87 l'utilizzo delle associazione statiche in \file{/etc/hosts}, inoltre oltre
88 alla risoluzione dei nomi a dominio ci sono anche altri nomi da risolvere,
89 come quelli che possono essere associati ad una rete (invece che ad una
90 singola macchina) o ai gruppi di macchine definiti dal servizio NIS, o come
91 quelli dei protocolli e dei servizi che sono mantenuti nei file statici
92 \file{/etc/protocols} e \file{/etc/services}. Tutte queste sono informazioni
93 che normalmente non si trovano su un DNS, ma che in un ambiente distribuito
94 possono essere centralizzate su opportuni server (ad esempio su LDAP) in grado
99 Il sistema del \textit{Name Service Switch} (cui faremo riferimento in seguito
100 con l'acronimo NSS) è un sistema di librerie dinamiche che permette di
101 definire in maniera generica sia i supporti su cui mantenere i dati di
102 corrispondenza fra nomi e valori numerici, sia l'ordine in cui effettuare le
103 ricerche sui vari supporti disponibili. Il sistema prevede una serie di
104 possibili classi di corrispondenza, riportate in
105 tab.~\ref{tab:sys_NSS_classes}.
110 \begin{tabular}[c]{|l|p{8cm}|}
112 \textbf{Classe} & \textbf{Tipo di corrispondenza}\\
115 \texttt{shadow} & corrispondenze fra username e proprietà dell'utente
117 \texttt{group} & corrispondenze fra nome del gruppo e proprietà dello
119 \texttt{aliases} & alias per la posta elettronica\\
120 \texttt{ethers} & corrispondenze fra numero IP e MAC address della
122 \texttt{hosts} & corrispondenze fra nome a dominio e numero IP.\\
123 \texttt{netgroup} & corrispondenze gruppo di rete e macchine che lo
125 \texttt{networks} & corrispondenze fra nome di una rete e suo indirizzo
127 \texttt{protocols}& corrispondenze fra nome di un protocollo e relativo
128 numero identificativo.\\
129 \texttt{rpc} & corrispondenze fra nome di un servizio RPC e relativo
130 numero identificativo.\\
131 \texttt{services} & corrispondenze fra nome di un servizio e numero di
135 \caption{Le diverse classi di corrispondenze definite
136 all'interno del \textit{Name Service Switch}.}
137 \label{tab:sys_NSS_classes}
142 Questo ha portato alla creazione di un sistema di risoluzione più ampio, il
143 \textit{Name Service Switch} di cui il \textit{resolver} viene a costituire un
144 sottoinsieme. Questo sistema permette di definire in maniera generica
145 (attraverso una serie di librerie dinamiche) sia i supporti su cui mantenere i
146 dati di corrispondenza fra nomi e valori numerici, sia l'ordine in cui
147 effettuare le ricerche sui vari supporti disponibili. Il sistema è
148 controllato dal file \file{/etc/nsswitch.conf}, ed anche per questo si può
149 fare riferimento alle pagine di manuale ed al relativo capitolo nel manuale
150 \cite{glibc} delle \textsl{glibc}.
153 sistema è controllato dal file \file{/etc/nsswitch.conf}, ed anche per questo
154 si può fare riferimento alle pagine di manuale ed al relativo capitolo nel
155 manuale \cite{glibc} delle \textsl{glibc}.
159 Per questo motivo anche il sistema del \textit{resolver} è stato poi incluso
160 all'interno del sistema sistema di risoluzione più ampio costituito dal
161 \textit{Name Service Switch} che abbiamo visto in
162 sez.~\ref{sec:sys_user_group}, dove sono previste le funzionalità di controllo
163 per la risoluzione anche di questo tipo di corrispondenze. Questo significa
164 allora, per quanto riguarda la risoluzione dei nomi a dominio, che oltre ai
165 file che abbiamo appena illustrato, dovremo tenere in considerazione anche il
166 contenuto del file \file{/etc/nsswitch.conf}.
168 In ogni caso, qualunque sia la modalità con cui ricevono i dati o il supporto
169 su cui vengono mantenuti, e che si usino o meno funzionalità aggiuntive
170 fornire dal sistema del \textit{Name Service Switch}, dal punto di vista di un
171 programma che deve effettuare la risoluzione di un nome, tutto quello che
172 conta sono le funzioni che il \textit{resolver} mette a
173 disposizione,\footnote{è cura della implementazione fattane nelle \acr{glibc}
174 tenere conto della presenza del \textit{Name Service Switch}.} e sono queste
175 quelle che tratteremo nelle sezioni successive.
179 \subsection{La risoluzione dei nomi a dominio}
180 \label{sec:sock_gethostbyname}
182 Dato che la principale funzionalità del \textit{resolver} resta quella di
183 risolvere i nomi a dominio in indirizzi IP, vedremo per prime le funzioni a
184 questo dedicate. La prima funzione è \funcd{gethostbyname} il cui scopo è
185 ottenere l'indirizzo di una stazione noto il suo nome a dominio, il suo
187 \begin{prototype}{netdb.h}
188 {struct hostent *gethostbyname(const char *name)}
190 Determina l'indirizzo associato al nome a dominio \param{name}.
192 \bodydesc{La funzione restituisce in caso di successo il puntatore ad una
193 struttura di tipo \struct{hostent} contente i dati associati al nome a
194 dominio o un puntatore nullo in caso di errore.}
197 La funzione prende come argomento una stringa \param{name} contenente il nome
198 a dominio che si vuole risolvere, in caso di successo i dati ad esso relativi
199 vengono memorizzati in una opportuna struttura \struct{hostent} la cui
200 definizione è riportata in fig.~\ref{fig:sock_hostent_struct}. In caso di
201 insuccesso l'errore viene segnalato da un valore nullo del puntatore, ma in
202 questo caso, a differenza delle funzioni viste finora, non viene utilizzata la
203 variabile \var{errno} per riportare un codice di errore, in quanto questo
204 dipende solo dalle sottostanti chiamate al sistema e può non avere nessun
205 significato nell'indicare quale parte del procedimento di risoluzione è
209 \footnotesize \centering
210 \begin{minipage}[c]{15cm}
211 \includestruct{listati/hostent.h}
213 \caption{La struttura \structd{hostent}.}
214 \label{fig:sock_hostent_struct}
217 Per questo motivo all'interno del resolver è stata definita una apposita
218 variabile di errore, \var{h\_errno} che viene utilizzata dalle funzioni di
219 libreria per indicare quale problema ha causato il fallimento della
220 risoluzione del nome. Ad essa si può accedere una volta che la si dichiara
222 \includecodesnip{listati/herrno.c}
223 ed i valori che può assumere sono i seguenti:
224 \begin{basedescript}{\desclabelwidth{3cm}\desclabelstyle{\nextlinelabel}}
225 \item[\const{HOST\_NOT\_FOUND}] l'indirizzo richiesto non è valido e la
226 macchina indicata è sconosciuta.
227 \item[\const{NO\_ADDRESS}] il nome a dominio richiesto è valido, ma non ha un
228 indirizzo associato ad esso (alternativamente può essere indicato come
230 \item[\const{NO\_RECOVERY}] si è avuto un errore non recuperabile
231 nell'interrogazione di un server DNS.
232 \item[\const{TRY\_AGAIN}] si è avuto un errore temporaneo nell'interrogazione
233 di un server DNS, si può ritentare l'interrogazione in un secondo tempo.
236 Per capire meglio il contenuto della struttura \struct{hostent} conviene
237 spendere alcune parole sul funzionamento del DNS. Questo in sostanza è un
238 database distribuito organizzato in maniera gerarchica, interrogando il quale
239 si possono avere una serie di informazioni, la principale delle quali è la
240 corrispondenza fra un nome (a dominio) ed indirizzo IP. Un server DNS
241 contiene comunque una serie di altre informazioni; ciascuna voce nel database
242 viene chiamata \textit{resource record} e vi è associato un certo
243 \textsl{tipo}, identificato da una sigla. Per quanto ci interessa i tipi di
244 \textit{resource record} che vengono utilizzati dal \textit{resolver} sono
245 sostanzialmente i seguenti:
246 \begin{basedescript}{\desclabelwidth{1.2cm}\desclabelstyle{\nextlinelabel}}
247 \item[\texttt{A}] indica la corripondenza fra un nome a dominio ed un
248 indirizzo IPv4, ad esempio la corrispondenza fra \texttt{dodds.truelite.it}
249 e l'indirizzo IP \texttt{62.48.34.25}.
250 \item[\texttt{AAAA}] chiamato in questo modo dato che la dimensione è quattro
251 volte quella di un indirizzo IPv4, questo record contiene la corrispondenza
252 fra un nome a dominio ed un indirizzo IPv6.
253 \item[\texttt{PTR}] per provvedere la mappatura inversa fra un indirizzo IP ed
254 un nome a dominio si utilizza invece questo tipo di record (il cui nome sta
255 per \textit{pointer}).
256 \item[\texttt{CNAME}] qualora si abbiamo più nomi con i quali si voglia
257 indicare lo stesso indirizzo (ad esempio \texttt{www.truelite.it}, o
258 \texttt{sources.truelite.it}, che comunque fanno sempre riferimento alla
259 macchina \texttt{dodds.truelite.it}) si può usare questo tipo di record per
260 creare degli \textit{alias} in modo da associare un qualunque altro nome al
261 \textsl{nome canonico} della macchina (quello associato al record
265 Quando un programma chiama \func{gethostbyname} e questa usa il DNS per
266 effettuare la risoluzione del nome, è con i valori di questi record che
267 vengono riempite le varie parti della struttura \struct{hostent}. Il primo
268 campo della struttura, \var{h\_name} contiene sempre il \textsl{nome
269 canonico}, che nel caso del DNS è appunto il nome associato ad un record
270 \texttt{A}. Il secondo campo della struttura, \var{h\_aliases}, invece è un
271 puntatore ad vettore di puntatori, terminato da un puntatore nullo. Ciascun
272 puntatore del vettore punta ad una stringa contenente uno degli altri
273 possibili nomi associati allo stesso \textsl{nome canonico} (quelli che nel
274 DNS vengono inseriti come record di tipo \texttt{CNAME}).
276 Il terzo campo della struttura, \var{h\_addrtype}, indica il tipo di indirizzo
277 che è stato restituito, e può assumere soltanto i valori \const{AF\_INET} o
278 \const{AF\_INET6}, mentre il quarto campo, \var{h\_length}, indica la
279 lunghezza dell'indirizzo stesso in byte. Infine il campo \var{h\_addr\_list} è
280 il puntatore ad un vettore di puntatori ai singoli indirizzi; il vettore è
281 terminato da un puntatore nullo. Inoltre, come illustrato in
282 fig.~\ref{fig:sock_hostent_struct}, viene definito il campo \var{h\_addr} come
283 sinonimo di \code{h\_addr\_list[0]}, cioè un riferimento diretto al primo
284 indirizzo della lista.
288 Oltre ai normali nomi a dominio la funzione accetta come argomento
289 \param{name} anche indirizzi numerici, in formato dotted decimal per IPv4 o
290 con la notazione illustrata in sez.~\ref{sec:IP_ipv6_notation}. In tal caso
291 \func{gethostbyname} non eseguirà nessuna interrogazione remota, ma si
292 limiterà a copiare la stringa nel campo \var{h\_name} ed a creare la
293 corrispondente struttura \var{in\_addr} da indirizzara con
294 \code{h\_addr\_list[0]}.
302 \section{Le opzioni dei socket}
303 \label{sec:TCP_sock_options}
305 Finora abbiamo trattato i socket nel loro comportamento più comune, è però
306 possibile attivare alcune modalità diverse di funzionamento degli stessi
308 Dato che la maggior parte delle opzioni dei socket sono relative ai socket
309 TCP, ed hanno poi significato analogo quando usate con altri socket, abbiamo
310 preferito trattare l'argomento in generale in questa sezione piuttosto che nel
311 capitolo dedicato alla trattazione generica dei socket.
313 \section{Altre funzioni di controllo}
314 \label{sec:TCP_sock_ctrl}
322 %%% TeX-master: "gapil"