Indicizzati file sotto /proc, ed ulteriore materiale su ''inotify''.
[gapil.git] / sockctrl.tex
index f90a45eb5cff9fff18e7f2aef8e1f99e7816b5b9..c5bfafc116399574e9ff88cf5e9d0a7be4721558 100644 (file)
@@ -1,6 +1,6 @@
 %% 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",
@@ -8,6 +8,7 @@
 %% license is included in the section entitled "GNU Free Documentation
 %% License".
 %%
+
 \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}
 
-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
@@ -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
-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 è:
@@ -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
-\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.
@@ -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
-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
@@ -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
-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}.
@@ -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
-\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]
@@ -1462,13 +1463,13 @@ lista illustrata in fig.~\ref{fig:sock_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
-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
@@ -1559,7 +1560,7 @@ IPv4 address:
 \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 è:
@@ -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
-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. 
@@ -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
-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.
@@ -2259,12 +2260,14 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   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
+  \textit{sysctl}\footnote{cioè \procrelfile{/proc/sys/net/core}{wmem\_max} e
+    \procrelfile{/proc/sys/net/core}{rmem\_max} in \texttt{/proc/sys/net/core}
+    e \procrelfile{/proc/sys/net/ipv4}{tcp\_wmem} e
+    \procrelfile{/proc/sys/net/ipv4}{tcp\_rmem} in
     \texttt{/proc/sys/net/ipv4}, vedi sez.~\ref{sec:sock_sysctl}.} indica la
   memoria effettivamente impiegata.  Si tenga presente inoltre che le
-  modifiche alle dimensioni dei buffer di ingresso e di uscita per poter
-  essere effettive devono essere impostate prima della chiamata alle funzioni
+  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
@@ -2299,6 +2302,8 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   \func{select} che ritorna a causa dello stesso.
 \end{basedescript}
 
+% TODO documentare SO_ATTACH_FILTER e SO_DETACH_FILTER
+
 
 \subsection{L'uso delle principali opzioni dei socket}
 \label{sec:sock_options_main}
@@ -2347,22 +2352,22 @@ connessione non esiste pi
   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 riportanto un errore di
+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
-  essere opportunamente 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
+  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 invece si riceve
-come risposta un pacchetto ICMP di destinazione irraggiungibile (vedi
-sez.~\ref{sec:icmp_protocol_xxx}), verrà restituito l'errore corrispondente.
+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}), 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
@@ -2727,9 +2732,9 @@ sono definite in \file{netinet/ip.h}, ed accessibili includendo detto file.
     \const{IP\_RECVERR}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
       abilita la gestione degli errori.\\
     \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}& 
-      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}& 
       imposta l'opzione \textit{IP router alert} sui pacchetti.\\
     \const{IP\_MULTICAST\_TTL}  &$\bullet$&$\bullet$&         &\texttt{int}& 
@@ -2773,7 +2778,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
-  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}).
 
@@ -2934,13 +2941,13 @@ sez.~\ref{sec:net_sendmsg}).
   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}
 
@@ -3025,38 +3032,37 @@ trasportati su IP,\footnote{qui si sottintende IPv4, ma le opzioni per TCP e
 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
+  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
 \const{IPPROTO\_TCP}) come valore per l'argomento \param{level}. Si sono
-riportate le varie opzioni disponibili in tab.~\ref{tab:sock_opt_tcp} 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}.}
+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
   \footnotesize
-  \begin{tabular}[c]{|l|c|c|c|l|p{7cm}|}
+  \begin{tabular}[c]{|l|c|c|c|l|l|}
     \hline
     \textbf{Opzione}&\texttt{get}&\texttt{set}&\textbf{flag}&\textbf{Tipo}&
                     \textbf{Descrizione}\\
     \hline
     \hline
     \const{TCP\_NODELAY}      &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      spedisce tutti i pacchetti il prima possibile.\\
+      spedisce immediatamente i dati in segmenti singoli.\\
     \const{TCP\_MAXSEG}       &$\bullet$&$\bullet$&         &\texttt{int}&
-      valore della \itindex{Maximum~Segment~Size} MSS per i pacchetti in
+      valore della \itindex{Maximum~Segment~Size} MSS per i segmenti in
       uscita.\\  
     \const{TCP\_CORK}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
-      non invia frame parziali.\\
+      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}&
@@ -3064,19 +3070,19 @@ accessibili includendo detto file.\footnote{in realt
     \const{TCP\_KEEPCNT}      &$\bullet$&$\bullet$&         &\texttt{int}& 
       numero massimo di \textit{keepalive} inviati.\\
     \const{TCP\_SYNCNT}       &$\bullet$&$\bullet$&         &\texttt{int}& 
-      numero massimo di ritrasmissioni del pacchetto SYN.\\
+      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 \textit{advertised window}.\\
+      valore della \itindex{advertised~window} \textit{advertised window}.\\
     \const{TCP\_INFO}         &$\bullet$&        &       &\struct{tcp\_info}& 
-      raccoglie informazioni sul socket.\\
+      restituisce informazioni sul socket.\\
     \const{TCP\_QUICKACK}     &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
       abilita la modalità \textit{quickack}.\\
-    \const{TCP\_CONGESTION}   &$\bullet$&$\bullet$&?        &\texttt{?}& %??? 
-      non ancora documentata.\\
+    \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
@@ -3085,110 +3091,189 @@ accessibili includendo detto file.\footnote{in realt
 \end{table}
 
 Le descrizioni delle varie opzioni riportate in
-tab.~\ref{tab:sock_opt_tcplevel} sono estremamente sintetiche, una maggiore
-quantità di dettagli e la spiegazione delle singole opzioni è fornita nel
-seguente elenco:
-\begin{basedescript}{\desclabelwidth{3.3cm}\desclabelstyle{\nextlinelabel}}
-
-\item[\const{TCP\_NODELAY}] il protocollo TCP prevede, per evitare la
-  trasmissione di tanti pacchetti piccoli, che comporta un utilizzo non
-  ottimale della banda disponibile, un meccanismo di bufferizzazione dei
-  pacchetti uscenti controllato da un apposito algoritmo (detto
-  \textsl{algoritmo di Nagle}, vedi sez.\ref{sez:tcp_protocol_xxx}).  Il
-  comportamento normale prevede invece che i pacchetti siano accumulati
-  fintanto che non si raggiunge una quantità di dati considerata adeguata per
-  eseguire la trasmissione.
-
-  Impostando questa opzione si disabilita questo meccanismo ed i pacchetti
-  vengono inviati immediatamente qualunque sia la loro dimensione; l'opzione
-  viene sovrascritta dall'eventuale impostazione \const{TCP\_CORK} (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
-  pacchetti pendenti), anche qualora si fosse già abilitata
+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\_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}] permette di leggere e modificare il valore della
-  \itindex{Maximum~Segment~Size} MSS dei pacchetti uscenti, e se l'opzione è
-  impostata prima di stabilire la connessione, cambia anche il valore della
+\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 MTU questi verranno ignorati, inoltre TCP imporrà anche i
-  suoi limiti massimo e minimo per questo valore.
-
-\item[\const{TCP\_CORK}] quando questa opzione viene abilitata non vengono
-  inviati pacchetti di dati fintanto che essa non venga disabilitata; a quel
-  punto tutti i dati rimasti in coda saranno inviati in un solo pacchetto.
-  Questa opzione viene usata per gestire direttamente il flusso dei dati
-  mettendo un ``\textsl{tappo}'' al flusso di uscita, in modo ottimizzare a
-  mano il throughput. È molto utile anche quando si effettua il trasferimento
-  di dati da un file con \func{sendfile} (vedi sez.~\ref{sec:file_sendfile}),
-  se si vuole inserire una intestazione prima della chiamata a questa
-  funzione. 
+  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_splice}), 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 pacchetti per più di 200 millisecondi,
-  passati i quali i dati accumulati in cosa sanno inviati comunque.  Questa
-  opzione non è disponibile su tutti i kernel unix-like e deve essere evitata
-  se si vuole scrivere codice portabile.
-
-\item[\const{TCP\_KEEPIDLE}] 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}] 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
+  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\_KEEPCNT}] imposta il numero totale di messaggi di
-  \textit{keep-alive} da inviare prima di concludere che la connessione è
-  caduta (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}] 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 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}] 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 la
-    \const{SO\_LINGER} che abbiamo visto in sez.~\ref{sec:sock_options_main}.}
-  Questa opzione consente di sovrascrivere il valore globale impostato con la
-  \textit{sysctl} \texttt{tcp\_fin\_timeout} (vedi
+\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}] consente ad un socket in ascolto di
-  ritornare da \func{accept} soltanto quando sono presenti dati sullo stesso,
-  e non alla conclusione del \itindex{three~way~handshake} \textit{three way
-    handshake}. Prende un valore intero che indica il numero massimo di
-  secondi per cui il ritorno di \func{accept} viene rimandato; non deve essere
+\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\_WINDOW\_CLAMP}] limita 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\_INFO}] permette di ricevere una serie di informazioni
-  relative al socket che il kernel restituisce in una speciale struttura
-  \struct{tcp\_info}, la cui definizione è riportata in
-  fig.~\ref{fig:tcp_info_struct}.
-
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
@@ -3199,16 +3284,148 @@ seguente elenco:
   \label{fig:tcp_info_struct}
 \end{figure}
 
-\item[\const{TCP\_QUICKACK}] abilita la modalità speciale \textit{quickack}.
+\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.
+
+\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}
+
+%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
-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
@@ -3241,9 +3458,17 @@ sono un semplice riferimento, una maggiore quantit
 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}
 
@@ -3333,9 +3558,9 @@ processo che riceve i segnali) che si effettuano chiamando \func{ioctl} con
 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 dal tipo o famiglia dello stesso, e permette
-di impostare e rilevare le funzionalità delle interfacce di rete.
+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
@@ -3371,21 +3596,23 @@ sono le seguenti:
   dell'interfaccia, e restituisce il relativo nome in \var{ifr\_name}.
 
   Il kernel infatti assegna ad ogni interfaccia un numero progressivo, detto
-  appunto \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; si può ottenere un elenco delle interfacce che contiene anche il
-  valore del relativo indice usando il comando \cmd{ip link}.
+  appunto \itindex{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. Il valore restituito
-  è una maschera binaria i cui bit sono identificabili attraverso le varie
-  costanti di tab.~\ref{tab:netdevice_iface_flag}. 
+  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
@@ -3436,28 +3663,179 @@ sono le seguenti:
 
 
 \item[\const{SIOCSIFFLAGS}] permette di impostare il valore dei flag
-  dell'interfaccia attraverso il valore della maschera binaria da passare nel
+  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}] .
-\item[\const{SIOCSIFMETRIC}] .
-\item[\const{SIOCGIFMTU}] .
-\item[\const{SIOCSIFMTU}] .
-\item[\const{SIOCGIFHWADDR}] .
-\item[\const{SIOCSIFHWADDR}] .
-\item[\const{SIOCSIFHWBROADCAST}] .
-\item[\const{SIOCGIFMAP}] .
-\item[\const{SIOCSIFMAP}] . 
-\item[\const{SIOCADDMULTI}] .
-\item[\const{SIOCDELMULTI}] .
-\item[\const{SIOCGIFTXQLEN}] .
-\item[\const{SIOCSIFTXQLEN}] .
-\item[\const{SIOCSIFNAME}] .
-\item[\const{SIOCGIFCONF}] .
+\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}
@@ -3593,24 +3971,25 @@ 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
-  lettura (cioè per i dati in ingresso) dei socket.
-\item[\texttt{rmem\_max}] imposta la dimensione massima che si può assegnare al
-  buffer di ingresso dei socket attraverso l'uso dell'opzione
-  \const{SO\_RCVBUF}.
-\item[\texttt{wmem\_default}] imposta la dimensione di default del buffer di
-  scrittura (cioè per i dati in uscita) dei socket.
-\item[\texttt{wmem\_max}] imposta la dimensione massima che si può assegnare al
-  buffer di uscita dei socket attraverso l'uso dell'opzione
-  \const{SO\_SNDBUF}.
-\item[\texttt{message\_cost}, \texttt{message\_burst}] contengono le
-  impostazioni del \itindex{bucket~filter} \textit{bucket filter} che
-  controlla l'emissione di messaggi di avviso da parte kernel per eventi
-  relativi a problemi sulla rete, imponendo un limite che consente di
-  prevenire eventuali attacchi di \itindex{Denial~of~Service~(DoS)}
-  \textit{Denial of Service} usando i log.\footnote{senza questo limite un
-    attaccante potrebbe inviare ad arte un traffico che generi
-    intenzionalmente messaggi di errore, per saturare il sistema dei log.}
+\item[\procrelfile{/proc/sys/net/core}{rmem\_default}] imposta la dimensione
+  di default del buffer di lettura (cioè per i dati in ingresso) dei socket.
+\item[\procrelfile{/proc/sys/net/core}{rmem\_max}] imposta la dimensione
+  massima che si può assegnare al buffer di ingresso dei socket attraverso
+  l'uso dell'opzione \const{SO\_RCVBUF}.
+\item[\procrelfile{/proc/sys/net/core}{wmem\_default}] imposta la dimensione
+  di default del buffer di scrittura (cioè per i dati in uscita) dei socket.
+\item[\procrelfile{/proc/sys/net/core}{wmem\_max}] imposta la dimensione
+  massima che si può assegnare al buffer di uscita dei socket attraverso l'uso
+  dell'opzione \const{SO\_SNDBUF}.
+\item[\procrelfile{/proc/sys/net/core}{message\_cost},
+  \procrelfile{/proc/sys/net/core}{message\_burst}] contengono le impostazioni
+  del \itindex{bucket~filter} \textit{bucket filter} che controlla l'emissione
+  di messaggi di avviso da parte kernel per eventi relativi a problemi sulla
+  rete, imponendo un limite che consente di prevenire eventuali attacchi di
+  \itindex{Denial~of~Service~(DoS)} \textit{Denial of Service} usando i
+  log.\footnote{senza questo limite un attaccante potrebbe inviare ad arte un
+    traffico che generi intenzionalmente messaggi di errore, per saturare il
+    sistema dei log.}
 
   Il \itindex{bucket~filter} \textit{bucket filter} è un algoritmo generico
   che permette di impostare dei limiti di flusso su una quantità\footnote{uno
@@ -3633,11 +4012,11 @@ socket.  Quelli descritti anche nella pagina di manuale, accessibile con
   emissione (verranno accettati inizialmente fino ad un massimo di
   \texttt{message\_cost/message\_burst} messaggi).
 
-\item[\texttt{netdev\_max\_backlog}] numero massimo di pacchetti che possono
-  essere contenuti nella coda di ingresso generale.
+\item[\procrelfile{/proc/sys/net/core}{netdev\_max\_backlog}] numero massimo
+  di pacchetti che possono essere contenuti nella coda di ingresso generale.
 
-\item[\texttt{optmem\_max}] lunghezza massima dei dati ancillari e di
-  controllo (vedi sez.~\ref{sec:net_ancillary_data}).
+\item[\procrelfile{/proc/sys/net/core}{optmem\_max}] lunghezza massima dei
+  dati ancillari e di controllo (vedi sez.~\ref{sec:net_ancillary_data}).
 \end{basedescript}
 
 Oltre a questi nella directory \texttt{/proc/sys/net/core} si trovano altri
@@ -3645,28 +4024,34 @@ file, la cui documentazione dovrebbe essere mantenuta nei sorgenti del kernel,
 nel file \texttt{Documentation/networking/ip-sysctl.txt}; la maggior parte di
 questi però non è documentato:
 \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
+\item[\procrelfile{/proc/sys/net/core}{dev\_weight}] blocco di lavoro
+  (\textit{work quantum}) dello scheduler di processo dei pacchetti.
 
-\item[\texttt{lo\_cong}] valore per l'occupazione della coda di ricezione
-  sotto la quale si considera di avere una bassa congestione.
+% TODO da documentare meglio
 
-\item[\texttt{mod\_cong}] valore per l'occupazione della coda di ricezione
-  sotto la quale si considera di avere una congestione moderata.
+\item[\procrelfile{/proc/sys/net/core}{lo\_cong}] valore per l'occupazione
+  della coda di ricezione sotto la quale si considera di avere una bassa
+  congestione.
 
-\item[\texttt{no\_cong}] valore per l'occupazione della coda di ricezione
-  sotto la quale si si considera di non avere congestione.
+\item[\procrelfile{/proc/sys/net/core}{mod\_cong}] valore per l'occupazione
+  della coda di ricezione sotto la quale si considera di avere una congestione
+  moderata.
 
-\item[\texttt{no\_cong\_thresh}] valore minimo (\textit{low water mark}) per
-  il riavvio dei dispositivi congestionati.
+\item[\procrelfile{/proc/sys/net/core}{no\_cong}] valore per l'occupazione
+  della coda di ricezione sotto la quale si si considera di non avere
+  congestione.
 
-%\item[\texttt{netdev\_fastroute}] è presente soltanto quando si è compilato il
-%  kernel con l'apposita opzione di ottimizzazione per l'uso come router (.
+\item[\procrelfile{/proc/sys/net/core}{no\_cong\_thresh}] valore minimo
+  (\textit{low water mark}) per il riavvio dei dispositivi congestionati.
 
-\item[\texttt{somaxconn}] imposta la dimensione massima del \textit{backlog}
-  della funzione \func{listen} (vedi sez.~\ref{sec:TCP_func_listen}), e
-  corrisponde al valore della costante \const{SOMAXCONN}; il suo valore di
-  default è 128.
+  % \item[\procrelfile{/proc/sys/net/core}{netdev\_fastroute}] è presente
+  %   soltanto quando si è compilato il kernel con l'apposita opzione di
+  %   ottimizzazione per l'uso come router.
+
+\item[\procrelfile{/proc/sys/net/core}{somaxconn}] imposta la dimensione
+  massima del \textit{backlog} della funzione \func{listen} (vedi
+  sez.~\ref{sec:TCP_func_listen}), e corrisponde al valore della costante
+  \const{SOMAXCONN}; il suo valore di default è 128.
 
 \end{basedescript}
 
@@ -3685,62 +4070,72 @@ protocollo IP in quanto tale, descritti anche nella pagina di manuale
 accessibile con \texttt{man 7 ip}, sono i seguenti:
 \begin{basedescript}{\desclabelwidth{3.5cm}\desclabelstyle{\nextlinelabel}}
 
-\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.
-
-\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
-  un valore logico (0 disabilita, diverso da zero abilita).
-
-\item[\texttt{ip\_dynaddr}] Abilita la riscrittura automatica degli indirizzi
-  associati ad un socket quando una interfaccia cambia indirizzo. Viene usato
-  per le interfacce usate nei collegamenti in dial-up, il cui indirizzo IP
-  viene assegnato dinamicamente dal provider, e può essere modificato. Un
-  valore nullo disabilita la funzionalità, con 1 la si abilita, con 2 la si
-  abilità in modalità \textsl{prolissa}.
-
-\item[\texttt{ip\_autoconfig}] Specifica se l'indirizzo IP è stato configurato
-  automaticamente via DHCP, BOOTP o RARP.
-
-\item[\texttt{ip\_local\_port\_range}] imposta l'intervallo dei valori usati
-  per l'assegnazione delle porte effimere, permette cioè di modificare i
-  valori illustrati in fig.~\ref{fig:TCP_port_alloc}; prende due valori
-  numerici, che indicano gli estremi dell'intervallo. Si abbia cura di non
-  definire un intervallo che si sovrappone a quello delle porte usate per il
-  \itindex{masquerading} \textit{masquerading}, il kernel può gestire la
-  sovrapposizione, ma si avrà una perdita di prestazioni. Si imposti sempre un
-  valore iniziale maggiore di 1024 (o meglio ancora di 4096) per evitare
-  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}).
-
-\item[\texttt{ipfrag\_high\_thresh}] limite massimo (espresso in numero di
-  byte) sui pacchetti IP frammentati presenti in coda; quando questo valore
-  viene raggiunta la coda viene ripulita fino al valore
+\item[\procrelfile{/proc/sys/net/ipv4}{ip\_default\_ttl}] imposta il valore di
+  default per il campo TTL (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[\procrelfile{/proc/sys/net/ipv4}{ip\_forward}] abilita l'inoltro dei
+  pacchetti da una interfaccia ad un altra, e può essere impostato anche per
+  la singola interfaccia. Prende un valore logico (0 disabilita, diverso da
+  zero abilita).
+
+\item[\procrelfile{/proc/sys/net/ipv4}{ip\_dynaddr}] Abilita la riscrittura
+  automatica degli indirizzi associati ad un socket quando una interfaccia
+  cambia indirizzo. Viene usato per le interfacce usate nei collegamenti in
+  dial-up, il cui indirizzo IP viene assegnato dinamicamente dal provider, e
+  può essere modificato. Un valore nullo disabilita la funzionalità, con 1 la
+  si abilita, con 2 la si abilità in modalità \textsl{prolissa}.
+
+\item[\procrelfile{/proc/sys/net/ipv4}{ip\_autoconfig}] Specifica se
+  l'indirizzo IP è stato configurato automaticamente via DHCP, BOOTP o RARP.
+
+\item[\procrelfile{/proc/sys/net/ipv4}{ip\_local\_port\_range}] imposta
+  l'intervallo dei valori usati per l'assegnazione delle porte effimere,
+  permette cioè di modificare i valori illustrati in
+  fig.~\ref{fig:TCP_port_alloc}; prende due valori numerici, che indicano gli
+  estremi dell'intervallo. Si abbia cura di non definire un intervallo che si
+  sovrappone a quello delle porte usate per il \itindex{masquerading}
+  \textit{masquerading}, il kernel può gestire la sovrapposizione, ma si avrà
+  una perdita di prestazioni. Si imposti sempre un valore iniziale maggiore di
+  1024 (o meglio ancora di 4096) per evitare conflitti con le porte usate dai
+  servizi noti.
+
+\item[\procrelfile{/proc/sys/net/ipv4}{ip\_no\_pmtu\_disc}] imposta la
+  disciplina di ricerca della \itindex{Maximum~Transfer~Unit} \textit{Path
+    MTU} (vedi sez.~\ref{sec:net_lim_dim} e sez.~\ref{sec:sock_ipv4_options}).
+
+\item[\procrelfile{/proc/sys/net/ipv4}{ipfrag\_high\_thresh}] limite massimo
+  (espresso in numero di byte) sui pacchetti IP frammentati presenti in coda;
+  quando questo valore viene raggiunta la coda viene ripulita fino al valore
   \texttt{ipfrag\_low\_thresh}.
 
-\item[\texttt{ipfrag\_low\_thresh}] soglia bassa (specificata in byte) cui
-  viene riportata la coda dei pacchetti IP frammentati quando si raggiunge il
-  valore \texttt{ipfrag\_high\_thresh}.
-
-\item[\texttt{ip\_always\_defrag}] se abilitato (prende un intero come valore
-  logico) tutti i pacchetti IP frammentati saranno riassemblati, anche in caso
-  in successivo immediato inoltro.\footnote{introdotto con il kernel 2.2.13,
-    nelle versioni precedenti questo comportamento poteva essere solo in fase
-    di compilazione del kernel con l'opzione
-    \texttt{CONFIG\_IP\_ALWAYS\_DEFRAG}.}
-
-\item[\texttt{ip\_nonlocal\_bind}] se abilitato (prende un intero come valore
-  logico) è possibile che una applicazione possa collegarsi (con \func{bind}
-  su un indirizzo non locale. Questo può risultare utile per applicazioni
-  particolari (come gli \textit{sniffer}) che hanno la necessità di ricevere
-  pacchetti anche non diretti agli indirizzi presenti sulla macchina, ad
-  esempio per intercettare il traffico per uno specifico indirizzo che si
-  vuole tenere sotto controllo.
+\item[\procrelfile{/proc/sys/net/ipv4}{ipfrag\_low\_thresh}] soglia bassa
+  (specificata in byte) cui viene riportata la coda dei pacchetti IP
+  frammentati quando si raggiunge il valore \texttt{ipfrag\_high\_thresh}.
+
+\item[\procrelfile{/proc/sys/net/ipv4}{ip\_always\_defrag}] se abilitato
+  (prende un intero come valore logico) tutti i pacchetti IP frammentati
+  saranno riassemblati, anche in caso in successivo immediato
+  inoltro.\footnote{introdotto con il kernel 2.2.13, nelle versioni precedenti
+    questo comportamento poteva essere solo in fase di compilazione del kernel
+    con l'opzione \texttt{CONFIG\_IP\_ALWAYS\_DEFRAG}.}
+
+\item[\procrelfile{/proc/sys/net/ipv4}{ip\_nonlocal\_bind}] se abilitato
+  (prende un intero come valore logico) è possibile che una applicazione possa
+  collegarsi (con \func{bind} su un indirizzo non locale. Questo può risultare
+  utile per applicazioni particolari (come gli \textit{sniffer}) che hanno la
+  necessità di ricevere pacchetti anche non diretti agli indirizzi presenti
+  sulla macchina, ad esempio per intercettare il traffico per uno specifico
+  indirizzo che si vuole tenere sotto controllo.
 
 % \item[\texttt{neigh/*}] La directory contiene i valori 
 % TODO trattare neigh/* nella parte su arp, da capire dove sarà.
@@ -3750,37 +4145,122 @@ 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}] 
-\item[\texttt{tcp\_adv\_win\_scale}] 
-\item[\texttt{tcp\_app\_win}] 
-\item[\texttt{tcp\_bic\_low\_window}] 
-\item[\texttt{tcp\_bic\_fast\_convergence}] 
-\item[\texttt{tcp\_dsack}] 
-\item[\texttt{tcp\_ecn}] 
-\item[\texttt{tcp\_fack}] 
-
-\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}] 
-\item[\texttt{tcp\_keepalive\_intvl}] 
-\item[\texttt{tcp\_keepalive\_probes}] 
-\item[\texttt{tcp\_keepalive\_time}] 
-\item[\texttt{tcp\_low\_latency}] 
-\item[\texttt{tcp\_max\_orphans}] 
-
-\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}).
+
+\item[\procrelfile{/proc/sys/net/ipv4}{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[\procrelfile{/proc/sys/net/ipv4}{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[\procrelfile{/proc/sys/net/ipv4}{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[\procrelfile{/proc/sys/net/ipv4}{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[\procrelfile{/proc/sys/net/ipv4}{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[\procrelfile{/proc/sys/net/ipv4}{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[\procrelfile{/proc/sys/net/ipv4}{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[\procrelfile{/proc/sys/net/ipv4}{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[\procrelfile{/proc/sys/net/ipv4}{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[\procrelfile{/proc/sys/net/ipv4}{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[\procrelfile{/proc/sys/net/ipv4}{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[\procrelfile{/proc/sys/net/ipv4}{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[\procrelfile{/proc/sys/net/ipv4}{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[\procrelfile{/proc/sys/net/ipv4}{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
@@ -3788,47 +4268,95 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti:
   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}
+    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}$, e
-    poi ricompilare il kernel.}
-
-\item[\texttt{tcp\_max\_tw\_buckets}] 
-\item[\texttt{tcp\_mem}] 
-\item[\texttt{tcp\_orphan\_retries}] 
-\item[\texttt{tcp\_reordering}] 
-\item[\texttt{tcp\_retrans\_collapse}] 
-\item[\texttt{tcp\_retries1}] 
-
-\item[\texttt{tcp\_retries2}] imposta il numero di tentativi di ritrasmissione
-  (il default è 15) 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}).
-
-
-\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}
+    sia $\mathtt{tcp\_max\_syn\_backlog} \ge \mathtt{16*TCP\_SYNQ\_HSIZE}$,
+    per poi ricompilare il kernel.}
+
+\item[\procrelfile{/proc/sys/net/ipv4}{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[\procrelfile{/proc/sys/net/ipv4}{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[\procrelfile{/proc/sys/net/ipv4}{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[\procrelfile{/proc/sys/net/ipv4}{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_retrans\_collapse}]
 
+\item[\procrelfile{/proc/sys/net/ipv4}{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[\procrelfile{/proc/sys/net/ipv4}{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_rfc1337}] 
+
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_rmem}] 
+
+
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_sack}] 
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_stdurg}] 
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_synack\_retries}] 
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_syncookies}] 
+
+\item[\procrelfile{/proc/sys/net/ipv4}{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_timestamps}] 
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_tw\_recycle}] 
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_tw\_reuse}] 
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_window\_scaling}] 
+
+
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_vegas\_cong\_avoid}] 
+\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_westwood}] 
+\item[\procrelfile{/proc/sys/net/ipv4}{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
@@ -3884,21 +4412,32 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), 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
-
-%%% 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:  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
+% LocalWords:  ALLMULTI bundle PORTSEL ifmap AUTOMEDIA DYNAMIC SIOCSIFFLAGS way
 % LocalWords:  SIOCGIFMETRIC SIOCSIFMETRIC SIOCGIFMTU SIOCSIFMTU SIOCGIFHWADDR
-% LocalWords:  SIOCSIFHWADDR SIOCSIFHWBROADCAST SIOCGIFMAP SIOCSIFMAP
-% LocalWords:  SIOCADDMULTI SIOCDELMULTI SIOCGIFTXQLEN SIOCSIFTXQLEN
-% LocalWords:  SIOCSIFNAME SIOCGIFCONF
+% 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
+% LocalWords:  hop Selective Acknowledgement acknowledgement Explicit RTO stack
+% LocalWords:  Notification wireless denial pressure
+
+%%% Local Variables: 
+%%% mode: latex
+%%% TeX-master: "gapil"
+%%% End: 
+