Alcune correzioni ai font dei link, e una trattazione esplicita
[gapil.git] / sockctrl.tex
index f5a4c43c9d7dfaf1e5df63d7e73366e5a8204e70..ed3ca3a8a0a0578e9a364830c558bd5340a14252 100644 (file)
@@ -50,7 +50,7 @@ necessita di compiere questa operazione.
 
 \begin{figure}[htb]
   \centering
-  \includegraphics[width=9cm]{img/resolver}
+  \includegraphics[width=11cm]{img/resolver}
   \caption{Schema di funzionamento delle funzioni del \textit{resolver}.}
   \label{fig:sock_resolver_schema}
 \end{figure}
@@ -145,15 +145,17 @@ tab.~\ref{tab:sys_NSS_classes}.
     \textbf{Classe} & \textbf{Tipo di corrispondenza}\\
     \hline
     \hline
-    \texttt{shadow}   & Corrispondenze fra username e proprietà dell'utente
-                        (\acr{uid}, ecc.).\\  
+    \texttt{passwd}   & Corrispondenze fra nome dell'utente e relative
+                        proprietà (\acr{uid}, gruppo principale, ecc.).\\  
+    \texttt{shadow}   & Corrispondenze fra username e password dell'utente
+                        (e altre informazioni relative alle password).\\  
     \texttt{group}    & Corrispondenze fra nome del gruppo e proprietà dello 
                         stesso.\\  
     \texttt{aliases}  & Alias per la posta elettronica.\\ 
     \texttt{ethers}   & Corrispondenze fra numero IP e MAC address della
                         scheda di rete.\\ 
     \texttt{hosts}    & Corrispondenze fra nome a dominio e numero IP.\\ 
-    \texttt{netgroup} & Corrispondenze gruppo di rete e macchine che lo
+    \texttt{netgroup} & Corrispondenze fra gruppo di rete e macchine che lo
                         compongono.\\  
     \texttt{networks} & Corrispondenze fra nome di una rete e suo indirizzo
                         IP.\\  
@@ -161,6 +163,8 @@ tab.~\ref{tab:sys_NSS_classes}.
                         numero identificativo.\\ 
     \texttt{rpc}      & Corrispondenze fra nome di un servizio RPC e relativo 
                         numero identificativo.\\ 
+    \texttt{publickey}& Chiavi pubbliche e private usate per gli RFC sicuri,
+                        utilizzate da NFS e NIS+. \\ 
     \texttt{services} & Corrispondenze fra nome di un servizio e numero di
                         porta. \\ 
     \hline
@@ -170,6 +174,8 @@ tab.~\ref{tab:sys_NSS_classes}.
   \label{tab:sys_NSS_classes}
 \end{table}
 
+% TODO rivedere meglio la tabella
+
 Il sistema del \textit{Name Service Switch} è controllato dal contenuto del
 file \conffile{/etc/nsswitch.conf}; questo contiene una riga\footnote{seguendo
   una convezione comune per i file di configurazione le righe vuote vengono
@@ -323,7 +329,9 @@ comportamento del \textit{resolver}.
     \const{RES\_NOCHECKNAME}& Non controlla i nomi per verificarne la
                               correttezza sintattica. \\
     \const{RES\_KEEPTSIG}   & Non elimina i record di tipo \texttt{TSIG}.\\
-    \const{RES\_BLAST}      & \\
+    \const{RES\_BLAST}      & Effettua un ``\textit{blast}'' inviando
+                              simultaneamente le richieste a tutti i server;
+                              non ancora implementata. \\
     \const{RES\_DEFAULT}    & Combinazione di \const{RES\_RECURSE},
                               \const{RES\_DEFNAMES} e \const{RES\_DNSRCH}.\\
     \hline
@@ -537,12 +545,12 @@ indicarli si 
   ed un nome a dominio ad esso associato si utilizza questo tipo di record (il
   cui nome sta per \textit{pointer}).
 \item[\texttt{CNAME}] qualora si abbiamo più nomi che corrispondono allo
-  stesso indirizzo (come ad esempio \texttt{www.truelite.it}, o
-  \texttt{sources.truelite.it}, che fanno sempre riferimento a
-  \texttt{dodds.truelite.it}) si può usare questo tipo di record per creare
-  degli \textit{alias} in modo da associare un qualunque altro nome al
-  \textsl{nome canonico} della macchina (si chiama così quello associato al
-  record \texttt{A}).
+  stesso indirizzo (come ad esempio \texttt{www.truelite.it} e
+  \texttt{sources.truelite.it}, che fanno entrambi riferimento alla stessa
+  macchina (nel caso \texttt{dodds.truelite.it}) si può usare questo tipo di
+  record per creare degli \textit{alias} in modo da associare un qualunque
+  altro nome al \textsl{nome canonico} della macchina (si chiama così quello
+  associato al record \texttt{A}).
 \end{basedescript}
 
 Come accennato in caso di successo le due funzioni di richiesta restituiscono
@@ -565,7 +573,7 @@ tab.~\ref{tab:h_errno_values}.
 \begin{table}[!htb]
   \centering
   \footnotesize
-  \begin{tabular}[c]{|l|p{10cm}|}
+  \begin{tabular}[c]{|l|p{11cm}|}
     \hline
     \textbf{Costante} & \textbf{Significato} \\
     \hline
@@ -727,41 +735,41 @@ trattamento delle opzioni ed una funzione per stampare un messaggio di aiuto,
 è nel file \texttt{mygethost.c} dei sorgenti allegati alla guida.
 
 Il programma richiede un solo argomento che specifichi il nome da cercare,
-senza il quale (\texttt{\small 12--15}) esce con un errore. Dopo di che
-(\texttt{\small 16}) si limita a chiamare \func{gethostbyname}, ricevendo il
-risultato nel puntatore \var{data}. Questo (\texttt{\small 17--20}) viene
+senza il quale (\texttt{\small 15--18}) esce con un errore. Dopo di che
+(\texttt{\small 20}) si limita a chiamare \func{gethostbyname}, ricevendo il
+risultato nel puntatore \var{data}. Questo (\texttt{\small 21--24}) viene
 controllato per rilevare eventuali errori, nel qual caso il programma esce
 dopo aver stampato un messaggio con \func{herror}. 
 
-Se invece la risoluzione è andata a buon fine si inizia (\texttt{\small 21})
-con lo stampare il nome canonico, dopo di che (\texttt{\small 22--26}) si
-stampano eventuali altri nomi. Per questo prima (\texttt{\small 22}) si prende
+Se invece la risoluzione è andata a buon fine si inizia (\texttt{\small 25})
+con lo stampare il nome canonico, dopo di che (\texttt{\small 26--30}) si
+stampano eventuali altri nomi. Per questo prima (\texttt{\small 26}) si prende
 il puntatore alla cima della lista che contiene i nomi e poi (\texttt{\small
-  23--26}) si esegue un ciclo che sarà ripetuto fin tanto che nella lista si
+  27--30}) si esegue un ciclo che sarà ripetuto fin tanto che nella lista si
 troveranno dei puntatori validi\footnote{si ricordi che la lista viene
   terminata da un puntatore nullo.} per le stringhe dei nomi; prima
