\label{sec:sock_resolver}
\itindbeg{resolver} La risoluzione dei nomi è associata tradizionalmente al
-servizio del \itindex{Domain~Name~Service} \textit{Domain Name Service} che
-permette di identificare le macchine su internet invece che per numero IP
+servizio del \itindex{Domain~Name~Service~(DNS)} \textit{Domain Name Service}
+che permette di identificare le macchine su internet invece che per numero IP
attraverso il relativo \textsl{nome a dominio}.\footnote{non staremo ad
entrare nei dettagli della definizione di cosa è un nome a dominio, dandolo
per noto, una introduzione alla problematica si trova in \cite{AGL} (cap.~9)
Per questo aspetto il file di configurazione principale del sistema è
\conffile{/etc/resolv.conf} che contiene in sostanza l'elenco degli indirizzi
-IP dei server DNS da contattare; a questo si affiancava (fino alle \acr{glibc}
+IP dei server DNS da contattare; a questo si affiancava (fino alla \acr{glibc}
2.4) il file \conffile{/etc/host.conf} il cui scopo principale era indicare
l'ordine in cui eseguire la risoluzione dei nomi (se usare prima i valori di
\conffile{/etc/hosts} o quelli del DNS). Tralasciamo i dettagli relativi alle
associate chiamato \textit{Name Service Switch}, cui abbiamo accennato anche in
sez.~\ref{sec:sys_user_group} per quanto riguarda la gestione dei dati
associati a utenti e gruppi. Il sistema è stato introdotto la prima volta
-nelle librerie standard di Solaris e le \acr{glibc} hanno ripreso lo stesso
+nella libreria standard di Solaris e la \acr{glibc} ha ripreso lo stesso
schema; si tenga presente che questo sistema non esiste per altre librerie
-standard come le \acr{libc5} o le \acr{uclib}.
+standard come la \acr{libc5} o la \acr{uClib}.
Il \textit{Name Service Switch} (cui spesso si fa riferimento con l'acronimo
NSS) è un sistema di librerie dinamiche che permette di definire in maniera
fornite dal sistema del \textit{Name Service Switch}, dal punto di vista di un
programma che deve effettuare la risoluzione di un nome a dominio, tutto
quello che conta sono le funzioni classiche che il \textit{resolver} mette a
-disposizione (è cura delle \acr{glibc} tenere conto della presenza del
+disposizione (è cura della \acr{glibc} tenere conto della presenza del
\textit{Name Service Switch}) e sono queste quelle che tratteremo nelle
sezioni successive.
\const{RES\_USE\_INET6} nel campo \texttt{\_res.options} e poi chiamare
\func{res\_init} (vedi sez.~\ref{sec:sock_resolver_functions}) per modificare
le opzioni del \textit{resolver}; dato che questo non è molto comodo è stata
-definita (è una estensione fornita dalle \acr{glibc}, disponibile anche in
+definita (è una estensione fornita dalla \acr{glibc}, disponibile anche in
altri sistemi unix-like) un'altra funzione, \funcd{gethostbyname2}, il cui
prototipo è:
indirizzi generiche, questo sia ancora di tipo \texttt{char **} e si possa
riutilizzare lo stesso puntatore usato per i nomi.
-Per ciascun indirizzo valido si provvederà (\texttt{\small 41}) ad una
+Per ciascun indirizzo valido si provvederà (\texttt{\small 41}) a una
conversione con la funzione \func{inet\_ntop} (vedi
sez.~\ref{sec:sock_addr_func}) passandole gli opportuni argomenti, questa
restituirà la stringa da stampare (\texttt{\small 42}) con il valore
contenuti in essa (e così via se vi sono altre sotto-strutture con altri
puntatori) e copiare anche i dati da questi referenziati.}
-Per ovviare a questi problemi nelle \acr{glibc} sono definite anche delle
+Per ovviare a questi problemi nella \acr{glibc} sono definite anche delle
versioni rientranti delle precedenti funzioni, al solito queste sono
caratterizzate dall'avere un suffisso \texttt{\_r}, pertanto avremo le due
funzioni \funcd{gethostbyname\_r} e \funcd{gethostbyname2\_r} i cui prototipi
Dato che \func{gethostbyaddr} usa un buffer statico, anche di questa funzione
esiste una versione rientrante \funcd{gethostbyaddr\_r} fornita come
-estensione dalle \acr{glibc}, il cui prototipo è:
+estensione dalla \acr{glibc}, il cui prototipo è:
\begin{funcproto}{
\fhead{netdb.h}
lettura delle voci presenti in quest'ultimo, come avviene anche in altri
sistemi unix-like, ed inoltre ignora le voci relative ad indirizzi IPv6.
-Della stessa funzione le \acr{glibc} forniscono anche una versione rientrante
+Della stessa funzione la \acr{glibc} fornisce anche una versione rientrante
\funcd{gethostent\_r}, il cui prototipo è:
\begin{funcproto}{
è stata successivamente proposta,
nell'\href{http://www.ietf.org/rfc/rfc2553.txt}{RFC~2553} un diversa
interfaccia con l'introduzione due nuove funzioni di
-risoluzione,\footnote{dette funzioni sono presenti nelle \acr{glibc} versione
- 2.1.96, ma essendo considerate deprecate (vedi
+risoluzione,\footnote{dette funzioni sono presenti nella \acr{glibc} 2.1.96,
+ ma essendo considerate deprecate (vedi
sez.~\ref{sec:sock_advanced_name_services}) sono state rimosse nelle
versioni successive.} \funcd{getipnodebyname} e \funcd{getipnodebyaddr}, i
cui prototipi sono:
maschera.
Nella seconda parte della tabella si sono riportati i valori delle costanti
-aggiunte a partire dalle \acr{glibc} 2.3.4 per gestire la
+aggiunte a partire dalla \acr{glibc} 2.3.4 per gestire la
internazionalizazione dei nomi a dominio (IDN o \textit{Internationalized
Domain Names}) secondo quanto specificato
nell'\href{http://www.ietf.org/rfc/rfc3490.txt}{RFC~3490} (potendo cioè usare
impostare le modalità con cui viene eseguita la ricerca, e deve essere
specificato attraverso l'OR aritmetico dei valori illustrati in
tab.~\ref{tab:getnameinfo_flags}, nella seconda parte della tabella si sono
-aggiunti i valori introdotto con le \acr{glibc} 2.3.4 per gestire la
+aggiunti i valori introdotto con la \acr{glibc} 2.3.4 per gestire la
internazionalizzione dei nomi a dominio.
\begin{table}[!htb]
in realtà sempre di tipo \ctyp{int}, come era nelle \acr{libc4} e
\acr{libc5}; l'uso di \type{socklen\_t} è stato introdotto da POSIX (valgono
le stesse considerazioni per l'uso di questo tipo di dato fatte in
- sez.~\ref{sec:TCP_func_accept}) ed adottato dalle \acr{glibc}.} è la
+ sez.~\ref{sec:TCP_func_accept}) ed adottato dalla \acr{glibc}.} è la
dimensione in byte dei dati presenti all'indirizzo indicato da \param{optval}.
Dato che il tipo di dati varia a seconda dell'opzione scelta, occorrerà
individuare qual è quello che deve essere usato, ed utilizzare le opportune
specificare come argomento per questa opzione sono impostabili tramiti gli
opportuni valori di \func{sysctl} (vedi sez.~\ref{sec:sock_sysctl}).
- Si tenga presente che nel caso di socket TCP, per entrambe le opzioni
- \const{SO\_RCVBUF} e \const{SO\_SNDBUF}, il kernel alloca effettivamente una
- quantità di memoria doppia rispetto a quanto richiesto con
- \func{setsockopt}. Questo comporta che una successiva lettura con
+ Si tenga presente che nel caso di socket TCP il kernel alloca effettivamente
+ una quantità di memoria doppia rispetto a quanto richiesto con
+ \func{setsockopt} per entrambe le opzioni \const{SO\_RCVBUF} e
+ \const{SO\_SNDBUF}. Questo comporta che una successiva lettura con
\func{getsockopt} riporterà un valore diverso da quello impostato con
\func{setsockopt}. Questo avviene perché TCP necessita dello spazio in più
per mantenere dati amministrativi e strutture interne, e solo una parte
\item[\constd{SO\_RCVBUFFORCE}] questa opzione, presente dal kernel 2.6.14, è
identica a \const{SO\_RCVBUF} ma consente ad un processo con i privilegi di
- amministratore (con la \textit{capability} \const{CAP\_NET\_ADMIN}) di
- impostare in valore maggiore del limite di
+ amministratore (per la precisione con la \textit{capability}
+ \const{CAP\_NET\_ADMIN}) di impostare in valore maggiore del limite di
\sysctlrelfile{net/core}{rmem\_max}.
\item[\constd{SO\_RCVLOWAT}] questa opzione imposta il valore che indica il
\item[\constd{SO\_SNDBUFFORCE}] questa opzione, presente dal kernel 2.6.14, è
identica a \const{SO\_SNDBUF} ma consente ad un processo con i privilegi di
- amministratore (con la \textit{capability} \const{CAP\_NET\_ADMIN}) di
- impostare in valore maggiore del limite di
+ amministratore (per la precisione con la \textit{capability}
+ \const{CAP\_NET\_ADMIN}) di impostare in valore maggiore del limite di
\sysctlrelfile{net/core}{wmem\_max}.
% TODO verificare il timeout con un programma di test
\begin{table}[!htb]
\centering
\footnotesize
- \begin{tabular}[c]{|l|c|c|c|l|p{5.cm}|}
+ \begin{tabular}[c]{|l|c|c|c|l|p{4.8cm}|}
\hline
\textbf{Opzione}&\texttt{get}&\texttt{set}&\textbf{flag}&\textbf{Tipo}&
\textbf{Descrizione}\\
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{0.70\textwidth}
+ \begin{minipage}[c]{0.90\textwidth}
\includestruct{listati/ip_mreqn.h}
\end{minipage}
\caption{La struttura \structd{ip\_mreqn} utilizzata per unirsi a un gruppo di
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{0.70\textwidth}
+ \begin{minipage}[c]{0.90\textwidth}
\includestruct{listati/ip_mreq_source.h}
\end{minipage}
\caption{La struttura \structd{ip\_mreqn} utilizzata per unirsi a un gruppo di
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{0.70\textwidth}
+ \begin{minipage}[c]{0.90\textwidth}
\includestruct{listati/ip_msfilter.h}
\end{minipage}
\caption{La struttura \structd{ip\_msfilter} utilizzata per il
\label{fig:ip_msfilter_struct}
\end{figure}
-L'argomento \param{optval} è una struttura \struct{ip\_msfilter} illustrata in
-fig.~\ref{fig:ip_msfilter_struct}, il campo \var{imsf\_multiaddr} è
-l'indirizzo del gruppo di \textit{multicast}, il campo \var{imsf\_interface}
-l'indirizzo dell'interfaccia locale, il campo \var{imsf\_mode} indica la
-modalità di filtraggio e con i campi \var{imsf\_numsrc} e \var{imsf\_slist}
+L'argomento \param{optval} deve essere una struttura di tipo
+\struct{ip\_msfilter} (illustrata in fig.~\ref{fig:ip_msfilter_struct}); il
+campo \var{imsf\_multiaddr} indica l'indirizzo del gruppo di
+\textit{multicast}, il campo \var{imsf\_interface} l'indirizzo
+dell'interfaccia locale, il campo \var{imsf\_mode} indica la modalità di
+filtraggio e con i campi \var{imsf\_numsrc} e \var{imsf\_slist}
rispettivamente la lunghezza della lista, e la lista stessa, degli indirizzi
-sorgente.
+sorgente.
Come ausilio all'uso di questa opzione sono disponibili le macro
\macro{MCAST\_INCLUDE} e \macro{MCAST\_EXCLUDE} che si possono usare per
questo protocollo, senza doversi curare di verificarne la
validità.\footnote{l'attacco viene in genere portato per causare un
\textit{Denial of Service} aumentando il consumo di CPU del router nella
- verifica dell'autenticità di un gran numero di pacchetti di pacchetti
- falsi; questi, arrivando da sorgenti diverse da un router adiacente, non
- potrebbero più avere un TTL di 255 anche qualora questo fosse stato il
- valore di partenza, e l'impostazione dell'opzione consente di scartarli
- senza carico aggiuntivo sulla CPU (che altrimenti dovrebbe calcolare una
- checksum).}
+ verifica dell'autenticità di un gran numero di pacchetti falsi; questi,
+ arrivando da sorgenti diverse da un router adiacente, non potrebbero più
+ avere un TTL di 255 anche qualora questo fosse stato il valore di
+ partenza, e l'impostazione dell'opzione consente di scartarli senza carico
+ aggiuntivo sulla CPU (che altrimenti dovrebbe calcolare una checksum).}
\itindbeg{Path~MTU}
\item[\constd{IP\_MTU}] Permette di leggere il valore della \textit{Path MTU}
- di percorso del socket. L'opzione richiede per \param{optval} un intero che
- conterrà il valore della \textit{Path MTU} in byte. Questa è una opzione
- introdotta con i kernel della serie 2.2.x, ed è specifica di Linux.
+ del socket. L'opzione richiede per \param{optval} un intero che conterrà il
+ valore della \textit{Path MTU} in byte. Questa è una opzione introdotta con
+ i kernel della serie 2.2.x, ed è specifica di Linux.
È tramite questa opzione che un programma può leggere, quando si è avuto un
errore di \errval{EMSGSIZE}, il valore della MTU corrente del socket. Si
la scoperta della \textit{Path MTU}, occorre che il socket sia stato
esplicitamente connesso con \func{connect}.
- Ad esempio con i socket UDP si potrà ottenere una stima iniziale della
+ Ad esempio con i socket UDP si può ottenere una stima iniziale della
\textit{Path MTU} eseguendo prima una \func{connect} verso la destinazione,
e poi usando \func{getsockopt} con questa opzione. Si può anche avviare
esplicitamente il procedimento di scoperta inviando un pacchetto di grosse
situazione.} utilizzare per il singolo socket. L'opzione è stata
introdotta con il kernel 2.6.13,\footnote{alla data di stesura di queste
note (Set. 2006) è pure scarsamente documentata, tanto che non è neanche
- definita nelle intestazioni delle \acr{glibc} per cui occorre definirla a
+ definita nelle intestazioni della \acr{glibc} per cui occorre definirla a
mano al suo valore che è 13.} e prende come per \param{optval} il
puntatore ad un buffer contenente il nome dell'algoritmo di controllo che
si vuole usare.
dati ancillari e di controllo (vedi sez.~\ref{sec:net_ancillary_data}).
\end{basedescript}
-Oltre a questi nella directory \texttt{/proc/sys/net/core} si trovano altri
-file, la cui documentazione dovrebbe essere mantenuta nei sorgenti del kernel,
-nel file \texttt{Documentation/networking/ip-sysctl.txt}; la maggior parte di
-questi però non è documentato:
+Oltre a questi, nella directory \texttt{/proc/sys/net/core} si trovano diversi
+altri file, la cui documentazione, come per gli altri, dovrebbe essere
+mantenuta nei sorgenti del kernel nel file
+\texttt{Documentation/networking/ip-sysctl.txt}; la maggior parte di questi
+però non è documentato:
\begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}}
\item[\sysctlrelfiled{net/core}{dev\_weight}] blocco di lavoro (\textit{work
quantum}) dello \textit{scheduler} di processo dei pacchetti.
disabilitare globalmente il procedimento con questo parametro ha pesanti
ripercussioni in termini di prestazioni di rete.
-\item[\sysctlrelfiled{net/ipv4}{ip\_always\_defrag}] fa si che tutti i
+\item[\sysctlrelfiled{net/ipv4}{ip\_always\_defrag}] fa sì che tutti i
pacchetti IP frammentati siano riassemblati, anche in caso in successivo
immediato inoltro.\footnote{introdotto con il kernel 2.2.13, nelle versioni
precedenti questo comportamento poteva essere solo stabilito un volta per
\item[\sysctlrelfiled{net/ipv4}{ipfrag\_high\_thresh}] indica il limite
massimo (espresso in numero di byte) sui pacchetti IP frammentati presenti
- in coda; quando questo valore viene raggiunta la coda viene ripulita fino al
+ in coda; quando questo valore viene raggiunto la coda viene ripulita fino al
valore \texttt{ipfrag\_low\_thresh}. Prende un valore intero.
-\item[\sysctlrelfiled{net/ipv4}{ipfrag\_low\_thresh}] soglia bassa
- (specificata in byte) a cui viene riportata la coda dei pacchetti IP
- frammentati quando si raggiunge il valore massimo dato da
+\item[\sysctlrelfiled{net/ipv4}{ipfrag\_low\_thresh}] indica la dimensione
+ (specificata in byte) della soglia inferiore a cui viene riportata la coda
+ dei pacchetti IP frammentati quando si raggiunge il valore massimo dato da
\texttt{ipfrag\_high\_thresh}. Prende un valore intero.
\item[\sysctlrelfiled{net/ipv4}{ip\_nonlocal\_bind}] se abilitato rende
\item[\sysctlrelfiled{net/ipv4}{tcp\_app\_win}] indica la frazione della
finestra TCP che viene riservata per gestire l'overhaed dovuto alla
- bufferizzazione. Prende un valore valore intero che consente di calcolare la
+ bufferizzazione. Prende un valore intero che consente di calcolare la
dimensione in byte come il massimo fra la MSS e
$\texttt{window}/2^\texttt{tcp\_app\_win}$. Un valore nullo significa che
non viene riservato nessuno spazio; il valore di default è 31.
\item[\sysctlrelfiled{net/ipv4}{tcp\_ecn}] abilita il meccanismo della
\textit{Explicit Congestion Notification} (in breve ECN) nelle connessioni
TCP. Prende valore logico che di default è disabilitato. La \textit{Explicit
- Congestion Notification} \itindex{Explicit~Congestion~Notification} è un
- meccanismo che consente di notificare quando una rotta o una rete è
+ Congestion Notification} \itindex{Explicit~Congestion~Notification~(ECN)}
+ è un meccanismo che consente di notificare quando una rotta o una rete è
congestionata da un eccesso di traffico,\footnote{il meccanismo è descritto
in dettaglio nell'\href{http://www.ietf.org/rfc/rfc3168.txt}{RFC~3168}
mentre gli effetti sulle prestazioni del suo utilizzo sono documentate
risposta prima che il kernel decida che la connessione è caduta e la
termini. Prende un valore intero che di default è 9.
-\item[\sysctlrelfiled{net/ipv4}{tcp\_keepalive\_time}] indica il numero
- di secondi che devono passare senza traffico sulla connessione prima che il
- kernel inizi ad inviare pacchetti di pacchetti di
- \textit{keepalive}.\footnote{ha effetto solo per i socket per cui si è
- impostata l'opzione \const{SO\_KEEPALIVE} (vedi
- sez.~\ref{sec:sock_options_main}.} Prende un valore intero che di default
- è 7200, pari a due ore.
+\item[\sysctlrelfiled{net/ipv4}{tcp\_keepalive\_time}] indica il numero di
+ secondi che devono passare senza traffico sulla connessione prima che il
+ kernel inizi ad inviare pacchetti di \textit{keepalive}.\footnote{ha effetto
+ solo per i socket per cui si è impostata l'opzione \const{SO\_KEEPALIVE}
+ (vedi sez.~\ref{sec:sock_options_main}.} Prende un valore intero che di
+ default è 7200, pari a due ore.
\item[\sysctlrelfiled{net/ipv4}{tcp\_low\_latency}] indica allo stack
TCP del kernel di ottimizzare il comportamento per ottenere tempi di latenza
\item[\sysctlrelfiled{net/ipv4}{tcp\_tw\_recycle}] abilita il riutilizzo
rapido dei socket in stato \texttt{TIME\_WAIT}. Prende un valore logico e di
default è disabilitato. Non è opportuno abilitare questa opzione che può
- causare problemi con il NAT.\footnote{il
- \itindex{Network~Address~Translation} \textit{Network Address Translation}
- è una tecnica, impiegata nei firewall e nei router, che consente di
- modificare al volo gli indirizzi dei pacchetti che transitano per una
- macchina, Linux la supporta con il \textit{netfilter}.}
+ causare problemi con il NAT.\footnote{la
+ \itindex{Network~Address~Translation~(NAT)} \textit{Network Address
+ Translation} (abbreviato in NAT) è una tecnica, impiegata nei firewall e
+ nei router, che consente di modificare al volo gli indirizzi dei pacchetti
+ che transitano per una macchina, Linux la supporta con il
+ \textit{netfilter}.}
\item[\sysctlrelfiled{net/ipv4}{tcp\_tw\_reuse}] abilita il riutilizzo
dello stato \texttt{TIME\_WAIT} quando questo è sicuro dal punto di vista
\item il secondo valore, denominato \textit{default}, indica la dimensione
di default in byte del buffer di spedizione di un socket TCP. Questo
valore sovrascrive il default iniziale impostato per tutti i tipi di
- socket con \sysctlfile{net/core/wmem\_default}. Il default è 87380 byte,
- ridotto a 43689 per sistemi con poca memoria. Si può aumentare questo
- valore quando si desiderano dimensioni più ampie del buffer di
+ socket sul file \sysctlfile{net/core/wmem\_default}. Il default è 87380
+ byte, ridotto a 43689 per sistemi con poca memoria. Si può aumentare
+ questo valore quando si desiderano dimensioni più ampie del buffer di
trasmissione per i socket TCP, ma come per il precedente
\sysctlrelfile{net/ipv4}{tcp\_rmem}) se si vuole che in corrispondenza
aumentino anche le dimensioni usate per la finestra TCP si deve abilitare