Varie correzioni da Fabio Rossi, e relative aggiunte nei ringrazimenti per
[gapil.git] / sockctrl.tex
index d65f7c4371728f9ec1fb75113ae003009f61d554..88804386e2fa9daddd6a4d80a249308011330076 100644 (file)
@@ -40,7 +40,7 @@ La risoluzione dei nomi 
 internet invece che per numero IP attraverso il relativo \textsl{nome a
   dominio}.\footnote{non staremo ad entrare nei dettagli della definizione di
   cosa è un nome a dominio, dandolo per noto, una introduzione alla
-  problematica si trova in \cite{AGL} (cap. 9) mentre per una trattazione
+  problematica si trova in \cite{AGL} (cap.~9) mentre per una trattazione
   approfondita di tutte le problematiche relative al DNS si può fare
   riferimento a \cite{DNSbind}.} In realtà per DNS si intendono spesso i
 server che forniscono su internet questo servizio, mentre nel nostro caso
@@ -147,7 +147,7 @@ tab.~\ref{tab:sys_NSS_classes}.
                        (\acr{uid}, ecc.).\\  
     \texttt{group}    & corrispondenze fra nome del gruppo e proprietà dello 
                         stesso.\\  
-    \texttt{aliases}  & alias per la posta elettronica\\ 
+    \texttt{aliases}  & alias per la posta elettronica.\\ 
     \texttt{ethers}   & corrispondenze fra numero IP e MAC address della
                         scheda di rete.\\ 
     \texttt{hosts}    & corrispondenze fra nome a dominio e numero IP.\\ 
@@ -2262,9 +2262,9 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   per primi, in modalità che dipendono dalla disciplina di gestione della
   coda. Nel caso di protocollo IP questa opzione permette anche di impostare i
   valori del campo \textit{type of service} (noto come TOS, vedi
-  sez.~\ref{sec:IP_xxx}) per i pacchetti uscenti. Per impostare una priorità
-  al di fuori dell'intervallo di valori fra 0 e 6 sono richiesti i privilegi
-  di amministratore con la capability \const{CAP\_NET\_ADMIN}.
+  sez.~\ref{sec:IP_header}) per i pacchetti uscenti. Per impostare una
+  priorità al di fuori dell'intervallo di valori fra 0 e 6 sono richiesti i
+  privilegi di amministratore con la capability \const{CAP\_NET\_ADMIN}.
 
 \item[\const{SO\_ERROR}] questa opzione riceve un errore presente sul socket;
   può essere utilizzata soltanto con \func{getsockopt} e prende per
@@ -2272,14 +2272,15 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
 \end{basedescript}
 
 
-\subsection{Luso delle principali opzioni dei socket}
+\subsection{L'uso delle principali opzioni dei socket}
 \label{sec:sock_options_main}
 
-L'elenco sintetico delle caratteristiche delle opzioni dei socket riportato in
-sez.~\ref{sec:sock_generic_options} non è sufficientemente dettagliato per
-permetterci di approfondire il significato di alcune di esse, che assumono
-grande importanza nella programmazione dei socket. Per questo motivo
-tratteremo ulteriormente l'uso di alcune di esse in questa sezione.
+La descrizione sintetica del significato delle opzioni generiche dei socket,
+riportata nell'elenco in sez.~\ref{sec:sock_generic_options}, è
+necessariamente sintentica, alcune di queste però possono essere utilizzate
+per controllare delle funzionalità che hanno una notevole rilevanza nella
+programmazione dei socket.  Per questo motivo faremo in questa sezione un
+approfondimento sul significato delle opzioni generiche più importanti.
 
 
 \index{\texttt{SO\_KEEPALIVE} (costante)|(} 
@@ -2287,11 +2288,13 @@ tratteremo ulteriormente l'uso di alcune di esse in questa sezione.
 
 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, per
-cui un crollo della stessa potrebbe passare inosservato.
+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.
 
-Se si imposta questa opzione, è 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
 le connessioni (non ha senso per socket UDP ad esempio) e si applica
 principalmente ai socket TCP.
@@ -2309,44 +2312,38 @@ In caso di problemi invece si possono avere i due casi gi
 sez.~\ref{sec:TCP_conn_crash} per il caso di terminazione prococe 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 si passa per
-  la chiusura del processo, che chiude anche il socket inviando un segmento
-  FIN all'altro capo della connessione.} e si otterrà come risposta un RST. In
-tal caso il socket viene chiuso dopo aver impostato un errore
-\errcode{ECONNRESET}.
+  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 col'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}.
 
 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 ad un massimo di 9 volte\footnote{entrambi questi valori possono
+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 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
+  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.
 
-In generale questa opzione serve per individuare una caduta della
-connessione,\footnote{il crash di un processo di nuovo comporta la chiusura di
-  tutti i file che aveva aperti e la relativa emissione degli opportuni
-  segmenti FIN nel caso dei socket.} e viene usata sui server per evitare di
-mantenere impegnate le risorse dedicate a trattare delle connessioni in realtà
-terminate ad esempio perché l'altro capo è crollato senza che se ne sia
-ricevuto un avviso; quelle che vengono anche chiamate conessioni
-\textsl{semi-aperte}, in cui il server è in attesa di dati in ingresso che non
-arriveranno mai perché il client non è più attivo.
-
-Abilitandola le connessioni effettivamente terminate vengono chiuse e ad
-esempio una \func{select} potrà rilevare la conclusione delle stesse e
-ricevere il relativo errore. Si tenga però presente che non si ha la certezza
-assoluta che un errore di \errcode{ETIMEDOUT} corrisponda ad una reale
-conclusione della connessione, il problema potrebbe essere dovuto ad un
-problema di routing che perduri per un tempo maggiore di quello impiegato nei
-vari tentativi di ritrasmissione del \textit{keep-alive} (anche se questa non
-è una una condizione molto probabile).
+In generale questa opzione serve per individuare una caduta della connessione
+anche quando non si sta facendo traffico su di essa.  Viene usata
+principalmente sui server per evitare di mantenere impegnate le risorse che
+verrbbero 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.
 
 \begin{figure}[!htb]
   \footnotesize \centering
@@ -2356,10 +2353,21 @@ vari tentativi di ritrasmissione del \textit{keep-alive} (anche se questa non
   \normalsize
   \caption{La sezione della nuova versione del server del servizio
     \textit{echo} che prevede l'attivazione del \textit{keepalive} sui
-    socket.} 
+    socket.}
   \label{fig:echod_keepalive_code}
 \end{figure}
 
+Abilitandola dopo un certo tempo le connessioni effettivamente terminate
+verrano comunque chiuse per cui, utilizzando ad esempio una \func{select}, se
+be potrà rilevare la conclusione e ricevere il relativo errore. Si tenga
+presente però che non può avere la certezza assoluta che un errore di
+\errcode{ETIMEDOUT} ottenuto dopo aver abilitato questa opzione corrisponda
+necessariamente ad una reale conclusione della connessione, il problema
+potrebbe anche essere dovuto ad un problema di routing che perduri per un
+tempo maggiore di quello impiegato nei vari tentativi di ritrasmissione del
+\textit{keep-alive} (anche se questa non è una una condizione molto
+probabile).
+
 Come esempio dell'utilizzo di questa opzione introduciamo all'interno del
 nostro server per il servizio \textit{echo} la nuova opzione \texttt{-k} che
 permette di attivare il \textit{keep-alive} sui socket; tralasciando la parte
@@ -2373,9 +2381,10 @@ Come si pu
 la condizione (\texttt{\small 14}) che controlla l'attivazione del
 \textit{keep-alive} che come valore dell'argomento \param{optval} della
 chiamata a \func{setsockopt} (\texttt{\small 16}).  A seconda del suo valore
-tutte le volta che un processo figlio viene eseguito in risposta ad una
+tutte le volte che un processo figlio viene eseguito in risposta ad una
 connessione verrà pertanto eseguita o meno la sezione (\texttt{\small 14--17})
-che esegue l'impostazione di \const{SO\_KEEPALIVE} sul socket connesso.
+che esegue l'impostazione di \const{SO\_KEEPALIVE} sul socket connesso,
+attivando il relativo comportamento.
 \index{\texttt{SO\_KEEPALIVE} (costante)|)}
 
 
@@ -2388,32 +2397,34 @@ uso da parte di un altro socket. Si ricordi infatti che, come accennato in
 sez.~\ref{sec:TCP_func_bind}, normalmente la funzione \func{bind} fallisce con
 un errore di \errcode{EADDRINUSE} se la porta scelta è già utilizzata da un
 altro socket, proprio per evitare che possano essere lanciati due server sullo
-stesso indirizzo che verrebbero a contendersi i relativi pacchetti.  
-
-Esistono però dei casi speciali in cui non si vuole che questo accada, ed
-allora si può fare ricorso a questa opzione. La questione è comunque
-abbastanza complessa (il che rende questa una delle opzioni piu difficili da
-capire) in quanto, come sottolinea Stevens in \cite{UNP1}, si distinguono ben
-quattro casi diversi in cui è prevista la possibilità di un suo utilizzo.
-
-Il primo ed il più comune caso in cui si fa ricorso a \const{SO\_REUSEADDR} è
-quello in cui un server è terminato ma esistono ancora dei processi figli che
-mantengono attiva almeno una connessione remota che utilizza l'indirizzo
-locale mantenendo occupata la porta. Quando si riesegue il server allora
-questo riceve un errore sulla chiamata a \func{bind} dato che la porta è
-ancora utilizzata in una connessione esistente.\footnote{questa è una delle
-  domande più frequenti sui newsgroup dedicati allo sviluppo, in quanto è
-  piuttosto comune trovarsi in questa situazione quando si sta sviluppando un
-  server che si ferma e si riavvia in continuazione dopo aver fatto
-  modifiche.}  Inoltre se si usa il protocollo TCP questo può avvenire anche
-dopo tutti i processi figlio sono terminati, dato che una connessione può
+stesso indirizzo e la stessa porta, che verrebbero a contendersi i pacchetti
+aventi quella destinazione.
+
+Esistono però situazioni ed esigenze particolari in cui non si vuole che
+questo comportamento di salvaguardia accada, ed allora si può fare ricorso a
+questa opzione.  La questione è comunque abbastanza complessa in quanto, come
+sottolinea Stevens in \cite{UNP1}, si distinguono ben quattro casi diversi in
+cui è prevista la possibilità di un utilizzo di questa opzione, il che la
+rende una delle più difficili da capire.
+
+Il primo caso, che è anche il più comune, in cui si fa ricorso a
+\const{SO\_REUSEADDR} è quello in cui un server è terminato ma esistono ancora
+dei processi figli che mantengono attiva almeno una connessione remota che
+utilizza l'indirizzo locale, mantenendo occupata la porta. Quando si riesegue
+il server allora questo riceve un errore sulla chiamata a \func{bind} dato che
+la porta è ancora utilizzata in una connessione esistente.\footnote{questa è
+  una delle domande più frequenti sui newsgroup dedicati allo sviluppo, in
+  quanto è piuttosto comune trovarsi in questa situazione quando si sta
+  sviluppando un server che si ferma e si riavvia in continuazione dopo aver
+  fatto modifiche.}  Inoltre se si usa il protocollo TCP questo può avvenire
+anche dopo tutti i processi figli sono terminati, dato che una connessione può
 restare attiva anche dopo la chiusura del socket, mantenendosi nello stato
 \texttt{TIME\_WAIT} (vedi sez.~\ref{sec:TCP_time_wait}).
 
 Usando \const{SO\_REUSEADDR} fra la chiamata a \func{socket} e quella a
 \func{bind} si consente a quest'ultima di avere comunque successo anche se la
 connessione è attiva (o nello stato \texttt{TIME\_WAIT}). È bene però
-ricordare (si ricordi quanto detto in sez.~\ref{sec:TCP_time_wait}) che la
+ricordare (si riveda quanto detto in sez.~\ref{sec:TCP_time_wait}) che la
 presenza dello stato \texttt{TIME\_WAIT} ha una ragione, ed infatti se si usa
 questa opzione esiste sempre una probabilità, anche se estremamente
 remota,\footnote{perché ciò avvenga infatti non solo devono coincidere gli
@@ -2426,10 +2437,11 @@ Come esempio di uso di questa connessione abbiamo predisposto una nuova
 versione della funzione \func{sockbind} (vedi fig.~\ref{fig:sockbind_code})
 che consenta l'impostazione di questa opzione. La nuova funzione è
 \func{sockbindopt}, e le principali differenze rispetto alla precedente sono
-illustrate in fig.~\ref{fig:sockbindopt_code} dove si sono riportate le
-sezioni di codice modificate rispetto ad essa. Il codice completo della
-funzione si trova, insieme alle altre funzioni di servizio dei socket,
-all'interno del file \texttt{SockUtils.c} dei sorgenti allegati alla guida.
+illustrate in fig.~\ref{fig:sockbindopt_code}, dove si sono riportate le
+sezioni di codice modificate rispetto alla versione precedente. Il codice
+completo della funzione si trova, insieme alle altre funzioni di servizio dei
+socket, all'interno del file \texttt{SockUtils.c} dei sorgenti allegati alla
+guida.
 
 \begin{figure}[!htb]
   \footnotesize \centering
@@ -2442,12 +2454,12 @@ all'interno del file \texttt{SockUtils.c} dei sorgenti allegati alla guida.
   \label{fig:sockbindopt_code}
 \end{figure}
 
-In realtà tutto quello che si è fatto è stato introdurre (\texttt{\small 1})
-un nuovo argomento intero \param{reuse} nella nuova funzione che conterrà il
+In realtà tutto quello che si è fatto è stato introdurre nella nuova funzione
+(\texttt{\small 1}) un nuovo argomento intero, \param{reuse}, che conterrà il
 valore logico da usare nella successiva chiamata (\texttt{\small 14}) a
-\func{setsockopt}. Si è poi aggiunta la sezione (\texttt{\small 13-17}) che
+\func{setsockopt}. Si è poi aggiunta una sezione (\texttt{\small 13-17}) che
 esegue l'impostazione dell'opzione fra la chiamata a \func{socket} e quella a
-\func{bind}. 
+\func{bind}.
 
 
 A questo punto basterà modificare il  server per utilizzare la nuova
@@ -2503,7 +2515,7 @@ il sistema non supporta l'opzione \const{IP\_RECVDSTADDR};\footnote{nel caso
   sviluppo del kernel 2.1.x, ma è in seguito stata soppiantata dall'uso di
   \const{IP\_PKTINFO} (vedi sez.~\ref{sec:sock_ipv4_options}).} in tale modo
 si può sapere a quale socket corrisponde un certo indirizzo.  Non ha senso
-fare questa operazionie per socket TCP dato che su di essi si può sempre
+fare questa operazione per un socket TCP dato che su di essi si può sempre
 invocare \func{getsockname} una volta che si è completata la connessione.
 
 Infine il quarto caso è quello in cui si vuole effettivamente ottenere un
@@ -2540,13 +2552,14 @@ opzione sia specificata per tutti i socket per i quali si vuole eseguire il
 esiste, ma il comportamento di \const{SO\_REUSEADDR} è analogo, sarà cioè
 possibile effettuare un \textit{completely duplicate binding} ed ottenere il
 successo di \func{bind} su un socket legato allo stesso indirizzo e porta solo
-se il primo programma che ha eseguito \func{bind} su di essi ha impostato
+se il programma che ha eseguito per primo \func{bind} su di essi ha impostato
 questa opzione.\footnote{Questa restrizione permette di evitare il cosiddetto
   \textit{port stealing}, in cui un programma, usando \const{SO\_REUSEADDR},
   può collegarsi ad una porta già in uso e ricevere i pacchetti destinati ad
   un altro programma; con questa caratteristica ciò è possibile soltanto se il
   primo programma a consentirlo, avendo usato fin dall'inizio
-  \const{SO\_REUSEADDR}.}
+  \const{SO\_REUSEADDR}.}  
+
 \index{\texttt{SO\_REUSEADDR} (costante)|)}
 
 
@@ -2582,19 +2595,20 @@ illustrata; questa combinazione viene utilizzata per riportarsi al
 comportamento normale qualora esso sia stato cambiato da una precedente
 chiamata.
 
-Se però si utilizza un valore di \var{l\_onoff} diverso da zero, il
-comportamento alla chiusura viene a dipendere dal valore specificato per il
-campo \var{l\_linger}; se quest'ultimo è nullo l'uso delle funzioni
-\func{close} e \func{shutdown} provoca la terminazione immediata della
-connessione: nel caso di TCP cioè non viene eseguito il procedimento di
-chiusura illustrato in sez.~\ref{sec:TCP_conn_term}, ma tutti i dati ancora
-presenti nel buffer vengono immediatamente scartati e sulla rete viene inviato
-un segmento di RST che termina immediatamente la connessione.
+Se si utilizza un valore di \var{l\_onoff} diverso da zero, il comportamento
+alla chiusura viene a dipendere dal valore specificato per il campo
+\var{l\_linger}; se quest'ultimo è nullo l'uso delle funzioni \func{close} e
+\func{shutdown} provoca la terminazione immediata della connessione: nel caso
+di TCP cioè non viene eseguito il procedimento di chiusura illustrato in
+sez.~\ref{sec:TCP_conn_term}, ma tutti i dati ancora presenti nel buffer
+vengono immediatamente scartati e sulla rete viene inviato un segmento di RST
+che termina immediatamente la connessione.
 
 Un esempio di questo comportamento si può abilitare nel nostro client del
-servizio \textit{echo} utilizzando l'opzione \texttt{-r}, al solito riportiamo
-in fig.~\ref{fig:TCP_echo_sixth} solo la sezione di codice rilevante, il
-codice completo è disponibile nei sorgenti allegati.
+servizio \textit{echo} utilizzando l'opzione \texttt{-r}; riportiamo in
+fig.~\ref{fig:TCP_echo_sixth} la sezione di codice che permette di introdurre
+questa funzionalità,; al solito il codice completo è disponibile nei sorgenti
+allegati.
 
 \begin{figure}[!htb] 
   \footnotesize \centering
@@ -2607,31 +2621,33 @@ codice completo 
   \label{fig:TCP_echo_sixth}
 \end{figure}
 
-In questo caso la sezione indicata viene eseguita dopo aver effettuato la
-connessione e prima di chiamare la funzione di gestione, cioè fra le righe
-(\texttt{\small 12}) e (\texttt{\small 13}) del precedente esempio di
-fig.~\ref{fig:TCP_echo_fifth}. Il codice si limita semplicememente a
-controllare (\texttt{\small 3}) il valore della variabile \var{reset}
-(opportunamente impostata nella gestione delle opzioni qualora si usi
-\texttt{-r} nella chiamata del client) e nel caso impostare (\texttt{\small
-  5--6}) gli opportuni valori della struttura \var{ling}, per poi usare questa
-nella successiva (\texttt{\small 7}) chiamata a \func{setsockopt}. Di questa
-(\texttt{\small 7--10}) viene comunque controllato il valore di ritorno ed
-eseguita la terminazione del programma in caso un eventuale errore, con stampa
-dello stesso.
-
-Infine se sia \var{l\_onoff} che \var{l\_linger} hanno un valore diverso da
-zero sia \func{close} che \func{shutdown} si bloccano eseguendo la normale
-procedura di conclusione della connessione (quella di
-sez.~\ref{sec:TCP_conn_term}) e non ritornano fintanto che non si sia concluso
-il procedimento di chiusura della connessione, o non siano passati il numero
-di secondi\footnote{questa è l'unità di misura indicata da POSIX ed adottata
-  da Linux, altri kernel possono usare unità di misura diverse, oppure usare
-  il campo \var{l\_linger} come valore logico (ignorandone il valore) per
-  rendere (quando diverso da zero) \func{close} e \func{shutdown} bloccanti
-  fino al completamento della trasmissione dei dati sul buffer.}  specificati
-da \var{l\_linger}.
-
+La sezione indicata viene eseguita dopo aver effettuato la connessione e prima
+di chiamare la funzione di gestione, cioè fra le righe (\texttt{\small 12}) e
+(\texttt{\small 13}) del precedente esempio di fig.~\ref{fig:TCP_echo_fifth}.
+Il codice si limita semplicememente a controllare (\texttt{\small 3}) il
+valore della variabile \var{reset} che assegnata nella gestione delle opzioni
+in corrispondenza all'uso di \texttt{-r} nella chiamata del client. Nel caso
+questa sia diversa da zero vengono impostati (\texttt{\small 5--6}) i valori
+della struttura \var{ling} che permettono una terminazione immediata della
+connessine. Questa viene poi usata nella successiva (\texttt{\small 7})
+chiamata a \func{setsockopt}. Al solito si controlla (\texttt{\small 7--10})
+il valore di ritorno e si termina il programma in caso di errore, stampadone
+il valore.
+
+Infine l'ultima possibilità, quella in cui si utilizza effettivamente
+\const{SO\_LINGER} per \textsl{indugiare} nella chiusura, è quella in cui sia
+\var{l\_onoff} che \var{l\_linger} hanno un valore diverso da zero. Se si
+esegue l'impostazione con questi valori sia \func{close} che \func{shutdown}
+si bloccano, nel frattempo viene eseguita la normale procedura di conclusione
+della connessione (quella di sez.~\ref{sec:TCP_conn_term}) ma entrambe le
+funzioni non ritornano fintanto che non si sia concluso il procedimento di
+chiusura della connessione, o non sia passato un numero di
+secondi\footnote{questa è l'unità di misura indicata da POSIX ed adottata da
+  Linux, altri kernel possono usare unità di misura diverse, oppure usare il
+  campo \var{l\_linger} come valore logico (ignorandone il valore) per rendere
+  (quando diverso da zero) \func{close} e \func{shutdown} bloccanti fino al
+  completamento della trasmissione dei dati sul buffer.}  pari al valore
+specificato in \var{l\_linger}.
 
 
 
@@ -2650,7 +2666,9 @@ socket che usano il protocollo IPv4.\footnote{come per le precedenti opzioni
   pagine di manuale, nel caso specifico la documentazione si può consultare
   con \texttt{man 7 ip}.}  Se si vuole operare su queste opzioni generiche il
 livello da utilizzare è \const{SOL\_IP}; si è riportato un elenco di queste
-opzioni in tab.~\ref{tab:sock_opt_iplevel}.
+opzioni in tab.~\ref{tab:sock_opt_iplevel}. Le costanti indicanti le opzioni e
+tutte le altre costanti ad esse collegate sono definite in
+\file{netinet/ip.h}, ed accessibili includendo detto file.
 
 
 \begin{table}[!htb]
@@ -2662,57 +2680,184 @@ opzioni in tab.~\ref{tab:sock_opt_iplevel}.
                     \textbf{Descrizione}\\
     \hline
     \hline
-    \const{IP\_OPTIONS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-                          Imposta o riceve le opzioni di IP.\\
-    \const{IP\_PKTINFO}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-                          Passa un messaggio di informazione.\\
-    \const{IP\_RECVTOS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-                          Passa un messaggio col campo TOS.\\
-    \const{IP\_RECVTTL}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-                          Passa un messaggio col campo TTL.\\
-    \const{IP\_RECVOPTS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-                          Passa un messaggio con le opzioni IP.\\
-    \const{IP\_RETOPTS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-                          Passa un messaggio con le opzioni IP non
-                          trattate.\\
-    \const{IP\_TOS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-                          Imposta il valore del campo TOS.\\
-    \const{IP\_TTL}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-                          Imposta il valore del campo TTL.\\
-    \const{IP\_HDRINCL}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-                          Passa l'intestazione di IP nei dati.\\
-    \const{IP\_RECVERR}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-                          Abilita la gestione degli errori.\\
-    \const{IP\_MTU\_DISCOVER}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-                          Imposta il Path MTU Discovery.\\
-    \const{IP\_MTU}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-                          Legge il valore attuale della 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$&$\bullet$&\texttt{int}& 
-                          Imposta il TTL per i pacchetti multicast.\\
-    \const{IP\_MULTICAST\_LOOP}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-                          Controlla il reinvio a se
-                          stessi dei dati di multicast.\\ 
-    \const{IP\_ADD\_MEMBERSHIP}&         &$\bullet$&$\bullet$&\texttt{int}& 
-                          Si unisce a un gruppo di multicast.\\
+    \const{IP\_OPTIONS}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+      Imposta o riceve le opzioni di IP.\\
+    \const{IP\_PKTINFO}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+      Passa un messaggio di informazione.\\
+    \const{IP\_RECVTOS}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+      Passa un messaggio col campo TOS.\\
+    \const{IP\_RECVTTL}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+      Passa un messaggio col campo TTL.\\
+    \const{IP\_RECVOPTS}        &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+      Passa un messaggio con le opzioni IP.\\
+    \const{IP\_RETOPTS}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+      Passa un messaggio con le opzioni IP non trattate.\\
+    \const{IP\_TOS}             &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+      Imposta il valore del campo TOS.\\
+    \const{IP\_TTL}             &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+      Imposta il valore del campo TTL.\\
+    \const{IP\_HDRINCL}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+      Passa l'intestazione di IP nei dati.\\
+    \const{IP\_RECVERR}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+      Abilita la gestione degli errori.\\
+    \const{IP\_MTU\_DISCOVER}   &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+      Imposta il Path MTU Discovery.\\
+    \const{IP\_MTU}             &$\bullet$&       &$\bullet$&\texttt{int}& 
+      Legge il valore attuale della 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$&$\bullet$&\texttt{int}& 
+      Imposta il TTL per i pacchetti multicast.\\
+    \const{IP\_MULTICAST\_LOOP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+      Controlla il reinvio a se stessi dei dati di multicast.\\ 
+    \const{IP\_ADD\_MEMBERSHIP} &         &$\bullet$&$\bullet$&\texttt{int}& 
+      Si unisce a un gruppo di multicast.\\
     \const{IP\_DROP\_MEMBERSHIP}&        &$\bullet$&$\bullet$&\texttt{int}& 
-                          Si sgancia da un gruppo di multicast.\\
-    \const{IP\_MULTICAST\_IF}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-                          Imposta l'interfaccia locale di un socket
-                          multicast.\\ 
+      Si sgancia da un gruppo di multicast.\\
+    \const{IP\_MULTICAST\_IF}   &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+      Imposta l'interfaccia locale di un socket multicast.\\ 
    \hline
   \end{tabular}
   \caption{Le opzioni disponibili al livello \const{SOL\_IP}.} 
   \label{tab:sock_opt_iplevel}
 \end{table}
 
-
 Le descrizioni di tab.~\ref{tab:sock_opt_iplevel} sono estremamente succinte,
 una maggiore quantità di dettagli su queste opzioni è fornito nel seguente
 elenco:
 \begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
+
+
+\item[\const{IP\_OPTIONS}] l'opzione permette di impostare o leggere le
+  opzioni del protocollo IP (si veda sez.~\ref{sec:IP_options}). L'opzione
+  prende come valore dell'argomento \param{optval} un puntatore ad un buffer
+  dove sono mantenute le opzioni, mentre \param{optlen} indica la dimensione
+  di quest'ultimo. Quando la si usa con \func{getsockopt} vengono lette le
+  opzioni IP utilizzate per la spedizione, quando la si usa con
+  \func{setsockopt} vengono impostate le opzioni specificate. L'uso di questa
+  opzione richiede una profonda conoscenza del funzionamento del protocollo,
+  torneremo in parte sull'argomento in sez.~\ref{sec:sock_advanced_xxx}.
+
+
+\item[\const{IP\_PKTINFO}] Quando abilitata l'opzione permette di ricevere
+  insieme ai pacchetti un messaggio ancillare (vedi
+  sez.~\ref{sec:TCP_ancillary_data}) di tipo \const{IP\_PKTINFO} contenente
+  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
+  utilizzato (nel campo \var{ipi\_spec\_dst}) e l'indirizzo remoto dello
+  stesso (nel campo \var{ipi\_addr}).
+
+\begin{figure}[!htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \includestruct{listati/pktinfo.h}
+  \end{minipage}
+  \caption{La struttura \structd{pktinfo} usata dall'opzione
+    \const{IP\_PKTINFO} per ricavare informazioni sui pacchetti di un socket
+    di tipo \const{SOCK\_DGRAM}.}
+  \label{fig:sock_pktinfo_struct}
+\end{figure}
+
+
+L'opzione è utilizzabile solo per socket di tipo \const{SOCK\_DGRAM}. Questa è
+una opzione introdotta con i kernel della serie 2.2.x, ed è specifica di
+Linux;\footnote{non dovrebbe pertanto essere utilizzata se si ha a cuore la
+  portabilità.} essa permette di sostituire le opzioni \const{IP\_RECVDSTADDR}
+e \const{IP\_RECVIF} presenti in altri Unix (la relativa informazione è quella
+ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di
+\struct{pktinfo}). 
+
+
+\item[\const{IP\_RECVTOS}] Quando abilitata l'opzione permette di ricevere
+  insieme ai pacchetti un messaggio ancillare di tipo \const{IP\_TOS}, che
+  contiene un byte con il valore del campo \textit{Type of Service}
+  dell'intestazione IP del pacchetto stesso (vedi sez.~\ref{sec:IP_header}).
+  Prende per \param{optval} un intero usato come valore logico. 
+
+\item[\const{IP\_RECVTTL}] Quando abilitata l'opzione permette di ricevere
+  insieme ai pacchetti un messaggio ancillare di tipo \const{IP\_RECVTTL},
+  contenente un byte con il valore del campo \textit{Time to Live}
+  dell'intestazione IP (vedi sez.~\ref{sec:IP_header}).  L'opzione richiede
+  per \param{optval} un intero usato come valore logico. L'opzione non è
+  supportata per socket di tipo \const{SOCK\_STREAM}.
+
+\item[\const{IP\_RECVOPTS}] Quando abilitata l'opzione permette di ricevere
+  insieme ai pacchetti un messaggio ancillare di tipo \const{IP\_OPTIONS},
+  contenente le opzioni IP del protocollo (vedi sez.~\ref{sec:IP_options}). Le
+  intestazioni di instradamento e le altre opzioni sono già riempite con i
+  dati locali. L'opzione richiede per \param{optval} un intero usato come
+  valore logico.  L'opzione non è supportata per socket di tipo
+  \const{SOCK\_STREAM}.
+
+\item[\const{IP\_RETOPTS}] Identica alla precedente \const{IP\_RECVOPTS}, ma
+  in questo caso restituisce i dati grezzi delle opzioni, senza che siano
+  riempiti i capi di instradamento e le marche temporali.  L'opzione richiede
+  per \param{optval} un intero usato come valore logico.  L'opzione non è
+  supportata per socket di tipo \const{SOCK\_STREAM}.
+
+
+\item[\const{IP\_TOS}] L'opzione consente di leggere o impostare il campo
+  \textit{Type of Service} dell'intestazione IP (vedi
+  sez.~\ref{sec:IP_header}) che permette di indicare le priorità dei
+  pacchetti.  Il campo TOS è di 8 bit e l'opzione richiede per \param{optval}
+  un intero che ne contiene il valore. Sono definite anche alcune costanti che
+  definiscono alcuni valori standardizzati per il \textit{Type of Service},
+  riportate in tab.~\ref{tab:IP_TOS_values}, il valore di default usato da
+  Linux è \const{IPTOS\_LOWDELAY}, ma esso può essere modificato con le
+  funzionalità del cosiddetto \textit{Advanced Routing}. Si ricordi che la
+  priorità dei pacchetti può essere impostata anche in maniera indipendente
+  dal protocollo utilizzando l'opzione \const{SO\_PRIORITY} illustrata in
+  sez.~\ref{sec:sock_generic_options}.
+
+
+\item[\const{IP\_TTL}] L'opzione consente di leggere o impostare il campo
+  \textit{Time to Live} dell'intestazione IP (vedi sez.~\ref{sec:IP_header}).
+  Il campo TTL è di 8 bit e l'opzione richiede che \param{optval} sia un
+  intero, che ne conterrà il valore.
+
+
+\item[\const{IP\_HDRINCL}] Se abilitata l'utente deve fornire lui stesso
+  l'intestazione IP in cima ai propri dati. L'opzione è valida soltanto per
+  socket di tipo \const{SOCK\_RAW}, e quando utilizzata eventuali valori
+  impostati con \const{IP\_OPTIONS}, \const{IP\_TOS} o \const{IP\_TTL} sono
+  ignorati. In ogni caso prima della spedizione alcuni campi
+  dell'instestazione vengono comunque modificati dal kernel, torneremo
+  sull'argomento in sez.~\ref{sec:socket_raw_xxx}
+
+
+\item[\const{IP\_RECVERR}] Questa è una opzione introdotta con i kernel della
+  serie 2.2.x, ed è specifica di Linux. Essa permette di usufruire di un
+  meccanismo affidabile per ottenere un maggior numero di informazioni in caso
+  di errori. Se l'opzione è abilitata tutti gli errori generati su un socket
+  vengono memorizzati su una coda, dalla quale poi possono essere letti con
+  \func{recvmsg} (torneremo su questo in sez.~\ref{sec:TCP_ancillary_data}).
+  L'opzione richiede per \param{optval} un intero usato come valore logico;
+  l'opzione non è applicabile a socket di tipo \const{SOCK\_STREAM}.
+
+\item[\const{IP\_MTU\_DISCOVER}] Questa è una opzione introdotta con i kernel
+  della serie 2.2.x, ed è specifica di Linux.  L'opzione permette di scrivere
+  o leggere le impostazioni usante nella determinazione della \textit{Maximum
+    Tranfer Unit} (vedi sez.~\ref{sec:net_lim_dim}) per il socket.
+
+\item[\const{IP\_MTU}] Permette di leggere il valore della \textit{Maximum
+    Tranfer Unit} di percorso del socket.  L'opzione richiede per
+  \param{optval} un intero che conterrà il valore della MTU in byte.  Questa è
+  una opzione introdotta con i kernel della serie 2.2.x, ed è specifica di
+  Linux.
+
+\item[\const{IP\_ROUTER\_ALERT}] Questa è una opzione introdotta con i kernel
+  della serie 2.2.x, ed è specifica di Linux.
+
+\item[\const{IP\_MULTICAST\_TTL}] L'opzione permette di impostare o leggere il
+  valore del campo TTL per i pacchetti in uscita associati al socket. È
+  importante che questo valore sia il più basso possibile, ed il default è 1,
+  che significa che i pacchetti non potranno uscire dalla rete locale. Questa
+  opzione consente ai programmi che lo richiedono di superare questo limite.
+  L'opzione richiede per \param{optval} un intero che conterrà il valore del
+  TTL.
+
 \item[\const{IP\_MULTICAST\_LOOP}] L'opzione consente di decidere se i dati
   che si inviano su un socket usato con il multicast vengano ricevuti anche
   sulla stessa macchina da cui li si stanno inviando.  Prende per
@@ -2721,8 +2866,15 @@ elenco:
   In generale se si vuole che eventuali client possano ricevere i dati che si
   inviano occorre che questa funzionalità sia abilitata (come avviene di
   default). Qualora però non si voglia generare traffico per dati che già sono
-  disponibili l'uso di questa opzione permette di disabilitare questo tipo di
-  traffico. 
+  disponibili in locale l'uso di questa opzione permette di disabilitare
+  questo tipo di traffico.
+
+\item[\const{IP\_ADD\_MEMBERSHIP}]
+
+\item[\const{IP\_DROP\_MEMBERSHIP}]
+
+\item[\const{IP\_MULTICAST\_IF}] 
+
 
 \end{basedescript}
 
@@ -2764,10 +2916,11 @@ specifico quando la si impiega su file descriptor associati a dei socket.
 Come ultimo argomento di questa sezione tratteremo l'uso della funzione
 \func{sysctl} (che è stata introdotta nelle sue funzionalità generiche in
 sez.~\ref{sec:sys_sysctl}) per quanto riguarda le sue capacità di effettuare
-impostazioni relative a proprietà generali dei socket (di tutti quelli di un
-certo tipo o di tutti quelli che usano un certo protocollo) rispetto alle
-funzioni viste finora che consentono di controllare quelle di un singolo
-socket. 
+impostazioni relative alle proprietà dei socket. La differenza nell'uso di
+\func{sysctl} rispetto alle funzioni viste finora è che esse consentono di
+controllare le proprietà di un singolo socket, mentre con \func{sysctl} si
+impostano proprietà (o valori di default) validi a livello dell'intero
+sistema.
 
 Le opzioni disponibili per le proprietà della rete sono riportate nella
 gerarchia dei valori impostabili con \func{sysctl}, sotto il nodo
@@ -2775,7 +2928,8 @@ gerarchia dei valori impostabili con \func{sysctl}, sotto il nodo
 \texttt{/proc}, sotto \texttt{/proc/sys/net}. In genere sotto questa directory
 compaiono le sottodirectory (corrispondenti ad altrettanti sottonodi per
 \func{sysctl}) relative ai vari protocolli e tipi di interfacce su cui è
-possibile intervenire; un contenuto tipico è il seguente:
+possibile intervenire per effettuare impostazioni; un contenuto tipico di
+questa directory è il seguente:
 \begin{verbatim}
 /proc/sys/net/
 |-- core
@@ -2786,11 +2940,13 @@ possibile intervenire; un contenuto tipico 
 |-- token-ring
 `-- unix
 \end{verbatim}
+e sono presenti varie centinaia di diversi parametri; nel nostro caso ci
+limiteremo a vedere quelli più significativi.
 
-
-Nella directory \texttt{/proc/sys/net/core} sono disponibili le opzioni
-generiche dei socket, descritte anche nella rispettiva pagina di
-manuale.\footnote{quella accessibile con \texttt{man 7 socket}.} Queste sono:
+Nella directory \texttt{/proc/sys/net/core} sono disponibili i parametri
+generici validi per tutti i socket, quelli descritti anche nella rispettiva
+pagina di manuale.\footnote{quella accessibile con \texttt{man 7 socket}.}
+I principali sono:
 
 \begin{basedescript}{\desclabelwidth{3cm}\desclabelstyle{\nextlinelabel}}
 \item[\texttt{rmem\_default}] imposta la dimensione di default del buffer di
@@ -2809,6 +2965,17 @@ manuale.\footnote{quella accessibile con \texttt{man 7 socket}.} Queste sono:
 \item[\texttt{optmem\_max}] 
 \end{basedescript}
 
+Nella directory \texttt{/proc/sys/net/ipv4} sono disponibili i parametri per i
+socket IPv4, descritti anche nella rispettiva pagina di
+manuale.\footnote{quella accessibile con \texttt{man 7 ip}.} I principali
+sono:
+\begin{basedescript}{\desclabelwidth{3cm}\desclabelstyle{\nextlinelabel}}
+\item[\texttt{ip\_no\_pmtu\_disc}] imposta la discliplina di ricerca della
+  \textit{Path MTU} (vedi sez.~\ref{sec:net_lim_dim} e
+  sez.~\ref{sec:sock_ipv4_options}).
+\end{basedescript}
+
+
 
 %%% Local Variables: 
 %%% mode: latex