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 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
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}.
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.
115 \subsection{La risoluzione dei nomi a dominio}
116 \label{sec:sock_gethostbyname}
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
123 \begin{prototype}{netdb.h}
124 {struct hostent *gethostbyname(const char *name)}
126 Determina l'indirizzo associato al nome a dominio \param{name}.
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.}
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 può non avere nessun
141 significato nell'indicare quale parte del procedimento di risoluzione è
145 \footnotesize \centering
146 \begin{minipage}[c]{15cm}
147 \includestruct{listati/hostent.h}
149 \caption{La struttura \structd{hostent} .}
150 \label{fig:sock_hostent_struct}
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.
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
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
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.
228 \section{Le opzioni dei socket}
229 \label{sec:TCP_sock_options}
231 Finora abbiamo trattato i socket nel loro comportamento più comune, è però
232 possibile attivare alcune modalità diverse di funzionamento degli stessi
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.
239 \section{Altre funzioni di controllo}
240 \label{sec:TCP_sock_ctrl}
248 %%% TeX-master: "gapil"