-(\texttt{\small 24}) si stamperà la stringa e poi (\texttt{\small 25}) si
+(\texttt{\small 28}) si stamperà la stringa e poi (\texttt{\small 29}) si
 provvederà ad incrementare il puntatore per passare al successivo elemento
 della lista.
 
 Una volta stampati i nomi si passerà a stampare gli indirizzi, il primo passo
-(\texttt{\small 27--34}) è allora quello di riconoscere il tipo di indirizzo
+(\texttt{\small 31--38}) è allora quello di riconoscere il tipo di indirizzo
 sulla base del valore del campo \var{h\_addrtype}, stampandolo a video. Si è
 anche previsto di stampare un errore nel caso (che non dovrebbe mai accadere)
 di un indirizzo non valido.
 
-Infine (\texttt{\small 35--40}) si stamperanno i valori degli indirizzi, di
-nuovo (\texttt{\small 35}) si inizializzerà un puntatore alla cima della lista
+Infine (\texttt{\small 39--44}) si stamperanno i valori degli indirizzi, di
+nuovo (\texttt{\small 39}) si inizializzerà un puntatore alla cima della lista
 e si eseguirà un ciclo fintanto che questo punterà ad indirizzi validi in
 maniera analoga a quanto fatto in precedenza per i nomi a dominio. Si noti
 come, essendo il campo \var{h\_addr\_list} un puntatore ad strutture di
 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 37}) ad una
+Per ciascun indirizzo valido si provvederà (\texttt{\small 41}) ad 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 38}) con il valore
+restituirà la stringa da stampare (\texttt{\small 42}) con il valore
 dell'indirizzo in \var{buffer}, che si è avuto la cura di dichiarare
 inizialmente (\texttt{\small 10}) con dimensioni adeguate; dato che la
 funzione è in grado di tenere conto automaticamente del tipo di indirizzo non
@@ -954,7 +962,7 @@ tab.~\ref{tab:sock_getipnodebyname_flags}.
 \begin{table}[!htb]
   \centering
   \footnotesize
-  \begin{tabular}[c]{|l|p{10cm}|}
+  \begin{tabular}[c]{|l|p{8cm}|}
     \hline
     \textbf{Costante} & \textbf{Significato} \\
     \hline
@@ -1003,14 +1011,15 @@ funzione \funcd{freehostent}, il cui prototipo 
 La funzione permette di disallocare una struttura \var{hostent}
 precedentemente allocata in una chiamata di \func{getipnodebyname} o
 \func{getipnodebyaddr}, e prende come argomento l'indirizzo restituito da una
-di queste funzioni.
+di queste funzioni. 
 
 Infine per concludere la nostra panoramica sulle funzioni di risoluzione dei
 nomi dobbiamo citare le funzioni che permettono di interrogare gli altri
 servizi di risoluzione dei nomi illustrati in sez.~\ref{sec:sock_resolver}; in
 generale infatti ci sono una serie di funzioni nella forma
-\texttt{getXXXbyname} e \texttt{getXXXbyaddr} per ciascuna delle informazioni
-di rete mantenute dal \textit{Name Service Switch} che permettono
+\texttt{getXXXbyname} e \texttt{getXXXbyaddr} (dove \texttt{XXX} indica il
+servizio) per ciascuna delle informazioni di rete mantenute dal
+\itindex{Name~Service~Switch} \textit{Name Service Switch} che permettono
 rispettivamente di trovare una corrispondenza cercando per nome o per numero.
 
 L'elenco di queste funzioni è riportato nelle colonne finali di
@@ -1018,10 +1027,10 @@ tab.~\ref{tab:name_resolution_functions}, dove le si sono suddivise rispetto
 al tipo di informazione che forniscono (riportato in prima colonna). Nella
 tabella si è anche riportato il file su cui vengono ordinariamente mantenute
 queste informazioni, che però può essere sostituito da un qualunque supporto
-interno al \textit{Name Service Switch} (anche se usualmente questo avviene
-solo per la risoluzione degli indirizzi). Ciascuna funzione fa riferimento ad
-una sua apposita struttura che contiene i relativi dati, riportata in terza
-colonna.
+interno al \itindex{Name~Service~Switch} \textit{Name Service Switch} (anche
+se usualmente questo avviene solo per la risoluzione degli indirizzi).
+Ciascuna funzione fa riferimento ad una sua apposita struttura che contiene i
+relativi dati, riportata in terza colonna.
 
 \begin{table}[!htb]
   \centering
@@ -1043,22 +1052,23 @@ colonna.
     \hline
   \end{tabular}
   \caption{Funzioni di risoluzione dei nomi per i vari servizi del
-    \textit{Name Service Switch}.}
+    \itindex{Name~Service~Switch} \textit{Name Service Switch}.}
   \label{tab:name_resolution_functions}
 \end{table}
 
 Delle funzioni di tab.~\ref{tab:name_resolution_functions} abbiamo trattato
 finora soltanto quelle relative alla risoluzione dei nomi, dato che sono le
 più usate, e prevedono praticamente da sempre la necessità di rivolgersi ad
-una entità esterna; per le altre invece, estensioni fornite dal NSS a parte,
-si fa sempre riferimento ai dati mantenuti nei rispettivi file. 
+una entità esterna; per le altre invece, estensioni fornite dal
+\itindex{Name~Service~Switch} NSS a parte, si fa sempre riferimento ai dati
+mantenuti nei rispettivi file.
 
 Dopo la risoluzione dei nomi a dominio una delle ricerche più comuni è quella
-sui nomi dei servizi noti (cioè \texttt{http}, \texttt{smtp}, ecc.) da
-associare alle rispettive porte, le due funzioni da utilizzare per questo sono
-\funcd{getservbyname} e \funcd{getservbyaddr}, che permettono rispettivamente
-di ottenere il numero di porta associato ad un servizio dato il nome e
-viceversa; i loro prototipi sono:
+sui nomi dei servizi di rete più comuni (cioè \texttt{http}, \texttt{smtp},
+ecc.) da associare alle rispettive porte. Le due funzioni da utilizzare per
+questo sono \funcd{getservbyname} e \funcd{getservbyaddr}, che permettono
+rispettivamente di ottenere il numero di porta associato ad un servizio dato
+il nome e viceversa; i loro prototipi sono:
 \begin{functions}
   \headdecl{netdb.h} 
   \funcdecl{struct servent *getservbyname(const char *name, const char *proto)}
@@ -1085,14 +1095,15 @@ qualsiasi.
 Il primo argomento è il nome del servizio per \func{getservbyname},
 specificato tramite la stringa \param{name}, mentre \func{getservbyport}
 richiede il numero di porta in \param{port}. Entrambe le funzioni eseguono una
-ricerca sul file \conffile{/etc/services}\footnote{il \textit{Name Service
-    Switch} astrae il concetto a qualunque supporto su cui si possano
-  mantenere i suddetti dati. } ed estraggono i dati dalla prima riga che
-corrisponde agli argomenti specificati; se la risoluzione ha successo viene
-restituito un puntatore ad una apposita struttura \struct{servent} contenente
-tutti i risultati), altrimenti viene restituito un puntatore nullo.  Si tenga
-presente che anche in questo caso i dati vengono mantenuti in una area di
-memoria statica e che quindi la funzione non è rientrante.
+ricerca sul file \conffile{/etc/services}\footnote{il
+  \itindex{Name~Service~Switch} \textit{Name Service Switch} astrae il
+  concetto a qualunque supporto su cui si possano mantenere i suddetti dati.}
+ed estraggono i dati dalla prima riga che corrisponde agli argomenti
+specificati; se la risoluzione ha successo viene restituito un puntatore ad
+una apposita struttura \struct{servent} contenente tutti i risultati,
+altrimenti viene restituito un puntatore nullo.  Si tenga presente che anche
+in questo caso i dati vengono mantenuti in una area di memoria statica e che
+quindi la funzione non è rientrante.
 
 \begin{figure}[!htb]
   \footnotesize \centering
@@ -1114,18 +1125,18 @@ contiene il numero di porta e \var{s\_proto} il nome del protocollo.
 Come riportato in tab.~\ref{tab:name_resolution_functions} ci sono analoghe
 funzioni per la risoluzione del nome dei protocolli e delle reti; non staremo
 a descriverle nei dettagli, in quanto il loro uso è molto limitato, esse
-comunque hanno una struttura del tutto analoga alle precedenti, e tutti i
-dettagli relativi al loro funzionamento possono essere trovati nelle
-rispettive pagine di manuale.
+comunque utilizzano una loro struttura dedicata del tutto analoga alle
+precedenti: tutti i dettagli relativi al loro funzionamento possono essere
+trovati nelle rispettive pagine di manuale.
 
 Oltre alle funzioni di ricerca esistono delle ulteriori funzioni che prevedono
-una lettura sequenziale delle informazioni mantenute nel \textit{Name Service
-  Switch} (in sostanza permettono di leggere i file contenenti le informazioni
-riga per riga), che sono analoghe a quelle elencate in
-tab.~\ref{tab:sys_passwd_func} per le informazioni relative ai dati degli
-utenti e dei gruppi.  Nel caso specifico dei servizi avremo allora le tre
-funzioni \funcd{setservent}, \funcd{getservent} e \funcd{endservent} i cui
-prototipi sono:
+una lettura sequenziale delle informazioni mantenute nel
+\itindex{Name~Service~Switch} \textit{Name Service Switch} (in sostanza
+permettono di leggere i file contenenti le informazioni riga per riga), che
+sono analoghe a quelle elencate in tab.~\ref{tab:sys_passwd_func} per le
+informazioni relative ai dati degli utenti e dei gruppi. Nel caso specifico
+dei servizi avremo allora le tre funzioni \funcd{setservent},
+\funcd{getservent} e \funcd{endservent} i cui prototipi sono:
 \begin{functions}
   \headdecl{netdb.h} 
   \funcdecl{void setservent(int stayopen)} 
@@ -1181,8 +1192,8 @@ rimandando alle rispettive pagine di manuale.
     protocollo&\func{setprotoent}&\func{getprotoent}&\func{endprotoent}\\ 
     \hline
   \end{tabular}
-  \caption{Funzioni lettura sequenziale dei dati del \textit{Name Service
-      Switch}.} 
+  \caption{Funzioni lettura sequenziale dei dati del
+    \itindex{Name~Service~Switch} \textit{Name Service Switch}.} 
   \label{tab:name_sequential_read}
 \end{table}
 
@@ -1213,7 +1224,7 @@ nuova.
 
 La prima funzione di questa interfaccia è \funcd{getaddrinfo},\footnote{la
   funzione è definita, insieme a \func{getnameinfo} che vedremo più avanti,
-  nell'\href{http://www.ietf.org/rfc/rfc2553.txt} {RFC~2553}.} che combina le
+  nell'\href{http://www.ietf.org/rfc/rfc2553.txt}{RFC~2553}.} che combina le
 funzionalità delle precedenti \func{getipnodebyname}, \func{getipnodebyaddr},
 \func{getservbyname} e \func{getservbyport}, consentendo di ottenere
 contemporaneamente sia la risoluzione di un indirizzo simbolico che del nome
@@ -1322,14 +1333,6 @@ rispettivo protocollo di trasporto (i cui valori possibili sono riportati in
 relativi a UDP e TCP, o il valore nullo che indica di ignorare questo campo
 nella selezione.
 
-Infine l'ultimo campo è \var{ai\_flags}; che deve essere impostato come una
-maschera binaria; i bit di questa variabile infatti vengono usati per dare
-delle indicazioni sul tipo di risoluzione voluta, ed hanno valori analoghi a
-quelli visti in sez.~\ref{sec:sock_name_services} per \func{getipnodebyname};
-il valore di \var{ai\_flags} può essere impostata con un OR aritmetico delle
-costanti di tab.~\ref{tab:ai_flags_values}, ciascuna delle quali identifica un
-bit della maschera.
-
 \begin{table}[!htb]
   \centering
   \footnotesize
@@ -1376,6 +1379,15 @@ bit della maschera.
   \label{tab:ai_flags_values}
 \end{table}
 
+
+Infine l'ultimo campo è \var{ai\_flags}; che deve essere impostato come una
+maschera binaria; i bit di questa variabile infatti vengono usati per dare
+delle indicazioni sul tipo di risoluzione voluta, ed hanno valori analoghi a
+quelli visti in sez.~\ref{sec:sock_name_services} per \func{getipnodebyname};
+il valore di \var{ai\_flags} può essere impostata con un OR aritmetico delle
+costanti di tab.~\ref{tab:ai_flags_values}, ciascuna delle quali identifica un
+bit della maschera.
+
 La funzione restituisce un valore nullo in caso di successo, o un codice in
 caso di errore. I valori usati come codice di errore sono riportati in
 tab.~\ref{tab:addrinfo_error_code}; dato che la funzione utilizza altre
@@ -2107,7 +2119,7 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   \func{setsockopt} darà un errore di \errcode{ENOPROTOOPT}. 
 
 \item[\const{SO\_SNDLOWAT}] questa opzione imposta il valore che indica il
-  numero minimo di byte che devono essere presenti nel buffer di scrittura
+  numero minimo di byte che devono essere presenti nel buffer di trasmissione
   perché il kernel li invii al protocollo successivo, consentendo ad una
   \func{write} di ritornare o segnalando ad una \func{select} (vedi
   sez.~\ref{sec:TCP_sock_select}) che è possibile eseguire una scrittura.
@@ -2240,17 +2252,17 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   tipo \const{SOCK\_STREAM}.
 
 \item[\const{SO\_SNDBUF}] questa opzione imposta la dimensione del buffer di
-  uscita del socket. Prende per \param{optval} un intero indicante il numero
-  di byte. Il valore di default ed il valore massimo che si possono
+  trasmissione del socket. Prende per \param{optval} un intero indicante il
+  numero di byte. Il valore di default ed il valore massimo che si possono
   specificare come argomento per questa opzione sono impostabili
   rispettivamente tramite gli opportuni valori di \func{sysctl} (vedi
   sez.~\ref{sec:sock_sysctl}).
 
 \item[\const{SO\_RCVBUF}] questa opzione imposta la dimensione del buffer di
-  ingresso del socket. Prende per \param{optval} un intero indicante il numero
-  di byte. Il valore di default ed il valore massimo che si può specificare
-  come argomento per questa opzione sono impostabili tramiti gli opportuni
-  valori di \func{sysctl} (vedi sez.~\ref{sec:sock_sysctl}).
+  ricezione del socket. Prende per \param{optval} un intero indicante il
+  numero di byte. Il valore di default ed il valore massimo che si può
+  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
@@ -2267,7 +2279,7 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
     \procrelfile{/proc/sys/net/ipv4}{tcp\_rmem} in
     \texttt{/proc/sys/net/ipv4}, vedi sez.~\ref{sec:sock_sysctl}.} indica la
   memoria effettivamente impiegata.  Si tenga presente inoltre che le
-  modifiche alle dimensioni dei buffer di ingresso e di uscita, per poter
+  modifiche alle dimensioni dei buffer di ricezione e trasmissione, per poter
   essere effettive, devono essere impostate prima della chiamata alle funzioni
   \func{listen} o \func{connect}.
 
@@ -2304,7 +2316,7 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
 
 \item[\const{SO\_ATTACH\_FILTER}] questa opzione permette di agganciare ad un
   socket un filtro di pacchetti che consente di selezionare quali pacchetti,
-  fra tutti quelli ricevuti, verranno letti. Viene usato pincipalmente con i
+  fra tutti quelli ricevuti, verranno letti. Viene usato principalmente con i
   socket di tipo \const{PF\_PACKET} con la libreria \texttt{libpcap} per
   implementare programmi di cattura dei pacchetti, torneremo su questo in
   sez.~\ref{sec:packet_socket}.
@@ -2407,7 +2419,7 @@ comunicare con il server via rete.
 \end{figure}
 
 Abilitandola dopo un certo tempo le connessioni effettivamente terminate
-verrano comunque chiuse per cui, utilizzando ad esempio una \func{select}, se
+verranno comunque chiuse per cui, utilizzando ad esempio una \func{select}, se
 be potrà rilevare la conclusione e ricevere il relativo errore. Si tenga
 presente però che non può avere la certezza assoluta che un errore di
 \errcode{ETIMEDOUT} ottenuto dopo aver abilitato questa opzione corrisponda
@@ -2762,7 +2774,7 @@ sono definite in \file{netinet/ip.h}, ed accessibili includendo detto file.
     \const{IP\_DROP\_MEMBERSHIP}&         &$\bullet$&   &\struct{ip\_mreqn}& 
       Si sgancia da un gruppo di \textit{multicast}.\\
     \const{IP\_MULTICAST\_IF}   &         &$\bullet$&   &\struct{ip\_mreqn}& 
-      Omposta l'interfaccia locale di un socket \itindex{multicast} 
+      Imposta l'interfaccia locale di un socket \itindex{multicast} 
       \textit{multicast}.\\ 
    \hline
   \end{tabular}
@@ -3121,9 +3133,10 @@ quantit
     quando un programma di terminale invia un segmento TCP per ogni tasto
     premuto, 40 byte di intestazione di protocollo con 1 byte di dati
     trasmessi; per evitare situazioni del genere è stato introdotto
-    l'\textsl{algoritmo di Nagle}.}  Questo meccanismo è controllato da un
-  apposito algoritmo (detto \textsl{algoritmo di Nagle}, vedi
-  sez.~\ref{sez:tcp_protocol_xxx}). Il comportamento normale del protocollo
+    \index{algoritmo~di~Nagle} l'\textsl{algoritmo di Nagle}.}  Questo
+  meccanismo è controllato da un apposito algoritmo (detto
+  \index{algoritmo~di~Nagle} \textsl{algoritmo di Nagle}, vedi
+  sez.~\ref{sez:tcp_protocol_xxx}).  Il comportamento normale del protocollo
   prevede che i dati siano accumulati fintanto che non si raggiunge una
   quantità considerata adeguata per eseguire la trasmissione di un singolo
   segmento.
@@ -3134,10 +3147,11 @@ quantit
     richiesta HTTP.} in tal caso l'attesa introdotta dall'algoritmo di
   bufferizzazione non soltanto è inutile, ma peggiora le prestazioni
   introducendo un ritardo.  Impostando questa opzione si disabilita l'uso
-  dell'\textsl{algoritmo di Nagle} ed i dati vengono inviati immediatamente in
-  singoli segmenti, qualunque sia la loro dimensione.  Ovviamente l'uso di
-  questa opzione è dedicato a chi ha esigenze particolari come quella
-  illustrata, che possono essere stabilite solo per la singola applicazione.
+  \index{algoritmo~di~Nagle} dell'\textsl{algoritmo di Nagle} ed i dati
+  vengono inviati immediatamente in singoli segmenti, qualunque sia la loro
+  dimensione.  Ovviamente l'uso di questa opzione è dedicato a chi ha esigenze
+  particolari come quella illustrata, che possono essere stabilite solo per la
+  singola applicazione.
 
   Si tenga conto che questa opzione viene sovrascritta dall'eventuale
   impostazione dell'opzione \const{TCP\_CORK} (il cui scopo è sostanzialmente
@@ -3160,15 +3174,15 @@ quantit
 \item[\const{TCP\_CORK}] questa opzione è il complemento naturale di
   \const{TCP\_NODELAY} e serve a gestire a livello applicativo la situazione
   opposta, cioè quella in cui si sa fin dal principio che si dovranno inviare
-  grosse quantità di dati. Anche in questo caso l'\textsl{algoritmo di Nagle}
-  tenderà a suddividerli in dimensioni da lui ritenute
-  opportune,\footnote{l'algoritmo cerca di tenere conto di queste situazioni,
-    ma essendo un algoritmo generico tenderà comunque ad introdurre delle
-    suddivisioni in segmenti diversi, anche quando potrebbero non essere
-    necessarie, con conseguente spreco di banda.}  ma sapendo fin dall'inizio
-  quale è la dimensione dei dati si potranno di nuovo ottenere delle migliori
-  prestazioni disabilitandolo, e gestendo direttamente l'invio del nostro
-  blocco di dati in soluzione unica.
+  grosse quantità di dati. Anche in questo caso \index{algoritmo~di~Nagle}
+  l'\textsl{algoritmo di Nagle} tenderà a suddividerli in dimensioni da lui
+  ritenute opportune,\footnote{l'algoritmo cerca di tenere conto di queste
+    situazioni, ma essendo un algoritmo generico tenderà comunque ad
+    introdurre delle suddivisioni in segmenti diversi, anche quando potrebbero
+    non essere necessarie, con conseguente spreco di banda.}  ma sapendo fin
+  dall'inizio quale è la dimensione dei dati si potranno di nuovo ottenere
+  delle migliori prestazioni disabilitandolo, e gestendo direttamente l'invio
+  del nostro blocco di dati in soluzione unica.
 
   Quando questa opzione viene abilitata non vengono inviati segmenti di dati
   fintanto che essa non venga disabilitata; a quel punto tutti i dati rimasti
@@ -3318,7 +3332,7 @@ quantit
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
-    \includecodesnip{listati/is_closing.c}
+    \includecodesample{listati/is_closing.c}
   \end{minipage}
   \caption{Codice della funzione \texttt{is\_closing.c}, che controlla lo stato
     di un socket TCP per verificare se si sta chiudendo.}
@@ -3406,28 +3420,28 @@ quantit
       reno& -- &Algoritmo tradizionale, usato in caso di assenza degli altri.\\
       \texttt{bic}     &\texttt{TCP\_CONG\_BIC}     & 
       \href{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}
-      {\texttt{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}}.\\
+      {\textsf{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}}.\\
       \texttt{cubic}   &\texttt{TCP\_CONG\_CUBIC}     & 
       \href{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}
-      {\texttt{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}}.\\
+      {\textsf{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}}.\\
       \texttt{highspeed}&\texttt{TCP\_CONG\_HSTCP}  & 
       \href{http://www.icir.org/floyd/hstcp.html}
-      {\texttt{http://www.icir.org/floyd/hstcp.html}}.\\
+      {\textsf{http://www.icir.org/floyd/hstcp.html}}.\\
       \texttt{htcp}    &\texttt{TCP\_CONG\_HTCP}    & 
       \href{http://www.hamilton.ie/net/htcp/}
-      {\texttt{http://www.hamilton.ie/net/htcp/}}.\\
+      {\textsf{http://www.hamilton.ie/net/htcp/}}.\\
       \texttt{hybla}   &\texttt{TCP\_CONG\_HYBLA}   &       
       \href{http://www.danielinux.net/projects.html}
-      {\texttt{http://www.danielinux.net/projects.html}}.\\
+      {\textsf{http://www.danielinux.net/projects.html}}.\\
       \texttt{scalable}&\texttt{TCP\_CONG\_SCALABLE}&  
       \href{http://www.deneholme.net/tom/scalable/}
-      {\texttt{http://www.deneholme.net/tom/scalable/}}.\\
+      {\textsf{http://www.deneholme.net/tom/scalable/}}.\\
       \texttt{vegas}   &\texttt{TCP\_CONG\_VEGAS}   &  
       \href{http://www.cs.arizona.edu/protocols/}
-      {\texttt{http://www.cs.arizona.edu/protocols/}}.\\
+      {\textsf{http://www.cs.arizona.edu/protocols/}}.\\
       \texttt{westwood}&\texttt{TCP\_CONG\_WESTWOOD}& 
       \href{http://www.cs.ucla.edu/NRL/hpi/tcpw/}
-      {\texttt{http://www.cs.ucla.edu/NRL/hpi/tcpw/}}.\\
+      {\textsf{http://www.cs.ucla.edu/NRL/hpi/tcpw/}}.\\
 %      \texttt{}&\texttt{}& .\\
       \hline
     \end{tabular}
@@ -3990,15 +4004,16 @@ socket.  Quelli descritti anche nella pagina di manuale, accessibile con
 
 \begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}}
 \item[\procrelfile{/proc/sys/net/core}{rmem\_default}] imposta la dimensione
-  di default del buffer di lettura (cioè per i dati in ingresso) dei socket.
+  di default del buffer di ricezione (cioè per i dati in ingresso) dei socket.
 \item[\procrelfile{/proc/sys/net/core}{rmem\_max}] imposta la dimensione
-  massima che si può assegnare al buffer di ingresso dei socket attraverso
+  massima che si può assegnare al buffer di ricezione dei socket attraverso
   l'uso dell'opzione \const{SO\_RCVBUF}.
 \item[\procrelfile{/proc/sys/net/core}{wmem\_default}] imposta la dimensione
-  di default del buffer di scrittura (cioè per i dati in uscita) dei socket.
+  di default del buffer di trasmissione (cioè per i dati in uscita) dei
+  socket.
 \item[\procrelfile{/proc/sys/net/core}{wmem\_max}] imposta la dimensione
-  massima che si può assegnare al buffer di uscita dei socket attraverso l'uso
-  dell'opzione \const{SO\_SNDBUF}.
+  massima che si può assegnare al buffer di trasmissione dei socket attraverso
+  l'uso dell'opzione \const{SO\_SNDBUF}.
 \item[\procrelfile{/proc/sys/net/core}{message\_cost},
   \procrelfile{/proc/sys/net/core}{message\_burst}] contengono le impostazioni
   del \itindex{bucket~filter} \textit{bucket filter} che controlla l'emissione
@@ -4097,7 +4112,7 @@ di manuale accessibile con \texttt{man 7 ip}, sono i seguenti:
   valore di default è 64, e normalmente non c'è nessuna necessità di
   modificarlo.\footnote{l'unico motivo sarebbe per raggiungere macchine
     estremamente ``{lontane}'' in termini di \textit{hop}, ma è praticamente
-    impossible trovarne.} Aumentare il valore è una pratica poco gentile, in
+    impossibile trovarne.} Aumentare il valore è una pratica poco gentile, in
   quanto in caso di problemi di routing si allunga inutilmente il numero di
   ritrasmissioni.
 
@@ -4353,7 +4368,7 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti:
   
 
 \item[\procrelfile{/proc/sys/net/ipv4}{tcp\_mem}] viene usato dallo stack TCP
-  per gestire le modalità con cui esso utlizzerà la memoria. Prende una
+  per gestire le modalità con cui esso utilizzerà la memoria. Prende una
   tripletta di valori interi, che indicano un numero di pagine:
 
   \begin{itemize*}
@@ -4410,8 +4425,8 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti:
   nell'\href{http://www.ietf.org/rfc/rfc1122.txt}{RFC~1122} dove è indicato un
   massimo di 100 secondi, che però è un valore considerato troppo basso.
 
-\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_rfc1337}] indica allo stack TCP
-  del kernel di abilitare il comportamento richiesto
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_rfc1337}] indica al kernel di
+  abilitare il comportamento richiesto
   nell'\href{http://www.ietf.org/rfc/rfc1337.txt}{RFC~1337}. Prende un valore
   logico e di default è disabilitato, il che significa che alla ricezione di
   un segmento RST in stato \texttt{TIME\_WAIT} il socket viene chiuso
@@ -4423,15 +4438,15 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti:
   anche in rapporto alla memoria disponibile.  Prende una tripletta di valori
   interi separati da spazi che indicano delle dimensioni in byte:
 
-  \begin{itemize*}
+  \begin{itemize}
   \item il primo valore, chiamato \textit{min} nelle pagine di manuale, indica
-    la dimensione minima del buffer di ricezione; il default è 4Kb, ma in
-    sistemi con poca memoria viene automaticamente ridotto a
+    la dimensione minima in byte del buffer di ricezione; il default è 4Kb, ma
+    in sistemi con poca memoria viene automaticamente ridotto a
     \const{PAGE\_SIZE}.  Questo valore viene usato per assicurare che anche in
     situazioni di pressione sulla memoria (vedi quanto detto per
-    \procrelfile{/proc/sys/net/ipv4}{tcp\_mem}) le allocazioni al di sotto di
+    \procrelfile{/proc/sys/net/ipv4}{tcp\_rmem}) le allocazioni al di sotto di
     questo limite abbiamo comunque successo.  Questo valore non viene comunque
-    ad incidere sulla dimensione del buffer di lettura di un singolo socket
+    ad incidere sulla dimensione del buffer di ricezione di un singolo socket
     dichiarata con l'opzione \const{SO\_RCVBUF}.
 
   \item il secondo valore, denominato \textit{default} nelle pagine di
@@ -4447,17 +4462,17 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti:
     \procrelfile{/proc/sys/net/ipv4}{tcp\_window\_scaling}).
 
   \item il terzo valore, denominato \textit{max} nelle pagine di manuale,
-    indica la dimensione massima, in byte, del buffer di ricezione di un
-    socket TCP; il default è 174760 byte, che viene ridotto automaticamente a
-    87380 per sistemi con poca memoria. Il valore non può comunque eccedere il
+    indica la dimensione massima in byte del buffer di ricezione di un socket
+    TCP; il default è 174760 byte, che viene ridotto automaticamente a 87380
+    per sistemi con poca memoria. Il valore non può comunque eccedere il
     limite generale per tutti i socket posto con
     \procfile{/proc/sys/net/core/rmem\_max}. Questo valore non viene ad
-    incidere sulla dimensione del buffer di lettura di un singolo socket
+    incidere sulla dimensione del buffer di ricezione di un singolo socket
     dichiarata con l'opzione \const{SO\_RCVBUF}.
-  \end{itemize*}
+  \end{itemize}
 
 \item[\procrelfile{/proc/sys/net/ipv4}{tcp\_sack}] indica al kernel di
-  utilizzare il meccanismo del \textit{TCP selective aknowledment} definito
+  utilizzare il meccanismo del \textit{TCP selective acknowledgement} definito
   nell'\href{http://www.ietf.org/rfc/rfc2018.txt}{RFC~2018}. Prende un valore
   logico e di default è abilitato.
 
@@ -4471,12 +4486,12 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti:
   dar luogo a problemi di interoperabilità.
 
 \item[\procrelfile{/proc/sys/net/ipv4}{tcp\_synack\_retries}] indica il numero
-  massimo di volte che verrà ritasmesso il segmento SYN/ACK nella creazione di
+  massimo di volte che verrà ritrasmesso il segmento SYN/ACK nella creazione di
   una connessione (vedi sez.~\ref{sec:TCP_conn_cre}). Prende un valore intero
   ed il valore di default è 5; non si deve superare il valore massimo di 255.
 
 \item[\procrelfile{/proc/sys/net/ipv4}{tcp\_syncookies}] abilita i \textit{TCP
-    syncookies}.\footnote{per poter usare quasta funzionalità è necessario
+    syncookies}.\footnote{per poter usare questa funzionalità è necessario
     avere abilitato l'opzione \texttt{CONFIG\_SYN\_COOKIES} nella compilazione
     del kernel.} Prende un valore logico, e di default è disabilitato. Questa
   funzionalità serve a fornire una protezione in caso di un attacco di tipo
@@ -4499,7 +4514,12 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti:
 \item[\procrelfile{/proc/sys/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.
+  che può causare problemi con il NAT.\footnote{il \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 \itindex{netfilter}
+    \textit{netfilter}, per maggiori dettagli si consulti il cap.~2 di
+    \cite{FwGL}.}
 
 \item[\procrelfile{/proc/sys/net/ipv4}{tcp\_tw\_reuse}] abilita il riutilizzo
   dello stato \texttt{TIME\_WAIT} quando questo è sicuro dal punto di vista
@@ -4516,17 +4536,51 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti:
   aumentarne le dimensioni. Questa è pienamente supportata dallo stack TCP di
   Linux, ma se lo si disabilita la negoziazione del
   \itindex{TCP~window~scaling} \textit{TCP window scaling} con l'altro capo
-  della conessione non viene effettuata.
+  della connessione non viene effettuata.
 
-\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_vegas\_cong\_avoid}] 
+%\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_vegas\_cong\_avoid}] 
+% TODO: controllare su internet
 
-\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_westwood}] 
+%\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_westwood}] 
+% TODO: controllare su internet
 
-\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_wmem}] 
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_wmem}] viene usato dallo stack TCP
+  per controllare dinamicamente le dimensioni dei propri buffer di spedizione,
+  adeguandole in rapporto alla memoria disponibile.  Prende una tripletta di
+  valori interi separati da spazi che indicano delle dimensioni in byte:
 
-\end{basedescript}
+  \begin{itemize}
+  \item il primo valore, chiamato \textit{min}, indica la dimensione minima in
+    byte del buffer di spedizione; il default è 4Kb. Come per l'analogo di
+    \procrelfile{/proc/sys/net/ipv4}{tcp\_rmem}) viene usato per assicurare
+    che anche in situazioni di pressione sulla memoria (vedi
+    \procrelfile{/proc/sys/net/ipv4}{tcp\_mem}) le allocazioni al di sotto di
+    questo limite abbiamo comunque successo.  Di nuovo questo valore non viene
+    ad incidere sulla dimensione del buffer di trasmissione di un singolo
+    socket dichiarata con l'opzione \const{SO\_SNDBUF}.
+
+  \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 \procfile{/proc/sys/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
+    \procrelfile{/proc/sys/net/ipv4}{tcp\_rmem}) se si vuole che in
+    corrispondenza aumentino anche le dimensioni usate per la finestra TCP si
+    deve abilitare il \itindex{TCP~window~scaling} \textit{TCP window scaling}
+    con \procrelfile{/proc/sys/net/ipv4}{tcp\_window\_scaling}.
 
+  \item il terzo valore, denominato \textit{max}, indica la dimensione massima
+    in byte del buffer di spedizione di un socket TCP; il default è 128Kb, che
+    viene ridotto automaticamente a 64Kb per sistemi con poca memoria. Il
+    valore non può comunque eccedere il limite generale per tutti i socket
+    posto con \procfile{/proc/sys/net/core/wmem\_max}. Questo valore non viene
+    ad incidere sulla dimensione del buffer di trasmissione di un singolo
+    socket dichiarata con l'opzione \const{SO\_SNDBUF}.
+  \end{itemize}
 
+\end{basedescript}
 
 
 
@@ -4604,9 +4658,11 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti:
 % LocalWords:  metric EOPNOTSUPP mtu hwaddr ARPHRD interrupt DMA map qlen silly
 % LocalWords:  rename ifconf syndrome dell'ACK FTP ACCEPTFILTER advanced reno
 % LocalWords:  congestion control Networking cubic CUBIC highspeed HSTCP htcp
-% LocalWords:  HTCP hybla HYBLA scalable SCALABLE ifc req iflist access ntoa
-% LocalWords:  hop Selective Acknowledgement acknowledgement Explicit RTO stack
-% LocalWords:  Notification wireless denial pressure
+% LocalWords:  HTCP hybla HYBLA scalable SCALABLE ifc req iflist access ntoa Kb
+% LocalWords:  hop Selective acknowledgement Explicit RTO stack firewall
+% LocalWords:  Notification wireless denial pressure ATTACH DETACH
+% LocalWords:  libpcap discovery point l'overhaed min PAGE flood
+% LocalWords:  selective COOKIES NAT
 
 %%% Local Variables: 
 %%% mode: latex