Aggiornamenti del copyright all'anno nuovo, e risistemazione delle
[gapil.git] / sockctrl.tex
index 778fd865bda0fac9aacf216cd1c50c421bacb4fd..df3ed6921e0c0feb3ffb826be486b32ca4913bf8 100644 (file)
@@ -1,6 +1,6 @@
 %% sockctrl.tex
 %%
 %% sockctrl.tex
 %%
-%% Copyright (C) 2004-2006 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2004-2007 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Prefazione",
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Prefazione",
@@ -8,6 +8,7 @@
 %% license is included in the section entitled "GNU Free Documentation
 %% License".
 %%
 %% license is included in the section entitled "GNU Free Documentation
 %% License".
 %%
+
 \chapter{La gestione dei socket}
 \label{cha:sock_generic_management}
 
 \chapter{La gestione dei socket}
 \label{cha:sock_generic_management}
 
@@ -617,7 +618,7 @@ argomento (che si presume sia dato da \var{h\_errno}).
 \subsection{La risoluzione dei nomi a dominio}
 \label{sec:sock_name_services}
 
 \subsection{La risoluzione dei nomi a dominio}
 \label{sec:sock_name_services}
 
-La principale funzionalità del \itindex{resolver}\textit{resolver} resta
+La principale funzionalità del \itindex{resolver} \textit{resolver} resta
 quella di risolvere i nomi a dominio in indirizzi IP, per cui non ci
 dedicheremo oltre alle funzioni di richiesta generica ed esamineremo invece le
 funzioni a questo dedicate. La prima funzione è \funcd{gethostbyname} il cui
 quella di risolvere i nomi a dominio in indirizzi IP, per cui non ci
 dedicheremo oltre alle funzioni di richiesta generica ed esamineremo invece le
 funzioni a questo dedicate. La prima funzione è \funcd{gethostbyname} il cui
@@ -682,7 +683,7 @@ Con l'uso di \func{gethostbyname} normalmente si ottengono solo gli indirizzi
 IPv4, se si vogliono ottenere degli indirizzi IPv6 occorrerà prima impostare
 l'opzione \const{RES\_USE\_INET6} nel campo \texttt{\_res.options} e poi
 chiamare \func{res\_init} (vedi sez.~\ref{sec:sock_resolver_functions}) per
 IPv4, se si vogliono ottenere degli indirizzi IPv6 occorrerà prima impostare
 l'opzione \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 \itindex{resolver}\textit{resolver}; dato che
+modificare le opzioni del \itindex{resolver} \textit{resolver}; dato che
 questo non è molto comodo è stata definita\footnote{questa è una estensione
   fornita dalle \acr{glibc}, disponibile anche in altri sistemi unix-like.}
 un'altra funzione, \funcd{gethostbyname2}, il cui prototipo è:
 questo non è molto comodo è stata definita\footnote{questa è una estensione
   fornita dalle \acr{glibc}, disponibile anche in altri sistemi unix-like.}
 un'altra funzione, \funcd{gethostbyname2}, il cui prototipo è:
@@ -719,7 +720,7 @@ suoi risultati.
 Vediamo allora un primo esempio dell'uso delle funzioni di risoluzione, in
 fig.~\ref{fig:mygethost_example} è riportato un estratto del codice di un
 programma che esegue una semplice interrogazione al
 Vediamo allora un primo esempio dell'uso delle funzioni di risoluzione, in
 fig.~\ref{fig:mygethost_example} è riportato un estratto del codice di un
 programma che esegue una semplice interrogazione al
-\itindex{resolver}\textit{resolver} usando \func{gethostbyname} e poi ne
+\itindex{resolver} \textit{resolver} usando \func{gethostbyname} e poi ne
 stampa a video i risultati. Al solito il sorgente completo, che comprende il
 trattamento delle opzioni ed una funzione per stampare un messaggio di aiuto,
 è nel file \texttt{mygethost.c} dei sorgenti allegati alla guida.
 stampa a video i risultati. Al solito il sorgente completo, che comprende il
 trattamento delle opzioni ed una funzione per stampare un messaggio di aiuto,
 è nel file \texttt{mygethost.c} dei sorgenti allegati alla guida.
@@ -776,14 +777,14 @@ chiamate i dati potranno essere sovrascritti. Si tenga presente poi che
 copiare il contenuto della sola struttura non è sufficiente per salvare tutti
 i dati, in quanto questa contiene puntatori ad altri dati, che pure possono
 essere sovrascritti; per questo motivo, se si vuole salvare il risultato di
 copiare il contenuto della sola struttura non è sufficiente per salvare tutti
 i dati, in quanto questa contiene puntatori ad altri dati, che pure possono
 essere sovrascritti; per questo motivo, se si vuole salvare il risultato di
-una chiamata, occorrerà eseguire quella che si chiama una
-\itindex{deep~copy}\textit{deep copy}.\footnote{si chiama così quella tecnica
-  per cui, quando si deve copiare il contenuto di una struttura complessa (con
-  puntatori che puntano ad altri dati, che a loro volta possono essere
-  puntatori ad altri dati) si deve copiare non solo il contenuto della
-  struttura, ma eseguire una scansione per risolvere anche tutti i puntatori
-  contenuti in essa (e così via se vi sono altre sottostrutture con altri
-  puntatori) e copiare anche i dati da questi referenziati.}
+una chiamata, occorrerà eseguire quella che si chiama una \itindex{deep~copy}
+\textit{deep copy}.\footnote{si chiama così quella tecnica per cui, quando si
+  deve copiare il contenuto di una struttura complessa (con puntatori che
+  puntano ad altri dati, che a loro volta possono essere puntatori ad altri
+  dati) si deve copiare non solo il contenuto della struttura, ma eseguire una
+  scansione per risolvere anche tutti i puntatori contenuti in essa (e così
+  via se vi sono altre sottostrutture con altri puntatori) e copiare anche i
+  dati da questi referenziati.}
 
 Per ovviare a questi problemi nelle \acr{glibc} sono definite anche delle
 versioni rientranti delle precedenti funzioni, al solito queste sono
 
 Per ovviare a questi problemi nelle \acr{glibc} sono definite anche delle
 versioni rientranti delle precedenti funzioni, al solito queste sono
@@ -818,7 +819,7 @@ lunghezza di questo buffer devono essere indicati con gli argomenti
 \param{buf} e \param{buflen}.
 
 Gli ultimi due argomenti vengono utilizzati per avere indietro i risultati
 \param{buf} e \param{buflen}.
 
 Gli ultimi due argomenti vengono utilizzati per avere indietro i risultati
-come \itindex{value~result~argument}\textit{value result argument}, si deve
+come \itindex{value~result~argument} \textit{value result argument}, si deve
 specificare l'indirizzo della variabile su cui la funzione dovrà salvare il
 codice di errore con \param{h\_errnop} e quello su cui dovrà salvare il
 puntatore che si userà per accedere i dati con \param{result}.
 specificare l'indirizzo della variabile su cui la funzione dovrà salvare il
 codice di errore con \param{h\_errnop} e quello su cui dovrà salvare il
 puntatore che si userà per accedere i dati con \param{result}.
@@ -1255,7 +1256,7 @@ utilizzata dalla funzione per riportare (come \itindex{value~result~argument}
 rientrante, ed alloca autonomamente tutta la memoria necessaria in cui
 verranno riportati i risultati della risoluzione.  La funzione scriverà
 all'indirizzo puntato da \param{res} il puntatore iniziale ad una
 rientrante, ed alloca autonomamente tutta la memoria necessaria in cui
 verranno riportati i risultati della risoluzione.  La funzione scriverà
 all'indirizzo puntato da \param{res} il puntatore iniziale ad una
-\itindex{linked~list}\textit{linked list} di strutture di tipo
+\itindex{linked~list} \textit{linked list} di strutture di tipo
 \struct{addrinfo} contenenti tutte le informazioni ottenute.
 
 \begin{figure}[!htb]
 \struct{addrinfo} contenenti tutte le informazioni ottenute.
 
 \begin{figure}[!htb]
@@ -1462,13 +1463,13 @@ lista illustrata in fig.~\ref{fig:sock_addrinfo_list}.
 \begin{figure}[!htb]
   \centering
   \includegraphics[width=10cm]{img/addrinfo_list}
 \begin{figure}[!htb]
   \centering
   \includegraphics[width=10cm]{img/addrinfo_list}
-  \caption{La \itindex{linked~list}\textit{linked list} delle strutture
+  \caption{La \itindex{linked~list} \textit{linked list} delle strutture
     \struct{addrinfo} restituite da \func{getaddrinfo}.}
   \label{fig:sock_addrinfo_list}
 \end{figure}
 
 Come primo esempio di uso di \func{getaddrinfo} vediamo un programma
     \struct{addrinfo} restituite da \func{getaddrinfo}.}
   \label{fig:sock_addrinfo_list}
 \end{figure}
 
 Come primo esempio di uso di \func{getaddrinfo} vediamo un programma
-elementare di interrogazione del \itindex{resolver}\textit{resolver} basato
+elementare di interrogazione del \itindex{resolver} \textit{resolver} basato
 questa funzione, il cui corpo principale è riportato in
 fig.~\ref{fig:mygetaddr_example}. Il codice completo del programma, compresa
 la gestione delle opzioni in cui è gestita l'eventuale inizializzazione
 questa funzione, il cui corpo principale è riportato in
 fig.~\ref{fig:mygetaddr_example}. Il codice completo del programma, compresa
 la gestione delle opzioni in cui è gestita l'eventuale inizializzazione
@@ -1559,7 +1560,7 @@ IPv4 address:
 \end{Verbatim}
 %$
 
 \end{Verbatim}
 %$
 
-Una volta estratti i risultati dalla \itindex{linked~list}\textit{linked list}
+Una volta estratti i risultati dalla \itindex{linked~list} \textit{linked list}
 puntata da \param{res} se questa non viene più utilizzata si dovrà avere cura
 di disallocare opportunamente tutta la memoria, per questo viene fornita
 l'apposita funzione \funcd{freeaddrinfo}, il cui prototipo è:
 puntata da \param{res} se questa non viene più utilizzata si dovrà avere cura
 di disallocare opportunamente tutta la memoria, per questo viene fornita
 l'apposita funzione \funcd{freeaddrinfo}, il cui prototipo è:
@@ -1581,7 +1582,7 @@ per \param{res}.
 
 Si tenga presente infine che se si copiano i risultati da una delle strutture
 \struct{addrinfo} restituite nella lista indicizzata da \param{res}, occorre
 
 Si tenga presente infine che se si copiano i risultati da una delle strutture
 \struct{addrinfo} restituite nella lista indicizzata da \param{res}, occorre
-avere cura di eseguire una \itindex{deep~copy}\textit{deep copy} in cui
+avere cura di eseguire una \itindex{deep~copy} \textit{deep copy} in cui
 si copiano anche tutti i dati presenti agli indirizzi contenuti nella
 struttura \struct{addrinfo}, perché una volta disallocati i dati con
 \func{freeaddrinfo} questi non sarebbero più disponibili. 
 si copiano anche tutti i dati presenti agli indirizzi contenuti nella
 struttura \struct{addrinfo}, perché una volta disallocati i dati con
 \func{freeaddrinfo} questi non sarebbero più disponibili. 
@@ -1979,7 +1980,7 @@ di \func{setsockopt}, anche se non 
 per entrambe le funzioni. In questo caso \param{optval} viene usato per
 ricevere le informazioni ed indica l'indirizzo a cui andranno scritti i dati
 letti dal socket, infine \param{optlen} diventa un puntatore ad una variabile
 per entrambe le funzioni. In questo caso \param{optval} viene usato per
 ricevere le informazioni ed indica l'indirizzo a cui andranno scritti i dati
 letti dal socket, infine \param{optlen} diventa un puntatore ad una variabile
-che viene usata come \itindex{value~result~argument}\textit{value result
+che viene usata come \itindex{value~result~argument} \textit{value result
   argument} per indicare, prima della chiamata della funzione, la lunghezza
 del buffer allocato per \param{optval} e per ricevere indietro, dopo la
 chiamata della funzione, la dimensione effettiva dei dati scritti su di esso.
   argument} per indicare, prima della chiamata della funzione, la lunghezza
 del buffer allocato per \param{optval} e per ricevere indietro, dopo la
 chiamata della funzione, la dimensione effettiva dei dati scritti su di esso.
@@ -2239,9 +2240,10 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
 
 \item[\const{SO\_SNDBUF}] questa opzione imposta la dimensione del buffer di
   uscita del socket. Prende per \param{optval} un intero indicante il numero
 
 \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 può specificare
-  come argomento per questa opzione sono impostabili tramiti gli opportuni
-  valori di \func{sysctl} (vedi sez.~\ref{sec:sock_sysctl}).
+  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
 
 \item[\const{SO\_RCVBUF}] questa opzione imposta la dimensione del buffer di
   ingresso del socket. Prende per \param{optval} un intero indicante il numero
@@ -2249,6 +2251,23 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   come argomento per questa opzione sono impostabili tramiti gli opportuni
   valori di \func{sysctl} (vedi sez.~\ref{sec:sock_sysctl}).
 
   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
+  \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
+  viene usata come buffer per i dati, mentre il valore letto da
+  \func{getsockopt} e quello riportato nei vari parametri di
+  \textit{sysctl}\footnote{cioè \texttt{wmem\_max} e \texttt{rmem\_max} in
+    \texttt{/proc/sys/net/core} e \texttt{tcp\_wmem} e \texttt{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
+  essere effettive, devono essere impostate prima della chiamata alle funzioni
+  \func{listen} o \func{connect}.
+
 \item[\const{SO\_LINGER}] questa opzione controlla le modalità con cui viene
   chiuso un socket quando si utilizza un protocollo che supporta le
   connessioni (è pertanto usata con i socket TCP ed ignorata per UDP) e
 \item[\const{SO\_LINGER}] questa opzione controlla le modalità con cui viene
   chiuso un socket quando si utilizza un protocollo che supporta le
   connessioni (è pertanto usata con i socket TCP ed ignorata per UDP) e
@@ -2274,9 +2293,15 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
 
 \item[\const{SO\_ERROR}] questa opzione riceve un errore presente sul socket;
   può essere utilizzata soltanto con \func{getsockopt} e prende per
 
 \item[\const{SO\_ERROR}] questa opzione riceve un errore presente sul socket;
   può essere utilizzata soltanto con \func{getsockopt} e prende per
-  \param{optval} un valore intero.  
+  \param{optval} un valore intero, nel quale viene restituito il codice di
+  errore, e la condizione di errore sul socket viene cancellata. Viene
+  usualmente utilizzata per ricevere il codice di errore, come accennato in
+  sez.~\ref{sec:TCP_sock_select}, quando si sta osservando il socket con una
+  \func{select} che ritorna a causa dello stesso.
 \end{basedescript}
 
 \end{basedescript}
 
+% TODO documentare SO_ATTACH_FILTER e SO_DETACH_FILTER
+
 
 \subsection{L'uso delle principali opzioni dei socket}
 \label{sec:sock_options_main}
 
 \subsection{L'uso delle principali opzioni dei socket}
 \label{sec:sock_options_main}
@@ -2294,52 +2319,53 @@ approfondimento sul significato delle opzioni generiche pi
 
 La prima opzione da approfondire è \const{SO\_KEEPALIVE} che permette di
 tenere sotto controllo lo stato di una connessione. Una connessione infatti
 
 La prima opzione da approfondire è \const{SO\_KEEPALIVE} che permette di
 tenere sotto controllo lo stato di una connessione. Una connessione infatti
-resta attiva anche quando non viene effettuato alcun traffico su di essa,
-questo può comportare che un crollo della connessione, qualora avvenisse ad
-esempio in conseguenza di una interruzione completa della rete, potrebbe
-passare inosservato.
+resta attiva anche quando non viene effettuato alcun traffico su di essa; è
+allora possibile, in caso di una interruzione completa della rete, che la
+caduta della connessione non venga rilevata, dato che sulla stessa non passa
+comunque alcun traffico.
 
 Se si imposta questa opzione, è invece cura del kernel inviare degli appositi
 messaggi sulla rete, detti appunto \textit{keep-alive}, per verificare se la
 
 Se si imposta questa opzione, è invece cura del kernel inviare degli appositi
 messaggi sulla rete, detti appunto \textit{keep-alive}, per verificare se la
-connessione è attiva.  L'opzione funziona soltanto con socket che supportino
+connessione è attiva.  L'opzione funziona soltanto con i socket che supportano
 le connessioni (non ha senso per socket UDP ad esempio) e si applica
 principalmente ai socket TCP.
 
 Con le impostazioni di default (che sono riprese da BSD) Linux emette un
 messaggio di \textit{keep-alive}\footnote{in sostanza un segmento ACK vuoto,
   cui sarà risposto con un altro segmento ACK vuoto.} verso l'altro capo della
 le connessioni (non ha senso per socket UDP ad esempio) e si applica
 principalmente ai socket TCP.
 
 Con le impostazioni di default (che sono riprese da BSD) Linux emette un
 messaggio di \textit{keep-alive}\footnote{in sostanza un segmento ACK vuoto,
   cui sarà risposto con un altro segmento ACK vuoto.} verso l'altro capo della
-connessione se questa è rimasta senza traffico per più di due ore. Se è tutto
+connessione se questa è rimasta senza traffico per più di due ore.  Se è tutto
 a posto il messaggio viene ricevuto e verrà emesso un segmento ACK di
 risposta, alla cui ricezione ripartirà un altro ciclo di attesa per altre due
 ore di inattività; il tutto avviene all'interno del kernel e le applicazioni
 non riceveranno nessun dato.
 
 a posto il messaggio viene ricevuto e verrà emesso un segmento ACK di
 risposta, alla cui ricezione ripartirà un altro ciclo di attesa per altre due
 ore di inattività; il tutto avviene all'interno del kernel e le applicazioni
 non riceveranno nessun dato.
 
-In caso di problemi invece si possono avere i due casi già illustrati in
-sez.~\ref{sec:TCP_conn_crash} per il caso di terminazione precoce del server:
-il primo è quello in cui la macchina remota è caduta ed è stata riavviata, per
-cui dopo il riavvio la connessione non viene più riconosciuta,\footnote{si
-  ricordi che un normale riavvio non ha questo effetto, in quanto in tal caso
-  si passa per la chiusura del processo, e questo, come illustrato in
-  sez.~\ref{sec:file_close}, comporta la chiusura del socket con l'invio di un
-  segmento FIN all'altro capo della connessione, che verrà regolarmente
-  chiusa.} in questo caso all'invio del messaggio di \textit{keep-alive} si
-otterrà come risposta un segmento RST che indica che l'altro capo non
-riconosce più l'esistenza della connessione. In tal caso il socket viene
-chiuso dopo aver impostato un errore \errcode{ECONNRESET}.
+Qualora ci siano dei problemi di rete si possono invece verificare i due casi
+di terminazione precoce del server già illustrati in
+sez.~\ref{sec:TCP_conn_crash}. Il primo è quello in cui la macchina remota ha
+avuto un crollo del sistema ed è stata riavviata, per cui dopo il riavvio la
+connessione non esiste più.\footnote{si ricordi che un normale riavvio o il
+  crollo dell'applicazione non ha questo effetto, in quanto in tal caso si
+  passa sempre per la chiusura del processo, e questo, come illustrato in
+  sez.~\ref{sec:file_close}, comporta anche la regolare chiusura del socket
+  con l'invio di un segmento FIN all'altro capo della connessione.} In questo
+caso all'invio del messaggio di \textit{keep-alive} si otterrà come risposta
+un segmento RST che indica che l'altro capo non riconosce più l'esistenza
+della connessione ed il socket verrà chiuso riportando un errore di
+\errcode{ECONNRESET}.
 
 Se invece non viene ricevuta nessuna risposta (indice che la macchina non è
 più raggiungibile) l'emissione dei messaggi viene ripetuta ad intervalli di 75
 secondi per un massimo di 9 volte\footnote{entrambi questi valori possono
 
 Se invece non viene ricevuta nessuna risposta (indice che la macchina non è
 più raggiungibile) l'emissione dei messaggi viene ripetuta ad intervalli di 75
 secondi per un massimo di 9 volte\footnote{entrambi questi valori possono
-  essere opportunamente modificati con gli opportuni parametri illustrati in
-  sez.~\ref{sec:sock_sysctl}, si tenga presente che però questo vale a livello
-  di kernel ed i suddetti valori saranno applicati a \textsl{tutti} i socket.}
-(per un totale di 11 minuti e 15 secondi) dopo di che, se non si è ricevuta
-nessuna risposta, il socket viene chiuso dopo aver impostato un errore di
-\errcode{ETIMEDOUT}. Qualora la connessione si sia ristabilita e si riceva un
-successivo messaggio di risposta il ciclo riparte come se niente fosse
-avvenuto.  Infine se invece si riceve come risposta un pacchetto ICMP di
-destinazione irraggiungibile (vedi sez.~\ref{sec:icmp_protocol_xxx}), verrà
-restituito l'errore corrispondente.
+  essere modificati a livello di sistema (cioè per tutti i socket) con gli
+  opportuni parametri illustrati in sez.~\ref{sec:sock_sysctl} ed a livello di
+  singolo socket con le opzioni \texttt{TCP\_KEEP*} di
+  sez.~\ref{sec:sock_tcp_udp_options}.}  (per un totale di 11 minuti e 15
+secondi) dopo di che, se non si è ricevuta nessuna risposta, il socket viene
+chiuso dopo aver impostato un errore di \errcode{ETIMEDOUT}. Qualora la
+connessione si sia ristabilita e si riceva un successivo messaggio di risposta
+il ciclo riparte come se niente fosse avvenuto.  Infine se si riceve come
+risposta un pacchetto ICMP di destinazione irraggiungibile (vedi
+sez.~\ref{sec:icmp_protocol_xxx}), verrà restituito l'errore corrispondente.
 
 In generale questa opzione serve per individuare una caduta della connessione
 anche quando non si sta facendo traffico su di essa.  Viene usata
 
 In generale questa opzione serve per individuare una caduta della connessione
 anche quando non si sta facendo traffico su di essa.  Viene usata
@@ -2347,9 +2373,9 @@ principalmente sui server per evitare di mantenere impegnate le risorse che
 verrebbero dedicate a trattare delle connessioni che in realtà sono già
 terminate (quelle che vengono anche chiamate connessioni
 \textsl{semi-aperte}); in tutti quei casi cioè in cui il server si trova in
 verrebbero dedicate a trattare delle connessioni che in realtà sono già
 terminate (quelle che vengono anche chiamate connessioni
 \textsl{semi-aperte}); in tutti quei casi cioè in cui il server si trova in
-attesa di dati in ingresso su una connessione che non arriveranno mai perché o
-il client sull'altro capo non è più attivo o non è più in grado di comunicare
-con il server via rete.
+attesa di dati in ingresso su una connessione che non arriveranno mai o perché
+il client sull'altro capo non è più attivo o perché non è più in grado di
+comunicare con il server via rete.
 
 \begin{figure}[!htb]
   \footnotesize \centering
 
 \begin{figure}[!htb]
   \footnotesize \centering
@@ -2684,42 +2710,42 @@ sono definite in \file{netinet/ip.h}, ed accessibili includendo detto file.
     \hline
     \hline
     \const{IP\_OPTIONS}         &$\bullet$&$\bullet$&&\texttt{void *}& %??? 
     \hline
     \hline
     \const{IP\_OPTIONS}         &$\bullet$&$\bullet$&&\texttt{void *}& %??? 
-      Imposta o riceve le opzioni di IP.\\
+      imposta o riceve le opzioni di IP.\\
     \const{IP\_PKTINFO}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
     \const{IP\_PKTINFO}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Passa un messaggio di informazione.\\
+      passa un messaggio di informazione.\\
     \const{IP\_RECVTOS}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
     \const{IP\_RECVTOS}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Passa un messaggio col campo TOS.\\
+      passa un messaggio col campo TOS.\\
     \const{IP\_RECVTTL}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
     \const{IP\_RECVTTL}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Passa un messaggio col campo TTL.\\
+      passa un messaggio col campo TTL.\\
     \const{IP\_RECVOPTS}        &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
     \const{IP\_RECVOPTS}        &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Passa un messaggio con le opzioni IP.\\
+      passa un messaggio con le opzioni IP.\\
     \const{IP\_RETOPTS}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
     \const{IP\_RETOPTS}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Passa un messaggio con le opzioni IP non trattate.\\
+      passa un messaggio con le opzioni IP non trattate.\\
     \const{IP\_TOS}             &$\bullet$&$\bullet$&         &\texttt{int}& 
     \const{IP\_TOS}             &$\bullet$&$\bullet$&         &\texttt{int}& 
-      Imposta il valore del campo TOS.\\
+      imposta il valore del campo TOS.\\
     \const{IP\_TTL}             &$\bullet$&$\bullet$&         &\texttt{int}& 
     \const{IP\_TTL}             &$\bullet$&$\bullet$&         &\texttt{int}& 
-      Imposta il valore del campo TTL.\\
+      imposta il valore del campo TTL.\\
     \const{IP\_HDRINCL}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
     \const{IP\_HDRINCL}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Passa l'intestazione di IP nei dati.\\
+      passa l'intestazione di IP nei dati.\\
     \const{IP\_RECVERR}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
     \const{IP\_RECVERR}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Abilita la gestione degli errori.\\
+      abilita la gestione degli errori.\\
     \const{IP\_MTU\_DISCOVER}   &$\bullet$&$\bullet$&         &\texttt{int}& 
     \const{IP\_MTU\_DISCOVER}   &$\bullet$&$\bullet$&         &\texttt{int}& 
-      Imposta il Path MTU Discovery.\\
+      imposta il Path MTU \itindex{Maximum~Transfer~Unit} Discovery.\\
     \const{IP\_MTU}             &$\bullet$&         &         &\texttt{int}& 
     \const{IP\_MTU}             &$\bullet$&         &         &\texttt{int}& 
-      Legge il valore attuale della MTU.\\
+      legge il valore attuale della \itindex{Maximum~Transfer~Unit} MTU.\\
     \const{IP\_ROUTER\_ALERT}   &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
     \const{IP\_ROUTER\_ALERT}   &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Imposta l'opzione \textit{IP router alert} sui pacchetti.\\
+      imposta l'opzione \textit{IP router alert} sui pacchetti.\\
     \const{IP\_MULTICAST\_TTL}  &$\bullet$&$\bullet$&         &\texttt{int}& 
     \const{IP\_MULTICAST\_TTL}  &$\bullet$&$\bullet$&         &\texttt{int}& 
-      Imposta il TTL per i pacchetti \itindex{multicast} \textit{multicast}.\\
+      imposta il TTL per i pacchetti \itindex{multicast} \textit{multicast}.\\
     \const{IP\_MULTICAST\_LOOP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
     \const{IP\_MULTICAST\_LOOP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Controlla il reinvio a se stessi dei dati di \itindex{multicast} 
+      controlla il reinvio a se stessi dei dati di \itindex{multicast} 
       \textit{multicast}.\\ 
     \const{IP\_ADD\_MEMBERSHIP} &         &$\bullet$&   &\struct{ip\_mreqn}& 
       \textit{multicast}.\\ 
     \const{IP\_ADD\_MEMBERSHIP} &         &$\bullet$&   &\struct{ip\_mreqn}& 
-      Si unisce a un gruppo di \itindex{multicast} \textit{multicast}.\\
+      si unisce a un gruppo di \itindex{multicast} \textit{multicast}.\\
     \const{IP\_DROP\_MEMBERSHIP}&         &$\bullet$&   &\struct{ip\_mreqn}& 
     \const{IP\_DROP\_MEMBERSHIP}&         &$\bullet$&   &\struct{ip\_mreqn}& 
-      Si sgancia da un gruppo di \textit{multicast}.\\
+      si sgancia da un gruppo di \textit{multicast}.\\
     \const{IP\_MULTICAST\_IF}   &         &$\bullet$&   &\struct{ip\_mreqn}& 
     \const{IP\_MULTICAST\_IF}   &         &$\bullet$&   &\struct{ip\_mreqn}& 
-      Imposta l'interfaccia locale di un socket \itindex{multicast} 
+      imposta l'interfaccia locale di un socket \itindex{multicast} 
       \textit{multicast}.\\ 
    \hline
   \end{tabular}
       \textit{multicast}.\\ 
    \hline
   \end{tabular}
@@ -2750,7 +2776,9 @@ seguente elenco:
   una struttura \struct{pktinfo} (vedi fig.~\ref{fig:sock_pktinfo_struct}) che
   mantiene una serie di informazioni riguardo i pacchetti in arrivo. In
   particolare è possibile conoscere l'interfaccia su cui è stato ricevuto un
   una struttura \struct{pktinfo} (vedi fig.~\ref{fig:sock_pktinfo_struct}) che
   mantiene una serie di informazioni riguardo i pacchetti in arrivo. In
   particolare è possibile conoscere l'interfaccia su cui è stato ricevuto un
-  pacchetto (nel campo \var{ipi\_ifindex}), l'indirizzo locale da esso
+  pacchetto (nel campo \var{ipi\_ifindex}),\footnote{in questo campo viene
+    restituito il valore numerico dell'indice dell'interfaccia,
+    sez.~\ref{sec:sock_ioctl_netdevice}.} l'indirizzo locale da esso
   utilizzato (nel campo \var{ipi\_spec\_dst}) e l'indirizzo remoto dello
   stesso (nel campo \var{ipi\_addr}).
 
   utilizzato (nel campo \var{ipi\_spec\_dst}) e l'indirizzo remoto dello
   stesso (nel campo \var{ipi\_addr}).
 
@@ -2911,13 +2939,13 @@ sez.~\ref{sec:net_sendmsg}).
   esplicitamente connesso con \func{connect}. 
 
   Ad esempio con i socket UDP si potrà ottenere una stima iniziale della
   esplicitamente connesso con \func{connect}. 
 
   Ad esempio con i socket UDP si potrà 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
-  dimensioni (che verrà scartato) e ripetendo l'invio coi dati aggiornati. Si
-  tenga infine conto che durante il procedimento i pacchetti iniziali possono
-  essere perduti, ed è compito dell'applicazione gestirne una eventuale
-  ritrasmissione. 
+  \itindex{Maximum~Transfer~Unit} \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 dimensioni (che verrà scartato) e
+  ripetendo l'invio coi dati aggiornati. Si tenga infine conto che durante il
+  procedimento i pacchetti iniziali possono essere perduti, ed è compito
+  dell'applicazione gestirne una eventuale ritrasmissione.
 
 \itindend{Maximum~Transfer~Unit}
 
 
 \itindend{Maximum~Transfer~Unit}
 
@@ -2996,24 +3024,26 @@ UDP e TCP.\footnote{come per le precedenti, una descrizione di queste opzioni
   è disponibile nella settima sezione delle pagine di manuale, che si può
   consultare rispettivamente con \texttt{man 7 tcp} e \texttt{man 7 udp}; le
   pagine di manuale però, alla stesura di questa sezione (Agosto 2006) sono
   è disponibile nella settima sezione delle pagine di manuale, che si può
   consultare rispettivamente con \texttt{man 7 tcp} e \texttt{man 7 udp}; le
   pagine di manuale però, alla stesura di questa sezione (Agosto 2006) sono
-  alquanto incomplete.}  Dato che questi protocolli sono entrambi trasportati
-su IP, oltre alle opzioni generiche di sez.~\ref{sec:sock_generic_options}
-saranno comunque disponibili anche le precedenti opzioni di
-sez.~\ref{sec:sock_ipv4_options}.\footnote{in realtà in
-  sez.~\ref{sec:sock_ipv4_options} si sono riportate le opzioni per IPv4, ma
-  quelle per TCP e UDP sono le stesse anche quando si usa IPv6.}
-
+  alquanto incomplete.}  Dato che questi due protocolli sono entrambi
+trasportati su IP,\footnote{qui si sottintende IPv4, ma le opzioni per TCP e
+  UDP sono le stesse anche quando si usa IPv6.} oltre alle opzioni generiche
+di sez.~\ref{sec:sock_generic_options} saranno comunque disponibili anche le
+precedenti opzioni di sez.~\ref{sec:sock_ipv4_options}.\footnote{in realtà in
+  sez.~\ref{sec:sock_ipv4_options} si sono riportate le opzioni per IPv4, al
+  solito, qualora si stesse utilizzando IPv6, si potrebbero utilizzare le
+  opzioni di quest'ultimo.}
 
 Il protocollo che supporta il maggior numero di opzioni è TCP; per poterle
 utilizzare occorre specificare \const{SOL\_TCP} (o l'equivalente
 
 Il protocollo che supporta il maggior numero di opzioni è TCP; per poterle
 utilizzare occorre specificare \const{SOL\_TCP} (o l'equivalente
-\const{IPPROTO\_TCP}) come valore per l'argomento \param{level}. Si è
-riportato un elenco di queste opzioni in tab.~\ref{tab:sock_opt_tcp}.  Le
-costanti indicanti le opzioni del protocollo TCP e tutte le altre costanti ad
-esse collegate sono definite in \file{netinet/tcp.h}, ed accessibili
-includendo detto file.\footnote{in realtà questo è il file usato dalle
-  librerie; la definizione delle opzioni effettivamente supportate da Linux si
-  trova nel file \texttt{linux/tcp.h}, dal quale si sono estratte le costanti
-  di tab.~\ref{tab:sock_opt_tcplevel}.}
+\const{IPPROTO\_TCP}) come valore per l'argomento \param{level}. Si sono
+riportate le varie opzioni disponibili in tab.~\ref{tab:sock_opt_tcplevel},
+dove sono elencate le rispettive costanti da utilizzare come valore per
+l'argomento \param{optname}. Dette costanti e tutte le altre costanti e
+strutture collegate all'uso delle opzioni TCP sono definite in
+\file{netinet/tcp.h}, ed accessibili includendo detto file.\footnote{in realtà
+  questo è il file usato dalle librerie; la definizione delle opzioni
+  effettivamente supportate da Linux si trova nel file \texttt{linux/tcp.h},
+  dal quale si sono estratte le costanti di tab.~\ref{tab:sock_opt_tcplevel}.}
 
 \begin{table}[!htb]
   \centering
 
 \begin{table}[!htb]
   \centering
@@ -3024,32 +3054,33 @@ includendo detto file.\footnote{in realt
                     \textbf{Descrizione}\\
     \hline
     \hline
                     \textbf{Descrizione}\\
     \hline
     \hline
-    \const{TCP\_NODELAY}      &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_MAXSEG}       &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_CORK}         &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_KEEPIDLE}     &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_KEEPINTVL}    &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_KEEPCNT}      &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_SYNCNT}       &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_LINGER2}      &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_DEFER\_ACCEPT}&$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_WINDOW\_CLAMP}&$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_INFO}         &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_QUICKACK}     &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_CONGESTION}   &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
+    \const{TCP\_NODELAY}      &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+      spedisce immediatamente i dati in segmenti singoli.\\
+    \const{TCP\_MAXSEG}       &$\bullet$&$\bullet$&         &\texttt{int}&
+      valore della \itindex{Maximum~Segment~Size} MSS per i segmenti in
+      uscita.\\  
+    \const{TCP\_CORK}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+      accumula i dati in un unico segmento.\\
+    \const{TCP\_KEEPIDLE}     &$\bullet$&$\bullet$&         &\texttt{int}& 
+      tempo in secondi prima di inviare un \textit{keepalive}.\\
+    \const{TCP\_KEEPINTVL}    &$\bullet$&$\bullet$&         &\texttt{int}&
+      tempo in secondi prima fra \textit{keepalive} successivi.\\
+    \const{TCP\_KEEPCNT}      &$\bullet$&$\bullet$&         &\texttt{int}& 
+      numero massimo di \textit{keepalive} inviati.\\
+    \const{TCP\_SYNCNT}       &$\bullet$&$\bullet$&         &\texttt{int}& 
+      numero massimo di ritrasmissioni di un SYN.\\
+    \const{TCP\_LINGER2}      &$\bullet$&$\bullet$&         &\texttt{int}&
+      tempo di vita in stato \texttt{FIN\_WAIT2}.\\
+    \const{TCP\_DEFER\_ACCEPT}&$\bullet$&$\bullet$&         &\texttt{int}&
+      ritorna da \func{accept} solo in presenza di dati.\\
+    \const{TCP\_WINDOW\_CLAMP}&$\bullet$&$\bullet$&         &\texttt{int}&
+      valore della \itindex{advertised~window} \textit{advertised window}.\\
+    \const{TCP\_INFO}         &$\bullet$&        &       &\struct{tcp\_info}& 
+      restituisce informazioni sul socket.\\
+    \const{TCP\_QUICKACK}     &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+      abilita la modalità \textit{quickack}.\\
+    \const{TCP\_CONGESTION}   &$\bullet$&$\bullet$&         &\texttt{char *}&
+      imposta l'algoritmo per il controllo della congestione.\\
    \hline
   \end{tabular}
   \caption{Le opzioni per i socket TCP disponibili al livello
    \hline
   \end{tabular}
   \caption{Le opzioni per i socket TCP disponibili al livello
@@ -3057,41 +3088,342 @@ includendo detto file.\footnote{in realt
   \label{tab:sock_opt_tcplevel}
 \end{table}
 
   \label{tab:sock_opt_tcplevel}
 \end{table}
 
-Le descrizioni di tab.~\ref{tab:sock_opt_tcplevel} sono estremamente
-sintetiche, una maggiore quantità di dettagli su queste opzioni è fornita nel
-seguente elenco:
-\begin{basedescript}{\desclabelwidth{3.0cm}\desclabelstyle{\nextlinelabel}}
-
-\item[\const{TCP\_NODELAY}] 
-
-\item[\const{TCP\_MAXSEG}] 
-
-\item[\const{TCP\_CORK}] 
-
-\item[\const{TCP\_KEEPINTVL}] 
-
-\item[\const{TCP\_KEEPCNT}] 
+Le descrizioni delle varie opzioni riportate in
+tab.~\ref{tab:sock_opt_tcplevel} sono estremamente sintetiche ed indicative,
+la spiegazione del funzionamento delle singole opzioni con una maggiore
+quantità di dettagli è fornita nel seguente elenco:
+\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
 
 
-\item[\const{TCP\_SYNCNT}] 
 
 
-\item[\const{TCP\_LINGER2}] 
+\item[\const{TCP\_NODELAY}] il protocollo TCP utilizza un meccanismo di
+  bufferizzazione dei dati uscenti, per evitare la trasmissione di tanti
+  piccoli segmenti con un utilizzo non ottimale della banda
+  disponibile.\footnote{il problema è chiamato anche \textit{silly window
+      syndrome}, per averne un'idea si pensi al risultato che si ottiene
+    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
+  prevede che i dati siano accumulati fintanto che non si raggiunge una
+  quantità considerata adeguata per eseguire la trasmissione di un singolo
+  segmento.
+
+  Ci sono però delle situazioni in cui questo comportamento può non essere
+  desiderabile, ad esempio quando si sa in anticipo che l'applicazione invierà
+  soltanto un piccolo quantitativo di dati;\footnote{è il caso classico di una
+    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.
+
+  Si tenga conto che questa opzione viene sovrascritta dall'eventuale
+  impostazione dell'opzione \const{TCP\_CORK} (il cui scopo è sostanzialmente
+  l'opposto) che blocca l'invio immediato. Tuttavia quando la si abilita viene
+  sempre forzato lo scaricamento della coda di invio (con conseguente
+  trasmissione di tutti i dati pendenti), anche qualora si fosse già abilitata
+  \const{TCP\_CORK}.\footnote{si tenga presente però che \const{TCP\_CORK} può
+    essere specificata insieme a \const{TCP\_NODELAY} soltanto a partire dal
+    kernel 2.5.71.}
+
+\item[\const{TCP\_MAXSEG}] con questa opzione si legge o si imposta il valore
+  della \itindex{Maximum~Segment~Size} MSS (\textit{Maximum~Segment~Size},
+  vedi sez.~\ref{sec:net_lim_dim} e sez.~\ref{sez:tcp_protocol_xxx}) dei
+  segmenti TCP uscenti. Se l'opzione è impostata prima di stabilire la
+  connessione, si cambia anche il valore della \itindex{Maximum~Segment~Size}
+  MSS annunciata all'altro capo della connessione. Se si specificano valori
+  maggiori della \itindex{Maximum~Transfer~Unit} MTU questi verranno ignorati,
+  inoltre TCP imporrà anche i suoi limiti massimo e minimo per questo valore.
+
+\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.
+
+  Quando questa opzione viene abilitata non vengono inviati segmenti di dati
+  fintanto che essa non venga disabilitata; a quel punto tutti i dati rimasti
+  in coda saranno inviati in un solo segmento TCP. In sostanza con questa
+  opzione si può controllare il flusso dei dati mettendo una sorta di
+  ``\textsl{tappo}'' (da cui il nome in inglese) al flusso di uscita, in modo
+  ottimizzare a mano l'uso della banda. Si tenga presente che per l'effettivo
+  funzionamento ci si deve ricordare di disattivare l'opzione al termine
+  dell'invio del blocco dei dati.
+
+  Si usa molto spesso \const{TCP\_CORK} quando si effettua il trasferimento
+  diretto di un blocco di dati da un file ad un socket con \func{sendfile}
+  (vedi sez.~\ref{sec:file_sendfile}), per inserire una intestazione prima
+  della chiamata a questa funzione; senza di essa l'intestazione potrebbe
+  venire spedita in un segmento a parte, che a seconda delle condizioni
+  potrebbe richiedere anche una risposta di ACK, portando ad una notevole
+  penalizzazione delle prestazioni.
+
+  Si tenga presente che l'implementazione corrente di \const{TCP\_CORK} non
+  consente di bloccare l'invio dei dati per più di 200 millisecondi, passati i
+  quali i dati accumulati in coda sanno inviati comunque.  Questa opzione è
+  tipica di Linux\footnote{l'opzione è stata introdotta con i kernel della
+    serie 2.4.x.} e non è disponibile su tutti i kernel unix-like, pertanto
+  deve essere evitata se si vuole scrivere codice portabile.
+
+\item[\const{TCP\_KEEPIDLE}] con questa opzione si legge o si imposta
+  l'intervallo di tempo, in secondi, che deve trascorrere senza traffico sul
+  socket prima che vengano inviati, qualora si sia attivata su di esso
+  l'opzione \const{SO\_KEEPALIVE}, i messaggi di \textit{keep-alive} (si veda
+  la trattazione relativa al \textit{keep-alive} in
+  sez.~\ref{sec:sock_options_main}).  Anche questa opzione non è disponibile
+  su tutti i kernel unix-like e deve essere evitata se si vuole scrivere
+  codice portabile.
+
+\item[\const{TCP\_KEEPINTVL}] con questa opzione si legge o si imposta
+  l'intervallo di tempo, in secondi, fra due messaggi di \textit{keep-alive}
+  successivi (si veda sempre quanto illustrato in
+  sez.~\ref{sec:sock_options_main}). Come la precedente non è disponibile su
+  tutti i kernel unix-like e deve essere evitata se si vuole scrivere codice
+  portabile.
+
+\item[\const{TCP\_KEEPCNT}] con questa opzione si legge o si imposta il numero
+  totale di messaggi di \textit{keep-alive} da inviare prima di concludere che
+  la connessione è caduta per assenza di risposte ad un messaggio di
+  \textit{keep-alive} (di nuovo vedi sez.~\ref{sec:sock_options_main}). Come
+  la precedente non è disponibile su tutti i kernel unix-like e deve essere
+  evitata se si vuole scrivere codice portabile.
+
+\item[\const{TCP\_SYNCNT}] con questa opzione si legge o si imposta il numero
+  di tentativi di ritrasmissione dei segmenti SYN usati nel
+  \itindex{three~way~handshake} \textit{three way handshake} prima che il
+  tentativo di connessione venga abortito (si ricordi quanto accennato in
+  sez.\ref{sec:TCP_func_connect}). Sovrascrive per il singolo socket il valore
+  globale impostato con la \textit{sysctl} \texttt{tcp\_syn\_retries} (vedi
+  sez.~\ref{sec:sock_ipv4_sysctl}).  Non vengono accettati valori maggiori di
+  255; anche questa opzione non è standard e deve essere evitata se si vuole
+  scrivere codice portabile.
+
+\item[\const{TCP\_LINGER2}] con questa opzione si legge o si imposta, in
+  numero di secondi, il tempo di sussistenza dei socket terminati nello stato
+  \texttt{FIN\_WAIT2} (si ricordi quanto visto in
+  sez.~\ref{sec:TCP_conn_term}).\footnote{si tenga ben presente che questa
+    opzione non ha nulla a che fare con l'opzione \const{SO\_LINGER} che
+    abbiamo visto in sez.~\ref{sec:sock_options_main}.}  Questa opzione
+  consente di sovrascrivere per il singolo socket il valore globale impostato
+  con la \textit{sysctl} \texttt{tcp\_fin\_timeout} (vedi
+  sez.~\ref{sec:sock_ipv4_sysctl}).  Anche questa opzione è da evitare se si
+  ha a cuore la portabilità del codice.
+
+\item[\const{TCP\_DEFER\_ACCEPT}] questa opzione consente di modificare il
+  comportamento standard del protocollo TCP nello stabilirsi di una
+  connessione; se ricordiamo il meccanismo del \itindex{three~way~handshake}
+  \textit{three way handshake} illustrato in fig.~\ref{fig:TCP_TWH} possiamo
+  vedere che in genere un client inizierà ad inviare i dati ad un server solo
+  dopo l'emissione dell'ultimo segmento di ACK.
+
+  Di nuovo esistono situazioni (e la più tipica è quella di una richiesta
+  HTTP) in cui sarebbe utile inviare immediatamente la richiesta all'interno
+  del segmento con l'ultimo ACK del \itindex{three~way~handshake}
+  \textit{three way handshake}; si potrebbe così risparmiare l'invio di un
+  segmento successivo per la richiesta e il ritardo sul server fra la
+  ricezione dell'ACK e quello della richiesta.
+
+  Se si invoca \const{TCP\_DEFER\_ACCEPT} su un socket dal lato client (cioè
+  dal lato da cui si invoca \func{connect}) si istruisce il kernel a non
+  inviare immediatamente l'ACK finale del \itindex{three~way~handshake}
+  \textit{three way handshake}, attendendo per un po' di tempo la prima
+  scrittura, in modo da inviare i dati di questa insieme col segmento ACK.
+  Chiaramente la correttezza di questo comportamento dipende in maniera
+  diretta dal tipo di applicazione che usa il socket; con HTTP, che invia una
+  breve richiesta, permette di risparmiare un segmento, con FTP, in cui invece
+  si attende la ricezione del prompt del server, introduce un inutile ritardo.
+
+  Allo stesso tempo il protocollo TCP prevede che sul lato del server la
+  funzione \func{accept} ritorni dopo la ricezione dell'ACK finale, in tal
+  caso quello che si fa usualmente è lanciare un nuovo processo per leggere i
+  successivi dati, che si bloccherà su una \func{read} se questi non sono
+  disponibili; in questo modo si saranno impiegate delle risorse (per la
+  creazione del nuovo processo) che non vengono usate immediatamente.  L'uso
+  di \const{TCP\_DEFER\_ACCEPT} consente di intervenire anche in questa
+  situazione; quando la si invoca sul lato server (vale a dire su un socket in
+  ascolto) l'opzione fa sì che \func{accept} ritorni soltanto quando sono
+  presenti dei dati sul socket, e non alla ricezione dell'ACK conclusivo del
+  \itindex{three~way~handshake} \textit{three way handshake}.
+
+  L'opzione prende un valore intero che indica il numero massimo di secondi
+  per cui mantenere il ritardo, sia per quanto riguarda il ritorno di
+  \func{accept} su un server, che per l'invio dell'ACK finale insieme ai dati
+  su un client. L'opzione è specifica di Linux non deve essere utilizzata in
+  codice che vuole essere portabile.\footnote{su FreeBSD è presente una
+    opzione \texttt{SO\_ACCEPTFILTER} che consente di ottenere lo stesso
+    comportamento di \const{TCP\_DEFER\_ACCEPT} per quanto riguarda il lato
+    server.}
+
+\item[\const{TCP\_WINDOW\_CLAMP}] con questa opzione si legge o si imposta
+  alla dimensione specificata, in byte, il valore dichiarato della
+  \itindex{advertised~window} \textit{advertised window} (vedi
+  sez.~\ref{sez:tcp_protocol_xxx}). Il kernel impone comunque una dimensione
+  minima pari a \texttt{SOCK\_MIN\_RCVBUF/2}.  Questa opzione non deve essere
+  utilizzata in codice che vuole essere portabile.
 
 
-\item[\const{TCP\_DEFER\_ACCEPT}] 
+\begin{figure}[!htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \includestruct{listati/tcp_info.h}
+  \end{minipage}
+  \caption{La struttura \structd{tcp\_info} contenente le informazioni sul
+    socket restituita dall'opzione \const{TCP\_INFO}.}
+  \label{fig:tcp_info_struct}
+\end{figure}
 
 
-\item[\const{TCP\_WINDOW\_CLAMP}] 
+\item[\const{TCP\_INFO}] questa opzione, specifica di Linux, ma introdotta
+  anche in altri kernel (ad esempio FreeBSD) permette di controllare lo stato
+  interno di un socket TCP direttamente da un programma in user space.
+  L'opzione restituisce in una speciale struttura \struct{tcp\_info}, la cui
+  definizione è riportata in fig.~\ref{fig:tcp_info_struct}, tutta una serie
+  di dati che il kernel mantiene, relativi al socket.  Anche questa opzione
+  deve essere evitata se si vuole scrivere codice portabile.
+
+  Con questa opzione diventa possibile ricevere una serie di informazioni
+  relative ad un socket TCP così da poter effettuare dei controlli senza dover
+  passare attraverso delle operazioni di lettura. Ad esempio si può verificare
+  se un socket è stato chiuso usando una funzione analoga a quella illustrata
+  in fig.~\ref{fig:is_closing}, in cui si utilizza il valore del campo
+  \var{tcpi\_state} di \struct{tcp\_info} per controllare lo stato del socket.
 
 
-\item[\const{TCP\_INFO}] 
+\begin{figure}[!htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \includecodesnip{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.}
+  \label{fig:is_closing}
+\end{figure}
 
 
-\item[\const{TCP\_QUICKACK}] 
+%Si noti come nell'esempio si sia (
+
+
+\item[\const{TCP\_QUICKACK}] con questa opzione è possibile eseguire una forma
+  di controllo sull'invio dei segmenti ACK all'interno di in flusso di dati su
+  TCP. In genere questo invio viene gestito direttamente dal kernel, il
+  comportamento standard, corrispondente la valore logico di vero (in genere
+  1) per questa opzione, è quello di inviare immediatamente i segmenti ACK, in
+  quanto normalmente questo significa che si è ricevuto un blocco di dati e si
+  può passare all'elaborazione del blocco successivo.
+
+  Qualora però la nostra applicazione sappia in anticipo che alla ricezione di
+  un blocco di dati seguirà immediatamente l'invio di un altro
+  blocco,\footnote{caso tipico ad esempio delle risposte alle richieste HTTP.}
+  poter accorpare quest'ultimo al segmento ACK permette di risparmiare sia in
+  termini di dati inviati che di velocità di risposta. Per far questo si può
+  utilizzare \const{TCP\_QUICKACK} impostando un valore logico falso (cioè 0),
+  in questo modo il kernel attenderà così da inviare il prossimo segmento di
+  ACK insieme ai primi dati disponibili.
+
+  Si tenga presente che l'opzione non è permanente, vale a dire che una volta
+  che la si sia impostata a 0 il kernel la riporterà al valore di default dopo
+  il suo primo utilizzo. Sul lato server la si può impostare anche una volta
+  sola su un socket in ascolto, ed essa verrà ereditata da tutti i socket che
+  si otterranno da esso al ritorno di \func{accept}.
+
+% TODO trattare con gli esempi di apache
+
+\item[\const{TCP\_CONGESTION}] questa opzione permette di impostare quale
+  algoritmo per il controllo della congestione\footnote{il controllo della
+    congestione è un meccanismo previsto dal protocollo TCP (vedi
+    sez.~\ref{sez:tcp_protocol_xxx}) per evitare di trasmettere inutilmente
+    dati quando una connessione è congestionata; un buon algoritmo è
+    fondamentale per il funzionamento del protocollo, dato che i pacchetti
+    persi andrebbero ritrasmessi, per cui inviare un pacchetto su una linea
+    congestionata potrebbe causare facilmente un peggioramento della
+    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
+    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. 
+
+  L'uso di un nome anziché di un valore numerico è dovuto al fatto che gli
+  algoritmi di controllo della congestione sono realizzati attraverso
+  altrettanti moduli del kernel, e possono pertanto essere attivati a
+  richiesta; il nome consente di caricare il rispettivo modulo e di introdurre
+  moduli aggiuntivi che implementino altri meccanismi. 
+
+  Per poter disporre di questa funzionalità occorre aver compilato il kernel
+  attivando l'opzione di configurazione generale
+  \texttt{TCP\_CONG\_ADVANCED},\footnote{disponibile come \textit{TCP:
+      advanced congestion control} nel menù \textit{Network->Networking
+      options}, che a sua volta renderà disponibile un ulteriore menù con gli
+    algoritmi presenti.} e poi abilitare i singoli moduli voluti con le varie
+  \texttt{TCP\_CONG\_*} presenti per i vari algoritmi disponibili; un elenco
+  di quelli attualmente supportati nella versione ufficiale del kernel è
+  riportato in tab.~\ref{tab:sock_tcp_congestion_algo}.\footnote{la lista è
+    presa dalla versione 2.6.17.}
+
+
+  Si tenga presente che prima della implementazione modulare alcuni di questi
+  algoritmi erano disponibili soltanto come caratteristiche generali del
+  sistema, attivabili per tutti i socket, questo è ancora possibile con la
+  \textit{sysctl} \texttt{tcp\_congestion\_control} (vedi
+  sez.~\ref{sec:sock_ipv4_sysctl}) che ha sostituito le precedenti
+  \textit{sysctl}.\footnote{riportate anche, alla data di stesura di queste
+    pagine (Set. 2006) nelle pagine di manuale, ma non più presenti.}
 
 
-\item[\const{TCP\_CONGESTION}] Introdotta con il kernel 2.6.13.
+  \begin{table}[!htb]
+    \centering
+    \footnotesize
+    \begin{tabular}[c]{|l|l|p{10cm}|}
+      \hline
+      \textbf{Nome}&\textbf{Configurazione}&\textbf{Riferimento} \\
+      \hline
+      \hline
+      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}}.\\
+      \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}}.\\
+      \texttt{highspeed}&\texttt{TCP\_CONG\_HSTCP}  & 
+      \href{http://www.icir.org/floyd/hstcp.html}
+      {\texttt{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/}}.\\
+      \texttt{hybla}   &\texttt{TCP\_CONG\_HYBLA}   &       
+      \href{http://www.danielinux.net/projects.html}
+      {\texttt{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/}}.\\
+      \texttt{vegas}   &\texttt{TCP\_CONG\_VEGAS}   &  
+      \href{http://www.cs.arizona.edu/protocols/}
+      {\texttt{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/}}.\\
+%      \texttt{}&\texttt{}& .\\
+      \hline
+    \end{tabular}
+    \caption{Gli algoritmi per il controllo della congestione disponibili con
+      Linux con le relative opzioni di configurazione da attivare.}  
+    \label{tab:sock_tcp_congestion_algo}
+  \end{table}
 
 \end{basedescript}
 
 
 Il protocollo UDP, anche per la sua maggiore semplicità, supporta un numero
 
 \end{basedescript}
 
 
 Il protocollo UDP, anche per la sua maggiore semplicità, supporta un numero
-ridotto di opzioni, riportate in tab.~\ref{tab:sock_opt_udp}; anche in questo
-caso per poterle utilizzare occorrerà impostare l'opportuno valore per
+ridotto di opzioni, riportate in tab.~\ref{tab:sock_opt_udplevel}; anche in
+questo caso per poterle utilizzare occorrerà impostare l'opportuno valore per
 l'argomento \param{level}, che è \const{SOL\_UDP} (o l'equivalente
 \const{IPPROTO\_UDP}).  Le costanti che identificano dette opzioni sono
 definite in \file{netinet/udp.h}, ed accessibili includendo detto
 l'argomento \param{level}, che è \const{SOL\_UDP} (o l'equivalente
 \const{IPPROTO\_UDP}).  Le costanti che identificano dette opzioni sono
 definite in \file{netinet/udp.h}, ed accessibili includendo detto
@@ -3108,10 +3440,10 @@ file.\footnote{come per TCP, la definizione delle opzioni effettivamente
                     \textbf{Descrizione}\\
     \hline
     \hline
                     \textbf{Descrizione}\\
     \hline
     \hline
-    \const{UDP\_CORK}  &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{UDP\_ENCAP} &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
+    \const{UDP\_CORK}  &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& %??? 
+      accumula tutti i dati su un unico pacchetto.\\
+    \const{UDP\_ENCAP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& %??? 
+      non documentata.\\
    \hline
   \end{tabular}
   \caption{Le opzioni per i socket UDP disponibili al livello
    \hline
   \end{tabular}
   \caption{Le opzioni per i socket UDP disponibili al livello
@@ -3124,9 +3456,17 @@ sono un semplice riferimento, una maggiore quantit
 caratteristiche delle opzioni citate è quello dell'elenco seguente:
 \begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
 
 caratteristiche delle opzioni citate è quello dell'elenco seguente:
 \begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
 
-\item[\const{UDP\_CORK}] Introdotta con il kernel 2.5.44
+\item[\const{UDP\_CORK}] questa opzione ha l'identico effetto dell'analoga
+  \const{TCP\_CORK} vista in precedenza per il protocollo TCP, e quando
+  abilitata consente di accumulare i dati in uscita su un solo pacchetto che
+  verrà inviato una volta che la si disabiliti. L'opzione è stata introdotta
+  con il kernel 2.5.44, e non deve essere utilizzata in codice che vuole
+  essere portabile.
 
 
-\item[\const{UDP\_ENCAP}] Introdotta con il kernel 2.5.67.
+\item[\const{UDP\_ENCAP}] Questa opzione permette di gestire l'incapsulazione
+  dei dati nel protocollo UDP. L'opzione è stata introdotta con il kernel
+  2.5.67, e non è documentata. Come la precedente è specifica di Linux e non
+  deve essere utilizzata in codice portabile.
 
 \end{basedescript}
 
 
 \end{basedescript}
 
@@ -3210,21 +3550,316 @@ processo che riceve i segnali) che si effettuano chiamando \func{ioctl} con
 \const{SIOCGPGRP} e \const{SIOCSPGRP}.
 
 
 \const{SIOCGPGRP} e \const{SIOCSPGRP}.
 
 
+\subsection{L'uso di \func{ioctl} per l'accesso ai dispositivi di rete}
+\label{sec:sock_ioctl_netdevice}
+
+Benché non strettamente attinenti alla gestione dei socket, vale la pena di
+trattare qui l'interfaccia di accesso a basso livello ai dispositivi di rete
+che viene appunto fornita attraverso la funzione \texttt{ioctl}. Questa non è
+attinente a caratteristiche specifiche di un qualche protocollo, ma si applica
+a tutti i socket, indipendentemente da tipo e famiglia degli stessi, e
+permette di impostare e rilevare le funzionalità delle interfacce di rete.
+
+\begin{figure}[!htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \includestruct{listati/ifreq.h}
+  \end{minipage}
+  \caption{La struttura \structd{ifreq} utilizzata dalle \func{ioctl} per le
+    operazioni di controllo sui dispositivi di rete.}
+  \label{fig:netdevice_ifreq_struct}
+\end{figure}
+
+Tutte le operazioni di questo tipo utilizzano come terzo argomento di
+\func{ioctl} il puntatore ad una struttura \struct{ifreq}, la cui definizione
+è illustrata in fig.~\ref{fig:netdevice_ifreq_struct}. Normalmente si utilizza
+il primo campo della struttura, \var{ifr\_name} per specificare il nome
+dell'interfaccia su cui si vuole operare (ad esempio \texttt{eth0},
+\texttt{ppp0}, ecc.), e si inseriscono (o ricevono) i valori relativi alle
+diversa caratteristiche e funzionalità nel secondo campo, che come si può
+notare è definito come una \ctyp{union} proprio in quanto il suo significato
+varia a secondo dell'operazione scelta.
+
+Si tenga inoltre presente che alcune di queste operazioni (in particolare
+quelle che modificano le caratteristiche dell'interfaccia) sono privilegiate e
+richiedono i privilegi di amministratore o la \itindex{capabilities}
+\textit{capability} \const{CAP\_NET\_ADMIN}, altrimenti si otterrà un errore
+di \errval{EPERM}.  Le costanti che identificano le operazioni disponibili
+sono le seguenti:
+\begin{basedescript}{\desclabelwidth{2.7cm}\desclabelstyle{\nextlinelabel}}
+\item[\const{SIOCGIFNAME}] questa è l'unica operazione che usa il campo
+  \var{ifr\_name} per restituire un risultato, tutte le altre lo utilizzano
+  per indicare l'interfaccia sulla quale operare. L'operazione richiede che si
+  indichi nel campo \var{ifr\_ifindex} il valore numerico dell'\textsl{indice}
+  dell'interfaccia, e restituisce il relativo nome in \var{ifr\_name}.
+
+  Il kernel infatti assegna ad ogni interfaccia un numero progressivo, detto
+  appunto \index{interface index} \textit{interface index}, che è quello che
+  effettivamente la identifica nelle operazioni a basso livello, il nome
+  dell'interfaccia è soltanto una etichetta associata a detto \textsl{indice},
+  che permette di rendere più comprensibile l'indicazione dell'interfaccia
+  all'interno dei comandi. Una modalità per ottenere questo valore è usare il
+  comando \cmd{ip link}, che fornisce un elenco delle interfacce presenti
+  ordinato in base a tale valore (riportato come primo campo).
+  
+
+\item[\const{SIOCGIFINDEX}] restituisce nel campo \var{ifr\_ifindex} il valore
+  numerico dell'indice dell'interfaccia specificata con \var{ifr\_name}, è in
+  sostanza l'operazione inversa di \const{SIOCGIFNAME}.
+
+\item[\const{SIOCGIFFLAGS}] permette di ottenere nel campo \var{ifr\_flags} il
+  valore corrente dei flag dell'interfaccia specificata (con \var{ifr\_name}).
+  Il valore restituito è una maschera binaria i cui bit sono identificabili
+  attraverso le varie costanti di tab.~\ref{tab:netdevice_iface_flag}.
+
+\begin{table}[htb]
+  \centering
+  \footnotesize
+  \begin{tabular}[c]{|l|p{8cm}|}
+    \hline
+    \textbf{Flag} & \textbf{Significato} \\
+    \hline
+    \hline
+    \const{IFF\_UP}        & l'interfaccia è attiva.\\
+    \const{IFF\_BROADCAST} & l'interfaccia ha impostato un indirizzo di
+                             \itindex{broadcast} \textit{broadcast} valido.\\
+    \const{IFF\_DEBUG}     & è attivo il flag interno di debug.\\
+    \const{IFF\_LOOPBACK}  & l'interfaccia è una interfaccia di
+                             \textit{loopback}.\\ 
+    \const{IFF\_POINTOPOINT}& l'interfaccia è associata ad un collegamento
+                             \textsl{punto-punto}.\\ 
+    \const{IFF\_RUNNING}   & l'interfaccia ha delle risorse allocate (non può
+                             quindi essere disattivata).\\
+    \const{IFF\_NOARP}     & l'interfaccia ha il protocollo ARP disabilitato o
+                             l'indirizzo del livello di rete non è impostato.\\
+    \const{IFF\_PROMISC}   & l'interfaccia è in \index{modo~promiscuo}
+                             \textsl{modo promiscuo} (riceve cioè tutti i
+                             pacchetti che vede passare, compresi quelli non
+                             direttamente indirizzati a lei).\\
+    \const{IFF\_NOTRAILERS}& evita l'uso di \textit{trailer} nei pacchetti.\\
+    \const{IFF\_ALLMULTI}  & riceve tutti i pacchetti di  \itindex{multicast}
+                             \textit{multicast}.\\
+    \const{IFF\_MASTER}    & l'interfaccia è il master di un bundle per il
+                             bilanciamento di carico.\\
+    \const{IFF\_SLAVE}     & l'interfaccia è uno slave di un bundle per il
+                             bilanciamento di carico.\\
+    \const{IFF\_MULTICAST} & l'interfaccia ha il supporto per il
+                             \textit{multicast} \itindex{multicast} attivo.\\
+    \const{IFF\_PORTSEL}   & l'interfaccia può impostare i suoi parametri
+                             hardware (con l'uso di \struct{ifmap})..\\
+    \const{IFF\_AUTOMEDIA} & l'interfaccia è in grado di selezionare
+                             automaticamente il tipo di collegamento.\\
+    \const{IFF\_DYNAMIC}   & gli indirizzi assegnati all'interfaccia vengono
+                             persi quando questa viene disattivata.\\
+%    \const{IFF\_}      & .\\
+    \hline
+  \end{tabular}
+  \caption{Le costanti che identificano i vari bit della maschera binaria
+    \var{ifr\_flags} che esprime i flag di una interfaccia di rete.}
+  \label{tab:netdevice_iface_flag}
+\end{table}
+
+
+\item[\const{SIOCSIFFLAGS}] permette di impostare il valore dei flag
+  dell'interfaccia specificata (sempre con \var{ifr\_name}, non staremo a
+  ripeterlo oltre) attraverso il valore della maschera binaria da passare nel
+  campo \var{ifr\_flags}, che può essere ottenuta con l'OR aritmetico delle
+  costanti di tab.~\ref{tab:netdevice_iface_flag}; questa operazione è
+  privilegiata.
+
+\item[\const{SIOCGIFMETRIC}] permette di leggere il valore della metrica del
+  dispositivo associato all'interfaccia specificata nel campo
+  \var{ifr\_metric}.  Attualmente non è implementato, e l'operazione
+  restituisce sempre un valore nullo.
+
+\item[\const{SIOCSIFMETRIC}] permette di impostare il valore della metrica del
+  dispositivo al valore specificato nel campo \var{ifr\_metric}, attualmente
+  non ancora implementato, restituisce un errore di \errval{EOPNOTSUPP}.
+
+\item[\const{SIOCGIFMTU}] permette di leggere il valore della
+  \itindex{Maximum~Transfer~Unit} \textit{Maximum Transfer Unit} del
+  dispositivo nel campo \var{ifr\_mtu}.
+
+\item[\const{SIOCSIFMTU}] permette di impostare il valore della
+  \itindex{Maximum~Transfer~Unit} \textit{Maximum Transfer Unit} del
+  dispositivo al valore specificato campo \var{ifr\_mtu}. L'operazione è
+  privilegiata, e si tenga presente che impostare un valore troppo basso può
+  causare un blocco del kernel.
+
+\item[\const{SIOCGIFHWADDR}] permette di leggere il valore dell'indirizzo
+  hardware del dispositivo associato all'interfaccia nel campo
+  \var{ifr\_hwaddr}; questo viene restituito come struttura \struct{sockaddr}
+  in cui il campo \var{sa\_family} contiene un valore \texttt{ARPHRD\_*}
+  indicante il tipo di indirizzo ed il campo \var{sa\_data} il valore binario
+  dell'indirizzo hardware a partire dal byte 0.
+
+\item[\const{SIOCSIFHWADDR}] permette di impostare il valore dell'indirizzo
+  hardware del dispositivo associato all'interfaccia attraverso il valore
+  della struttura \struct{sockaddr} (con lo stesso formato illustrato per
+  \const{SIOCGIFHWADDR}) passata nel campo \var{ifr\_hwaddr}. L'operazione è
+  privilegiata.
+
+\item[\const{SIOCSIFHWBROADCAST}] imposta l'indirizzo \textit{broadcast}
+  \itindex{broadcast} hardware dell'interfaccia al valore specificato dal
+  campo \var{ifr\_hwaddr}. L'operazione è privilegiata.
+
+\item[\const{SIOCGIFMAP}] legge alcuni parametri hardware (memoria, interrupt,
+  canali di DMA) del driver dell'interfaccia specificata, restituendo i
+  relativi valori nel campo \var{ifr\_map}; quest'ultimo contiene una
+  struttura di tipo \struct{ifmap}, la cui definizione è illustrata in
+  fig.~\ref{fig:netdevice_ifmap_struct}.
+
+\begin{figure}[!htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \includestruct{listati/ifmap.h}
+  \end{minipage}
+  \caption{La struttura \structd{ifmap} utilizzata per leggere ed impostare i
+    valori dei parametri hardware di un driver di una interfaccia.}
+  \label{fig:netdevice_ifmap_struct}
+\end{figure}
+
+\item[\const{SIOCSIFMAP}] imposta i parametri hardware del driver
+  dell'interfaccia specificata, restituendo i relativi valori nel campo
+  \var{ifr\_map}. Come per \const{SIOCGIFMAP} questo deve essere passato come
+  struttura \struct{ifmap}, secondo la definizione di
+  fig.~\ref{fig:netdevice_ifmap_struct}.
+
+\item[\const{SIOCADDMULTI}] aggiunge un indirizzo di \itindex{multicast}
+  \textit{multicast} ai filtri del livello di collegamento associati
+  dell'interfaccia. Si deve usare un indirizzo hardware da specificare
+  attraverso il campo \var{ifr\_hwaddr}, che conterrà l'opportuna struttura
+  \struct{sockaddr}; l'operazione è privilegiata. Per una modalità alternativa
+  per eseguire la stessa operazione si possono usare i \textit{packet socket},
+  vedi sez.~\ref{sec:packet_socket}.
+
+\item[\const{SIOCDELMULTI}] rimuove un indirizzo di \itindex{multicast}
+  \textit{multicast} ai filtri del livello di collegamento dell'interfaccia,
+  vuole un indirizzo hardware specificato come per \const{SIOCADDMULTI}. Anche
+  questa operazione è privilegiata e può essere eseguita in forma alternativa
+  con i \textit{packet socket}.
+
+\item[\const{SIOCGIFTXQLEN}] permette di leggere la lunghezza della coda di
+  trasmissione del dispositivo associato all'interfaccia specificata nel campo
+  \var{ifr\_qlen}.
+
+\item[\const{SIOCSIFTXQLEN}] permette di impostare il valore della lunghezza
+  della coda di trasmissione del dispositivo associato all'interfaccia, questo
+  deve essere specificato nel campo \var{ifr\_qlen}. L'operazione è
+  privilegiata. 
+
+\item[\const{SIOCSIFNAME}] consente di cambiare il nome dell'interfaccia
+  indicata da \var{ifr\_name} utilizzando il nuovo nome specificato nel campo
+  \var{ifr\_rename}.
+
+\end{basedescript}
+
+Una ulteriore operazione, che consente di ricavare le caratteristiche delle
+interfacce di rete, è \const{SIOCGIFCONF}; però per ragioni di compatibilità
+questa operazione è disponibile soltanto per i socket della famiglia
+\const{AF\_INET} (vale ad dire per socket IPv4). In questo caso l'utente dovrà
+passare come argomento una struttura \struct{ifconf}, definita in
+fig.~\ref{fig:netdevice_ifconf_struct}.
+
+\begin{figure}[!htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \includestruct{listati/ifconf.h}
+  \end{minipage}
+  \caption{La struttura \structd{ifconf}.}
+  \label{fig:netdevice_ifconf_struct}
+\end{figure}
+
+Per eseguire questa operazione occorrerà allocare preventivamente un buffer di
+contenente un vettore di strutture \struct{ifreq}. La dimensione (in byte) di
+questo buffer deve essere specificata nel campo \var{ifc\_len} di
+\struct{ifconf}, mentre il suo indirizzo andrà specificato nel campo
+\var{ifc\_req}. Qualora il buffer sia stato allocato come una stringa, il suo
+indirizzo potrà essere fornito usando il campo \var{ifc\_buf}.\footnote{si
+  noti che l'indirizzo del buffer è definito in \struct{ifconf} con una
+  \ctyp{union}, questo consente di utilizzare una delle due forme a piacere.}
+
+La funzione restituisce nel buffer indicato una serie di strutture
+\struct{ifreq} contenenti nel campo \var{ifr\_name} il nome dell'interfaccia e
+nel campo \var{ifr\_addr} il relativo indirizzo IP.  Se lo spazio allocato nel
+buffer è sufficiente il kernel scriverà una struttura \struct{ifreq} per
+ciascuna interfaccia attiva, restituendo nel campo \var{ifc\_len} il totale
+dei byte effettivamente scritti. Il valore di ritorno è 0 se l'operazione ha
+avuto successo e negativo in caso contrario. 
+
+Si tenga presente che il kernel non scriverà mai sul buffer di uscita dati
+eccedenti numero di byte specificato col valore di \var{ifc\_len} impostato
+alla chiamata della funzione, troncando il risultato se questi non dovessero
+essere sufficienti. Questa condizione non viene segnalata come errore per cui
+occorre controllare il valore di \var{ifc\_len} all'uscita della funzione, e
+verificare che esso sia inferiore a quello di ingresso. In caso contrario si è
+probabilmente\footnote{probabilmente perché si potrebbe essere nella
+  condizione in cui sono stati usati esattamente quel numero di byte.} avuta
+una situazione di troncamento dei dati.
+
+\begin{figure}[!htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \includecodesample{listati/iflist.c}
+  \end{minipage}
+  \caption{Il corpo principale del programma \texttt{iflist.c}.}
+  \label{fig:netdevice_iflist}
+\end{figure}
+
+Come esempio dell'uso di queste funzioni si è riportato in
+fig.~\ref{fig:netdevice_iflist} il corpo principale del programma
+\texttt{iflist} in cui si utilizza l'operazione \const{SIOCGIFCONF} per
+ottenere una lista delle interfacce attive e dei relativi indirizzi. Al solito
+il codice completo è fornito nei sorgenti allegati alla guida.
+
+Il programma inizia (\texttt{\small 7--11}) con la creazione del socket
+necessario ad eseguire l'operazione, dopo di che si inizializzano
+opportunamente (\texttt{\small 13--14}) i valori della struttura
+\struct{ifconf} indicando la dimensione del buffer ed il suo
+indirizzo;\footnote{si noti come in questo caso si sia specificato l'indirizzo
+  usando il campo \var{ifc\_buf}, mentre nel seguito del programma si accederà
+  ai valori contenuti nel buffer usando \var{ifc\_req}.} si esegue poi
+l'operazione invocando \func{ioctl}, controllando come sempre la corretta
+esecuzione, ed uscendo in caso di errore (\texttt{\small 15--19}).
+
+Si esegue poi un controllo sulla quantità di dati restituiti segnalando un
+eventuale overflow del buffer (\texttt{\small 21--23}); se invece è tutto a
+posto (\texttt{\small 24--27}) si calcola e si stampa a video il numero di
+interfacce attive trovate.  L'ultima parte del programma (\texttt{\small
+  28--33}) è il ciclo sul contenuto delle varie strutture \struct{ifreq}
+restituite in cui si estrae (\texttt{\small 30}) l'indirizzo ad esse
+assegnato\footnote{si è definito \var{access} come puntatore ad una struttura
+  di tipo \struct{sockaddr\_in} per poter eseguire un \textit{casting}
+  dell'indirizzo del valore restituito nei vari campi \var{ifr\_addr}, così
+  poi da poterlo poi usare come argomento di \func{inet\_ntoa}.}  e lo si
+stampa (\texttt{\small 31--32}) insieme al nome dell'interfaccia.
+
+
+
 \subsection{L'uso di \func{ioctl} per i socket TCP e UDP}
 \label{sec:sock_ioctl_IP}
 
 \subsection{L'uso di \func{ioctl} per i socket TCP e UDP}
 \label{sec:sock_ioctl_IP}
 
-Oltre alle caratteristiche che si possono impostare per i socket generici, la
+Non esistono operazioni specifiche per i socket IP in quanto tali,\footnote{a
+  parte forse \const{SIOCGIFCONF}, che però resta attinente alle proprietà
+  delle interfacce di rete, per cui l'abbiamo trattata in
+  sez.~\ref{sec:sock_ioctl_netdevice} insieme alle altre che comunque si
+  applicano anche ai socket IP.} mentre per i pacchetti di altri protocolli
+trasportati su IP, qualora li si gestisca attraverso dei socket, si dovrà fare
+riferimento direttamente all'eventuale supporto presente per il tipo di socket
+usato: ad esempio si possono ricevere pacchetti ICMP con socket di tipo
+\texttt{raw}, nel qual caso si dovrà fare riferimento alle operazioni di
+quest'ultimo.
+
+Tuttavia la gran parte dei socket utilizzati nella programmazione di rete
+utilizza proprio il protocollo IP, e quello che succede è che in realtà la
 funzione \func{ioctl} consente di effettuare alcune operazioni specifiche per
 funzione \func{ioctl} consente di effettuare alcune operazioni specifiche per
-i socket UDP e TCP. Non esistono operazioni specifiche per i socket IP
-generici, mentre per i pacchetti di altri protocolli trasportati su IP,
-qualora li si gestisca attraverso dei socket, si dovrà fare riferimento
-direttamente all'eventuale supporto presente per il tipo di socket usato (ad
-esempio si possono ricevere pacchetti ICMP con socket di tipo \texttt{raw},
-nel qual caso si dovrà fare riferimento alle operazioni di quest'ultimo).
-
-Le operazioni di controllo disponibili per i socket TCP, come illustrate dalla
-relativa pagina di manuale, accessibile con \texttt{man 7 tcp}, prevedono come
-possibile valore per il secondo argomento della funzione dalle costanti
+i socket che usano questo protocollo, ma queste vendono eseguite, invece che a
+livello di IP, al successivo livello di trasporto, vale a dire in maniera
+specifica per i socket TCP e UDP.
+
+Le operazioni di controllo disponibili per i socket TCP sono illustrate dalla
+relativa pagina di manuale, accessibile con \texttt{man 7 tcp}, e prevedono
+come possibile valore per il secondo argomento della funzione le costanti
 illustrate nell'elenco seguente; il terzo argomento della funzione, gestito
 come \itindex{value~result~argument} \textit{value result argument}, deve
 essere sempre il puntatore ad una variabile di tipo \ctyp{int}:
 illustrate nell'elenco seguente; il terzo argomento della funzione, gestito
 come \itindex{value~result~argument} \textit{value result argument}, deve
 essere sempre il puntatore ad una variabile di tipo \ctyp{int}:
@@ -3256,12 +3891,12 @@ essere sempre il puntatore ad una variabile di tipo \ctyp{int}:
   \errval{EINVAL}.
 \end{basedescript}
 
   \errval{EINVAL}.
 \end{basedescript}
 
-Le operazioni di controllo disponibili per i socket UDP, come illustrate dalla
-relativa pagina di manuale, accessibile con \texttt{man 7 udp}, sono quelle
-indicate dalle costanti del seguente elenco; come per i socket TCP il terzo
-argomento viene gestito come \itindex{value~result~argument} \textit{value
-  result argument} e deve essere un puntatore ad una variabile di tipo
-\ctyp{int}:
+Le operazioni di controllo disponibili per i socket UDP, anch'esse illustrate
+dalla relativa pagina di manuale accessibile con \texttt{man 7 udp}, sono
+quelle indicate dalle costanti del seguente elenco; come per i socket TCP il
+terzo argomento viene gestito come \itindex{value~result~argument}
+\textit{value result argument} e deve essere un puntatore ad una variabile di
+tipo \ctyp{int}:
 \begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
 \item[\const{FIONREAD}] restituisce la dimensione in byte del primo pacchetto
   in attesa di ricezione, o 0 qualora non ci sia nessun pacchetto.
 \begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
 \item[\const{FIONREAD}] restituisce la dimensione in byte del primo pacchetto
   in attesa di ricezione, o 0 qualora non ci sia nessun pacchetto.
@@ -3325,14 +3960,13 @@ sistema sotto \texttt{/proc/net}, dove sono presenti dei file che non
 corrispondono a nessun nodo di \func{sysctl}.
 
 
 corrispondono a nessun nodo di \func{sysctl}.
 
 
-
 \subsection{I valori di controllo per i socket generici}
 \label{sec:sock_gen_sysctl}
 
 Nella directory \texttt{/proc/sys/net/core} sono presenti i file
 \subsection{I valori di controllo per i socket generici}
 \label{sec:sock_gen_sysctl}
 
 Nella directory \texttt{/proc/sys/net/core} sono presenti i file
-corrispondenti ai parametri generici validi per tutti i socket. Quelli
-descritti anche nella pagina di manuale, accessibile con \texttt{man 7 socket}
-sono i seguenti:
+corrispondenti ai parametri generici di \textit{sysctl} validi per tutti i
+socket.  Quelli descritti anche nella pagina di manuale, accessibile con
+\texttt{man 7 socket} sono i seguenti:
 
 \begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
 \item[\texttt{rmem\_default}] imposta la dimensione di default del buffer di
 
 \begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
 \item[\texttt{rmem\_default}] imposta la dimensione di default del buffer di
@@ -3388,7 +4022,9 @@ nel file \texttt{Documentation/networking/ip-sysctl.txt}; la maggior parte di
 questi però non è documentato:
 \begin{basedescript}{\desclabelwidth{3.0cm}\desclabelstyle{\nextlinelabel}}
 \item[\texttt{dev\_weight}] blocco di lavoro (\textit{work quantum}) dello
 questi però non è documentato:
 \begin{basedescript}{\desclabelwidth{3.0cm}\desclabelstyle{\nextlinelabel}}
 \item[\texttt{dev\_weight}] blocco di lavoro (\textit{work quantum}) dello
-  scheduler di processo dei pacchetti. % TODO da documentare meglio
+  scheduler di processo dei pacchetti. 
+
+% TODO da documentare meglio
 
 \item[\texttt{lo\_cong}] valore per l'occupazione della coda di ricezione
   sotto la quale si considera di avere una bassa congestione.
 
 \item[\texttt{lo\_cong}] valore per l'occupazione della coda di ricezione
   sotto la quale si considera di avere una bassa congestione.
@@ -3425,12 +4061,20 @@ dello stesso (come ARP).
 I file che consentono di controllare le caratteristiche specifiche del
 protocollo IP in quanto tale, descritti anche nella pagina di manuale
 accessibile con \texttt{man 7 ip}, sono i seguenti:
 I file che consentono di controllare le caratteristiche specifiche del
 protocollo IP in quanto tale, descritti anche nella pagina di manuale
 accessibile con \texttt{man 7 ip}, sono i seguenti:
-\begin{basedescript}{\desclabelwidth{3.2cm}\desclabelstyle{\nextlinelabel}}
+\begin{basedescript}{\desclabelwidth{3.5cm}\desclabelstyle{\nextlinelabel}}
 
 \item[\texttt{ip\_default\_ttl}] imposta il valore di default per il campo TTL
 
 \item[\texttt{ip\_default\_ttl}] imposta il valore di default per il campo TTL
-  (vedi sez.~\ref{sec:IP_header}) di tutti i pacchetti uscenti. Il valore può
-  essere modificato per il singolo socket con l'opzione \const{IP\_TTL}.
-  Prende un valore intero.
+  (vedi sez.~\ref{sec:IP_header}) di tutti i pacchetti uscenti, stabilendo
+  così il numero massimo di router che i pacchetti possono attraversare. Il
+  valore può essere modificato anche per il singolo socket con l'opzione
+  \const{IP\_TTL}.  Prende un valore intero, ma dato che il campo citato è di
+  8 bit hanno senso solo valori fra 0 e 255. Il valore di default è 64, e non
+  ci normalmente non c'è nessuna necessità di modificarlo,\footnote{l'unico
+    motivo sarebbe per raggiungere macchine estremamente ``{lontane}'' in
+    termini di \textit{hop}, ma è praticamente } aumentare il valore è una
+  pratica poco gentile, in quanto in caso di problemi di routing si allunga
+  inutilmente il numero di ritrasmissioni.
+  
 
 \item[\texttt{ip\_forward}] abilita l'inoltro dei pacchetti da una interfaccia
   ad un altra, e può essere impostato anche per la singola interfaccia. Prende
 
 \item[\texttt{ip\_forward}] abilita l'inoltro dei pacchetti da una interfaccia
   ad un altra, e può essere impostato anche per la singola interfaccia. Prende
@@ -3457,8 +4101,8 @@ accessibile con \texttt{man 7 ip}, sono i seguenti:
   conflitti con le porte usate dai servizi noti.
 
 \item[\texttt{ip\_no\_pmtu\_disc}] imposta la disciplina di ricerca della
   conflitti con le porte usate dai servizi noti.
 
 \item[\texttt{ip\_no\_pmtu\_disc}] imposta la disciplina di ricerca della
-  \textit{Path MTU} (vedi sez.~\ref{sec:net_lim_dim} e
-  sez.~\ref{sec:sock_ipv4_options}).
+  \itindex{Maximum~Transfer~Unit} \textit{Path MTU} (vedi
+  sez.~\ref{sec:net_lim_dim} e sez.~\ref{sec:sock_ipv4_options}).
 
 \item[\texttt{ipfrag\_high\_thresh}] limite massimo (espresso in numero di
   byte) sui pacchetti IP frammentati presenti in coda; quando questo valore
 
 \item[\texttt{ipfrag\_high\_thresh}] limite massimo (espresso in numero di
   byte) sui pacchetti IP frammentati presenti in coda; quando questo valore
@@ -3486,11 +4130,217 @@ accessibile con \texttt{man 7 ip}, sono i seguenti:
 
 % \item[\texttt{neigh/*}] La directory contiene i valori 
 % TODO trattare neigh/* nella parte su arp, da capire dove sarà.
 
 % \item[\texttt{neigh/*}] La directory contiene i valori 
 % TODO trattare neigh/* nella parte su arp, da capire dove sarà.
-
 \end{basedescript}
 
 \end{basedescript}
 
+I file di \texttt{/proc/sys/net/ipv4} che invece fanno riferimento alle
+caratteristiche specifiche del protocollo TCP, elencati anche nella rispettiva
+pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti:
+\begin{basedescript}{\desclabelwidth{3.9cm}\desclabelstyle{\nextlinelabel}}
+
+\item[\texttt{tcp\_abort\_on\_overflow}] è un valore logico (disabilitato di
+  default) che indica di azzerare le connessioni quando il programma che le
+  riceve è troppo lento ed incapace di accettarle. Questo consente di
+  recuperare le connessioni se si è avuto un eccesso dovuto ad un qualche
+  picco di traffico, ma ovviamente va a discapito dei client che interrogano
+  il server. Pertanto è da abilitare soltanto quando si è sicuri che non è
+  possibile ottimizzare il server in modo che sia in grado di accettare
+  connessioni più rapidamente.
+
+\item[\texttt{tcp\_adv\_win\_scale}] questa variabile intera indica al kernel
+  quanto spazio all'interno del buffer associato ad un socket (quello
+  impostato con \texttt{tcp\_rmem}) deve essere utilizzato per la finestra del
+  protocollo TCP (quello che costituisce la \itindex{advertised~window}
+  \textit{advertised window} annunciata all'altro capo del socket) e quello
+  che viene usato come buffer applicativo per isolare la rete dalle latenze
+  dell'applicazione. Il valore viene calcolato secondo la formula
+  $\texttt{buffer}/2^\texttt{tcp\_adv\_win\_scale}$ se positivo o con 
+  $\texttt{buffer}-\texttt{buffer}/2^\texttt{tcp\_adv\_win\_scale}$ se
+  negativo. Il valore di default è 2 che significa che al buffer
+  dell'applicazione viene riservato un quarto del totale.
+
+\item[\texttt{tcp\_app\_win}] il valore indica quanti byte della finestra TCP
+  vengono riservati per la bufferizzazione, valore è il massimo fra la
+  \itindex{Maximum~Segment~Size} MSS e
+  $\texttt{window}/2^\texttt{tcp\_app\_win}$. Un valore nullo significa che
+  non viene riservato nessuno spazio; il default è 31.
+
+% vecchi, presumibilmente usati quando gli algoritmi di congestione non erano
+% modularizzabili 
+% \item[\texttt{tcp\_bic}]
+% \item[\texttt{tcp\_bic\_low\_window}] 
+% \item[\texttt{tcp\_bic\_fast\_convergence}] 
+
+\item[\texttt{tcp\_dsack}] Abilita il supporto definito
+  nell'\href{http://www.ietf.org/rfc/rfc2884.txt}{RFC~2884} per il
+  \textit{Duplicate SACK}.\footnote{si indica con SACK (\textit{Selective
+      Acknowledgement}) un'opzione TCP, definita
+    nell'\href{http://www.ietf.org/rfc/rfc2018.txt}{RFC~2018}, usata per dare
+    un \textit{acknowledgement} unico su blocchi di pacchetti non contigui.}
+
+\item[\texttt{tcp\_ecn}] Abilita il meccanismo della \textit{Explicit
+    Congestion Notification} (o ECN) definito
+  nell'\href{http://www.ietf.org/rfc/rfc2884.txt}{RFC~2884}. Si tenga presente
+  che se si abilita questa opzione si possono avere dei malfunzionamenti
+  apparentemente casuali dipendenti dalla destinazione, dovuti al fatto che
+  alcuni vecchi router non supportano il meccanismo ed alla sua attivazione
+  scartano i relativi pacchetti.\\
+
+\item[\texttt{tcp\_fack}] è un valore logico che abilita il supporto per il
+  \textit{TCP Forward Acknowledgement}. Di default è abilitato.
+% TODO documentare o descrivere che cos'è il TCP Forward Acknowledgement
+
+\item[\texttt{tcp\_fin\_timeout}] specifica il numero di secondi (il default è
+  60\footnote{nei kernel della serie 2.2.x era invece di 120 secondi.}) da
+  passare in stato \texttt{FIN\_WAIT2} nell'attesa delle ricezione del
+  pacchetto FIN conclusivo, passati quali il socket viene comunque chiuso
+  forzatamente.  L'uso di questa opzione realizza quella che in sostanza è una
+  violazione delle specifiche del protocollo TCP, ma è utile per fronteggiare
+  alcuni attacchi di \itindex{Denial~of~Service~(DoS)} \textit{Denial of
+    Service}.
+
+\item[\texttt{tcp\_frto}] è un valore logico che abilita il supporto per
+  l'algoritmo F-RTO, un algoritmo usato per la ritrasmissione dei timeout del
+  protocollo TCP, che diventa molto utile per le reti wireless dove la perdita
+  di pacchetti è usualmente dovuta a delle interferenze radio, piuttosto che
+  alla congestione dei router. Di default è disabilitato.
+
+
+\item[\texttt{tcp\_keepalive\_intvl}] il numero di secondi che deve
+  trascorrere fra l'emissione di due successivi pacchetti di test quando è
+  abilitata la funzionalità del \textit{keepalive} (vedi
+  sez.~\ref{sec:sock_options_main}). Il valore di default è 75.
+
+\item[\texttt{tcp\_keepalive\_probes}] il massimo numero pacchetti di
+  \textit{keepalive} (vedi sez.~\ref{sec:sock_options_main}) che devono essere
+  inviati senza ricevere risposta prima che il kernel decida che la
+  connessione è caduta e la termini. Il valore di default è 9.
+
+\item[\texttt{tcp\_keepalive\_time}] il numero di secondi che devono passare
+  senza traffico sulla connessione prima che il kernel, qualora si sia
+  utilizzata l'opzione \const{SO\_KEEPALIVE} (vedi
+  sez.~\ref{sec:sock_options_main}), inizi ad inviare pacchetti di pacchetti
+  di \textit{keepalive}. Il default è 7200, pari a due ore.
+
+\item[\texttt{tcp\_low\_latency}] un valore logico che indica allo stack TCP
+  del kernel di ottimizzare il comportamento per ottenere tempi di latenza più
+  bassi a scapito di valori più alti per l'utilizzo della banda. Di default è
+  disabilitato in quanto un maggior utilizzo della banda è preferito, ma
+  esistono applicazioni particolari in cui la riduzione della latenza è più
+  importante (ad esempio i cluster di calcolo parallelo) in cui lo si può
+  abilitare. 
+
+\item[\texttt{tcp\_max\_orphans}] il numero massimo di socket TCP
+  ``\textsl{orfani}'' (vale a dire non associati a nessun file descriptor)
+  consentito nel sistema.\footnote{trattasi in genere delle connessioni
+    relative a socket chiusi che non hanno completato il processo di
+    chiusura.}  Quando il limite viene ecceduto la connessione orfana viene
+  resettata e viene stampato un avvertimento. Questo limite viene usato per
+  contrastare alcuni elementari attacchi di \textit{denial of service}.
+  Diminuire il valore non è mai raccomandato, in certe condizioni di rete può
+  essere opportuno aumentarlo, ma si deve tenere conto del fatto che ciascuna
+  connessione orfana può consumare fino a 64K di memoria del kernel. Il di
+  default viene impostato inizialmente al valore del parametro del kernel
+  \texttt{NR\_FILE}, e viene aggiustato a seconda della memoria disponibile.
+% TODO verificare la spiegazione di connessione orfana
+
+\item[\texttt{tcp\_max\_syn\_backlog}] un numero intero che indica la
+  lunghezza della coda delle connessioni incomplete, cioè delle connessioni
+  per le quali si è ricevuto un SYN di richiesta ma non l'ACK finale del
+  \itindex{three~way~handshake} \textit{three way handshake} (si riveda quanto
+  illustrato in sez.\ref{sec:TCP_func_listen}).
+
+  Quando questo valore è superato il kernel scarterà immediatamente ogni
+  ulteriore richiesta di connessione. Il valore di default (che è 256) viene
+  automaticamente portato a 1024 qualora nel sistema ci sia sufficiente
+  memoria (se maggiore di 128Mb) e ridotto a 128 qualora la memoria sia poca
+  (inferiore a 32Mb).\footnote{si raccomanda, qualora si voglia aumentare il
+    valore oltre 1024, di seguire la procedura citata nella pagina di manuale
+    di TCP, e modificare il valore della costante \texttt{TCP\_SYNQ\_HSIZE}
+    nel file \texttt{include/net/tcp.h} dei sorgenti del kernel, in modo che
+    sia $\mathtt{tcp\_max\_syn\_backlog} \ge \mathtt{16*TCP\_SYNQ\_HSIZE}$,
+    per poi ricompilare il kernel.}
+
+\item[\texttt{tcp\_max\_tw\_buckets}] questo valore indica il numero massimo
+  di socket in stato \texttt{TIME\_WAIT} consentito nel sistema; viene
+  impostato per prevenire semplici attacchi di \textit{denial of service} ed
+  inizializzato di default ad un valore del parametro \texttt{NR\_FILE}, per
+  poi essere aggiustato a seconda della memoria presente. Se il valore viene
+  superato il socket viene chiuso con la stampa di un avviso.
+  
+
+\item[\texttt{tcp\_mem}] una tripletta di valori usati dallo stack TCP per
+  controllare il proprio uso della memoria. Il primo valore, chiamato
+  \textit{low} nelle pagine di manuale, indica il numero di pagine allocate
+  sotto il quale non viene usato nessun meccanismo di regolazione dell'uso
+  della memoria. 
+
+  Il secondo valore, chiamato \textit{pressure} indica il numero di pagine
+  allocate passato il quale lo stack TCP inizia a moderare il suo consumo di
+  memoria. Si esce da questo stato di \textsl{pressione} sulla memoria quando
+  il numero di pagine scende sotto il precedente valore \textit{low}.
+
+  Il terzo valore, chiamato \textit{high} indica il numero massimo di pagine
+  che possono essere utilizzate dallo stack TCP/IP, e soprassiede ogni altro
+  valore specificato dagli altri limiti del kernel.
+
+
+\item[\texttt{tcp\_orphan\_retries}] il numero massimo di volte che si esegue
+  un tentativo di controllo sull'altro capo di una connessione che è stata già
+  chiusa dalla nostra parte. Il valore di default è 8 volte.
+
+\item[\texttt{tcp\_reordering}] il numero massimo di volte che un pacchetto
+  può essere riordinato nel flusso di dati, prima che lo stack TCP assuma che
+  è andato perso e si ponga nello stato di \textit{slow start} (si veda
+  sez.~\ref{sez:tcp_protocol_xxx}) viene usata questa metrica di
+  riconoscimento dei riordinamenti per evitare inutili ritrasmissioni
+  provocate dal riordinamento. Non è opportuno modificare questo valore dal
+  default che è 3.
+
+\item[\texttt{tcp\_retrans\_collapse}] 
+
+\item[\texttt{tcp\_retries1}] imposta il massimo numero di volte che
+  protocollo tenterà la ritrasmissione si un pacchetto su una connessione
+  stabilita prima di fare ricorso ad ulteriori sforzi che coinvolgano anche il
+  livello di rete. Passato questo numero di ritrasmissioni verrà fatto
+  eseguire al livello di rete un tentativo di aggiornamento della rotta verso
+  la destinazione prima di eseguire ogni successiva ritrasmissione.
+
+\item[\texttt{tcp\_retries2}] imposta il numero di tentativi di ritrasmissione
+  di un pacchetto inviato su una connessione già stabilita per il quale non si
+  sia ricevuto una risposta di ACK (si veda anche quanto illustrato in
+  sez.~\ref{sec:TCP_server_crash}). Il valore default è 15, che significa un
+  tempo variabile fra 13 e 30 minuti; questo non corrisponde a quanto
+  richiesto 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[\texttt{tcp\_rfc1337}] 
+
+\item[\texttt{tcp\_rmem}] 
+
+
+\item[\texttt{tcp\_sack}] 
+\item[\texttt{tcp\_stdurg}] 
+\item[\texttt{tcp\_synack\_retries}] 
+\item[\texttt{tcp\_syncookies}] 
+
+\item[\texttt{tcp\_syn\_retries}] imposta il numero di tentativi (il default è
+  5) di ritrasmissione dei pacchetti SYN di inizio connessione del
+  \itindex{three~way~handshake} \textit{three way handshake} (si ricordi
+  quanto illustrato in sez.\ref{sec:TCP_func_connect}). Il valore non deve
+  superare 255. 
+
+\item[\texttt{tcp\_timestamps}] 
+\item[\texttt{tcp\_tw\_recycle}] 
+\item[\texttt{tcp\_tw\_reuse}] 
+\item[\texttt{tcp\_window\_scaling}] 
+
+
+\item[\texttt{tcp\_vegas\_cong\_avoid}] 
+\item[\texttt{tcp\_westwood}] 
+\item[\texttt{tcp\_wmem}] 
+\end{basedescript}
 
 % LocalWords:  socket sez dotted decimal resolver Domain Name Service cap DNS
 % LocalWords:  client fig LDAP Lightweight Access Protocol NIS Information Sun
 
 % LocalWords:  socket sez dotted decimal resolver Domain Name Service cap DNS
 % LocalWords:  client fig LDAP Lightweight Access Protocol NIS Information Sun
@@ -3546,13 +4396,31 @@ accessibile con \texttt{man 7 ip}, sono i seguenti:
 % LocalWords:  rmem wmem message cost burst bucket filter netdev backlog optmem
 % LocalWords:  forward dynaddr dial autoconfig local masquerading ipfrag high
 % LocalWords:  thresh low always defrag CONFIG SETSIG cmd FIOGETOWN FIOSETOWN
 % LocalWords:  rmem wmem message cost burst bucket filter netdev backlog optmem
 % LocalWords:  forward dynaddr dial autoconfig local masquerading ipfrag high
 % LocalWords:  thresh low always defrag CONFIG SETSIG cmd FIOGETOWN FIOSETOWN
+% LocalWords:  quest'ultime neigh dev weight cong mod somaxconn Di SIOCINQ DoS
+% LocalWords:  Documentation SIOCATMARK SIOCOUTQ FIONREAD TIOCOUTQ Denial work
+% LocalWords:  netfilter scheduler mark ARP DHCP BOOTP RARP nonlocal sniffer is
+% LocalWords:  linux NODELAY MAXSEG CORK KEEPIDLE KEEPINTVL KEEPCNT SYNCNT INFO
+% LocalWords:  DEFER ACCEPT WINDOW CLAMP QUICKACK CONGESTION ENCAP urgent MSS
+% LocalWords:  Segment SYN accept advertised window info quickack Nagle ifreq
+% LocalWords:  ifr ppp union EPERM SIOCGIFNAME dell' interface index IFF NOARP
+% LocalWords:  SIOCGIFINDEX SIOCGIFFLAGS POINTOPOINT RUNNING PROMISC NOTRAILERS
+% LocalWords:  ALLMULTI bundle PORTSEL ifmap AUTOMEDIA DYNAMIC SIOCSIFFLAGS way
+% LocalWords:  SIOCGIFMETRIC SIOCSIFMETRIC SIOCGIFMTU SIOCSIFMTU SIOCGIFHWADDR
+% LocalWords:  SIOCSIFHWADDR SIOCSIFHWBROADCAST SIOCGIFMAP SIOCSIFMAP sendfile
+% LocalWords:  SIOCADDMULTI SIOCDELMULTI SIOCGIFTXQLEN SIOCSIFTXQLEN three syn
+% LocalWords:  SIOCSIFNAME SIOCGIFCONF handshake retries MIN FreeBSD closing Mb
+% LocalWords:  abort overflow adv win app bic convergence dsack ecn fack frto
+% LocalWords:  intvl probes latency orphans l'ACK SYNQ HSIZE tw buckets mem rfc
+% LocalWords:  orphan reordering collapse sack stdurg synack syncookies recycle
+% LocalWords:  timestamps scaling vegas avoid westwood tcpi l'incapsulazione NR
+% 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
 
 %%% Local Variables: 
 %%% mode: latex
 %%% TeX-master: "gapil"
 %%% End: 
 
 %%% Local Variables: 
 %%% mode: latex
 %%% TeX-master: "gapil"
 %%% End: 
-% LocalWords:  quest'ultime neigh dev weight cong mod somaxconn Di SIOCINQ DoS
-% LocalWords:  Documentation SIOCATMARK SIOCOUTQ FIONREAD TIOCOUTQ Denial work
-% LocalWords:  netfilter scheduler mark ARP DHCP BOOTP RARP nonlocal sniffer
-% LocalWords:  linux NODELAY MAXSEG CORK KEEPIDLE KEEPINTVL KEEPCNT SYNCNT INFO
-% LocalWords:  DEFER ACCEPT WINDOW CLAMP QUICKACK CONGESTION ENCAP urgent
+% LocalWords:  hop Selective Acknowledgement acknowledgement Explicit RTO stack
+% LocalWords:  Notification wireless denial pressure