5efe128ba47c01c7c95b5ad630c5c2993f2d4de5
[gapil.git] / sockctrl.tex
1 %% sockctrl.tex
2 %%
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
9 %% License".
10 %%
11 \chapter{La gestione dei socket}
12 \label{cha:sock_generic_management}
13
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
18 comportamento.
19
20
21 \section{La risoluzione dei nomi}
22 \label{sec:sock_name_resolution}
23
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.
32
33
34 \subsection{La struttura del \textit{resolver}}
35 \label{sec:sock_resolver}
36
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
43 operazione.
44
45 \begin{figure}[htb]
46   \centering
47   \includegraphics[width=10cm]{img/resolver}
48   \caption{Schema di funzionamento delle routine del \textit{resolver}.}
49   \label{fig:sock_resolver_schema}
50 \end{figure}
51
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}.
59
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.
70
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
76 \file{/etc/hosts}. 
77
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.
85
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
95 di mantenerle.
96
97
98
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}.
106
107 \begin{table}[htb]
108   \footnotesize
109   \centering
110   \begin{tabular}[c]{|l|p{8cm}|}
111     \hline
112     \textbf{Classe} & \textbf{Tipo di corrispondenza}\\
113     \hline
114     \hline
115     \texttt{shadow}   & corrispondenze fra username e proprietà dell'utente
116                        (\acr{uid}, ecc.).\\  
117     \texttt{group}    & corrispondenze fra nome del gruppo e proprietà dello 
118                         stesso.\\  
119     \texttt{aliases}  & alias per la posta elettronica\\ 
120     \texttt{ethers}   & corrispondenze fra numero IP e MAC address della
121                         scheda di rete.\\ 
122     \texttt{hosts}    & corrispondenze fra nome a dominio e numero IP.\\ 
123     \texttt{netgroup} & corrispondenze gruppo di rete e macchine che lo
124                         compongono.\\  
125     \texttt{networks} & corrispondenze fra nome di una rete e suo indirizzo
126                         IP.\\  
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
132                         porta. \\ 
133     \hline
134   \end{tabular}
135   \caption{Le diverse classi di corrispondenze definite
136     all'interno del \textit{Name Service Switch}.} 
137   \label{tab:sys_NSS_classes}
138 \end{table}
139
140
141
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}.
151
152 Il
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}.
156
157
158
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}.
167
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.
176
177
178
179 \subsection{La risoluzione dei nomi a dominio}
180 \label{sec:sock_gethostbyname}
181
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
186 prototipo è:
187 \begin{prototype}{netdb.h}
188 {struct hostent *gethostbyname(const char *name)}
189
190 Determina l'indirizzo associato al nome a dominio \param{name}.
191
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.}
195 \end{prototype}
196
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 è
206 fallita.
207
208 \begin{figure}[!htb]
209   \footnotesize \centering
210   \begin{minipage}[c]{15cm}
211     \includestruct{listati/hostent.h}
212   \end{minipage}
213   \caption{La struttura \structd{hostent}.}
214   \label{fig:sock_hostent_struct}
215 \end{figure}
216
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
221 con: 
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
229   \const{NO\_DATA}).
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. 
234 \end{basedescript}
235
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
262   \texttt{A}).
263 \end{basedescript}
264
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}).
275
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.
285
286
287
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]}.
295
296
297
298
299
300
301
302 \section{Le opzioni dei socket}
303 \label{sec:TCP_sock_options}
304
305 Finora abbiamo trattato i socket nel loro comportamento più comune, è però
306 possibile attivare alcune modalità diverse di funzionamento degli stessi
307
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.
312
313 \section{Altre funzioni di controllo}
314 \label{sec:TCP_sock_ctrl}
315
316
317
318
319
320 %%% Local Variables: 
321 %%% mode: latex
322 %%% TeX-master: "gapil"
323 %%% End: