82f1c66be27ed36530bc48faae6990891af43821
[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 all
88 risoluzione dei nomi a dominio si sono aggiunti altri nomi da risolvere, come
89 quelli associati alle reti ed ai gruppi di macchine definiti dal servizio NIS,
90 o quelli dei protocolli e dei servizi mantenuti nei file statici
91 \file{/etc/protocols} e \file{/etc/services}, tutte informazioni che
92 normalmente non si trovano su un DNS, ma che in un ambiente distribuito
93 possono essere centralizzate su opportuni server (ad esempio su LDAP) in grado
94 di mantenerle.
95
96 Questo ha portato alla creazione di un sistema di risoluzione più ampio, il
97 \textit{Name Service Switch} di cui il \textit{resolver} viene a costituire un
98 sottoinsieme. Questo sistema, che si applica anche alla risoluzioni fra nomi
99 di utenti e gruppi e relativi identificatori, permette di definire in maniera
100 generica (attraverso una serie di librerie dinamiche) sia i supporti su cui
101 mantenere i dati di corrispondenza fra nomi e valori numerici, sia l'ordine in
102 cui effettuare le ricerche sui vari supporti disponibili.  Il sistema è
103 controllato dal file \file{/etc/nsswitch.conf}, ed anche per questo si può
104 fare riferimento alle pagine di manuale ed al relativo capitolo nel manuale
105 \cite{glibc} delle \textsl{glibc}.
106
107 In ogni caso, qualunque sia la modalità con cui ricevono i dati o il supporto
108 su cui vengono mantenuti, dal punto di vista di un programma che deve
109 effettuare la risoluzione di un nome, tutto quello che conta sono le funzioni
110 che il \textit{resolver} mette a disposizione, e sono queste quelle che
111 tratteremo nelle sezioni successive.
112
113
114
115 \subsection{La risoluzione dei nomi a dominio}
116 \label{sec:sock_gethostbyname}
117
118 Dato che la principale funzionalità del \textit{resolver} resta quella di
119 risolvere i nomi a dominio in indirizzi IP, vedremo per prime le funzioni a
120 questo dedicate. La prima funzione è \funcd{gethostbyname} il cui scopo è
121 ottenere l'indirizzo di una stazione noto il suo nome a dominio, il suo
122 prototipo è:
123 \begin{prototype}{netdb.h}
124 {struct hostent *gethostbyname(const char *name)}
125
126 Determina l'indirizzo associato al nome a dominio \param{name}.
127
128 \bodydesc{La funzione restituisce in caso di successo il puntatore ad una
129   struttura di tipo \struct{hostent} contente i dati associati al nome a
130   dominio o un puntatore nullo in caso di errore.}
131 \end{prototype}
132
133 La funzione prende come argomento una stringa \param{name} contenente il nome
134 a dominio che si vuole risolvere, in caso di successo i dati ad esso relativi
135 vengono memorizzati in una opportuna struttura \struct{hostent} la cui
136 definizione è riportata in fig.~\ref{fig:sock_hostent_struct}. In caso di
137 insuccesso l'errore viene segnalato da un valore nullo del puntatore, ma in
138 questo caso, a differenza delle funzioni viste finora, non viene utilizzata la
139 variabile \var{errno} per riportare un codice di errore, in quanto questo è
140 dipende solo dalle sottostanti chiamate al sistema e non avere nessun
141 significato nell'indicare quale parte del procedimento di risoluzione è
142 fallita.
143
144 \begin{figure}[!htb]
145   \footnotesize \centering
146   \begin{minipage}[c]{15cm}
147     \includestruct{listati/hostent.h}
148   \end{minipage}
149   \caption{La struttura \structd{hostent} .}
150   \label{fig:sock_hostent_struct}
151 \end{figure}
152
153 Per questo motivo all'interno del resolver è stata definita una apposita
154 variabile di errore, \var{h\_errno} che viene utilizzata dalle funzioni di
155 libreria per indicare quale problema ha causato il fallimento della
156 risoluzione. Ad essa si può accedere una volta che la si dichiara con:
157 \includecodesnip{listati/herrno.c}
158 ed i valori che può assumere sono i seguenti:
159 \begin{basedescript}{\desclabelwidth{3cm}\desclabelstyle{\nextlinelabel}}
160 \item[\const{HOST\_NOT\_FOUND}] l'indirizzo richiesto non è valido e la
161   macchina indicata è sconosciuta.
162 \item[\const{NO\_ADDRESS}] il nome a dominio richiesto è valido, ma non ha un
163   indirizzo associato ad esso.
164 \item[\const{NO\_RECOVERY}] si è avuto un errore non recuperabile
165   nell'interrogazione di un server DNS.
166 \item[\const{TRY\_AGAIN}] si è avuto un errore temporaneo nell'interrogazione
167   di un server DNS, si può ritentare l'interrogazione in un secondo tempo. 
168 \end{basedescript}
169
170
171 Per capire meglio il contenuto della struttura \struct{hostent} conviene
172 spendere alcune parole sul funzionamento del DNS. Questo in sostanza è un
173 database distribuito organizzato in maniera gerarchica, interrogando il quale
174 si possono avere una serie di informazioni la principale delle quali è la
175 corrispondenza fra un nome (a dominio) ed indirizzo IP.  Un server DNS
176 contiene comunque una serie di altre informazioni; ciascuna voce nel database
177 viene chiamata \textit{resource record} e vi è associato un certo
178 \textsl{tipo}, identificato da una sigla.  Per quanto ci interessa i tipi di
179 \textit{resource record} che vengono utilizzati dal \textit{resolver} sono
180 sostanzialmente i seguenti:
181 \begin{basedescript}{\desclabelwidth{1.2cm}\desclabelstyle{\nextlinelabel}}
182 \item[\texttt{A}] indica la corripondenza fra un nome a dominio ed un
183   indirizzo IPv4, ad esempio la corrispondenza fra \texttt{dodds.truelite.it}
184   e l'indirizzo IP \texttt{62.48.34.25}.
185 \item[\texttt{AAAA}] chiamato in questo modo dato che la dimensione è quattro
186   volte quella di un indirizzo IPv4, questo record contiene la corrispondenza
187   fra un nome a dominio ed un indirizzo IPv6.
188 \item[\texttt{PTR}] per provvedere la mappatura inversa fra un indirizzo IP ed
189   un nome a dominio si utilizza invece questo tipo di record (il cui nome sta
190   per \textit{pointer}).
191 \item[\texttt{CNAME}] qualora si abbiamo più nomi con i quali si voglia
192   indicare lo stesso indirizzo (ad esempio \texttt{www.truelite.it}, o
193   \texttt{sources.truelite.it}, che comunque fanno sempre riferimento alla
194   macchina \texttt{dodds.truelite.it}) si può usare questo tipo di record per
195   creare degli \textit{alias} in modo da associare un qualunque altro nome al
196   \textsl{nome canonico} della macchina (quello associato al record
197   \texttt{A}).
198 \end{basedescript}
199
200 Quando un programma chiama \func{gethostbyname} e questa usa il DNS per
201 effettuare la risoluzione del nome, è con i valori di questi record che
202 vengono riempite le varie parti della struttura \struct{hostent}. Il primo
203 campo della struttura, \var{h\_name} contiene sempre il \textsl{nome
204   canonico}, che nel caso del DNS è appunto il nome associato ad un record
205 \texttt{A}. Il secondo campo della struttura invece è un puntatore ad vettore
206 di puntatori, terminato da un puntatore nullo. Ciascun puntatore del vettore
207 fa riferimento ad una delle stringhe che contengono tutti i possibili altri
208 nomi associati allo stesso indirzzo (quelli che nel DNS sarebbero record
209 \texttt{CNAME}).
210
211 Il terzo campo, \var{h\_addrtype}, indica il tipo di indirizzo che è stato
212 restituito, e può essere solo \const{AF\_INET} o \const{AF\_INET6}, mentre il
213 quarto campo, \var{h\_length}, indica la lunghezza dell'indirizzo stesso in
214 byte. Infine il campo \var{h\_addr\_list} è il puntatore ad un vettore di
215 puntatori ai singoli indirizzi; il vettore è terminato da un puntatore nullo.
216 Inoltre, come illustrato in fig.~\ref{fig:sock_hostent_struct}, viene definito
217 per compatibilità il campo \var{h\_addr} corrispondente al puntatore al primo
218 indirizzo della lista.
219
220 In sostanza 
221
222
223
224
225
226
227
228 \section{Le opzioni dei socket}
229 \label{sec:TCP_sock_options}
230
231 Finora abbiamo trattato i socket nel loro comportamento più comune, è però
232 possibile attivare alcune modalità diverse di funzionamento degli stessi
233
234 Dato che la maggior parte delle opzioni dei socket sono relative ai socket
235 TCP, ed hanno poi significato analogo quando usate con altri socket, abbiamo
236 preferito trattare l'argomento in generale in questa sezione piuttosto che nel
237 capitolo dedicato alla trattazione generica dei socket.
238
239 \section{Altre funzioni di controllo}
240 \label{sec:TCP_sock_ctrl}
241
242
243
244
245
246 %%% Local Variables: 
247 %%% mode: latex
248 %%% TeX-master: "gapil"
249 %%% End: