Reindicizzate alcune macro, messa sezione sulle opzioni di IP, risistemata
[gapil.git] / sockctrl.tex
index 9e91f2dd22a5a6afd625530ce6b74130e59c8864..89c3bfce0cc97af6007417a308ab8a1f0e5e34eb 100644 (file)
@@ -1,6 +1,6 @@
 %% sockctrl.tex
 %%
-%% Copyright (C) 2004 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2004-2005 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",
@@ -49,7 +49,7 @@ necessita di compiere questa operazione.
 
 \begin{figure}[htb]
   \centering
-  \includegraphics[width=10cm]{img/resolver}
+  \includegraphics[width=9cm]{img/resolver}
   \caption{Schema di funzionamento delle routine del \textit{resolver}.}
   \label{fig:sock_resolver_schema}
 \end{figure}
@@ -117,6 +117,7 @@ dell'ordine in cui questi vengono interrogati.\footnote{con le implementazioni
   funzioni di libreria, prevedendo un ordine di interrogazione predefinito e
   non modificabile (a meno di una ricompilazione delle librerie stesse).}
 
+\index{\textit{Name~Service~Switch}|(}
 Per risolvere questa serie di problemi la risoluzione dei nomi a dominio
 eseguirà dal \textit{resolver} è stata inclusa all'interno di un meccanismo
 generico per la risoluzione di corrispondenze fra nomi ed informazioni ad essi
@@ -192,6 +193,7 @@ quello che conta sono le funzioni classiche che il \textit{resolver} mette a
 disposizione,\footnote{è cura della implementazione fattane nelle \acr{glibc}
   tenere conto della presenza del \textit{Name Service Switch}.} e sono queste
 quelle che tratteremo nelle sezioni successive.
+\index{\textit{Name~Service~Switch}|)}
 
 
 \subsection{Le funzioni di interrogazione del \textit{resolver}}
@@ -429,7 +431,7 @@ tab.~\ref{tab:DNS_address_class}.\footnote{esisteva in realt
     \const{C\_IN}   & indirizzi internet, in pratica i soli utilizzati oggi.\\
     \const{C\_HS}   & indirizzi \textit{Hesiod}, utilizzati solo al MIT, oggi
                       completamente estinti. \\
-    \const{C\_CHAOS}& indizzi per la rete \textit{Chaosnet}, un'altra rete
+    \const{C\_CHAOS}& indirizzi per la rete \textit{Chaosnet}, un'altra rete
                       sperimentale nata al MIT. \\
     \const{C\_ANY}  & indica un indirizzo di classe qualunque.\\
     \hline
@@ -1149,7 +1151,7 @@ aperto riporta la posizione di lettura alla prima voce del file, in questo
 modo si può far ricominciare da capo una lettura sequenziale. L'argomento
 \param{stayopen}, se diverso da zero, fa sì che il file resti aperto anche fra
 diverse chiamate a \func{getservbyname} e \func{getservbyaddr}.\footnote{di
-  default dopo una chiamata a queste funzioni il file viene chiuso, cosicchè
+  default dopo una chiamata a queste funzioni il file viene chiuso, cosicché
   una successiva chiamata a \func{getservent} riparte dall'inizio.}  La terza
 funzione, \funcd{endservent}, provvede semplicemente a chiudere il file.
 
@@ -1333,7 +1335,7 @@ bit della maschera.
                              \const{IN6ADDR\_ANY\_INIT} per IPv6), altrimenti
                              verrà usato l'indirizzo dell'interfaccia di
                              \textit{loopback}. Se invece non è impostato gli
-                             indirizzi verrano restituiti in formato adatto ad
+                             indirizzi verranno restituiti in formato adatto ad
                              una chiamata a \func{connect} o \func{sendto}.\\
     \const{AI\_CANONNAME}  & richiede la restituzione del nome canonico della
                              macchina, che verrà salvato in una stringa il cui
@@ -1492,7 +1494,7 @@ senza il quale si esce immediatamente stampando il relativo codice di errore.
 
 Se la funzione ha restituito un valore nullo il programma prosegue
 inizializzando (\texttt{\small 12}) il puntatore \var{ptr} che sarà usato nel
-sucessivo ciclo (\texttt{\small 14--35}) di scansione della lista delle
+successivo ciclo (\texttt{\small 14--35}) di scansione della lista delle
 strutture \struct{addrinfo} restituite dalla funzione. Prima di eseguire
 questa scansione (\texttt{\small 12}) viene stampato il valore del nome
 canonico che è presente solo nella prima struttura.
@@ -1936,7 +1938,7 @@ socket, mentre l'ultimo argomento \param{optlen},\footnote{questo argomento 
   sez.~\ref{sec:TCP_func_accept}) ed adottato dalle \acr{glibc}.} è la
 dimensione in byte dei dati presenti all'indirizzo indicato da \param{optval}.
 Dato che il tipo di dati varia a seconda dell'opzione scelta, occorrerà
-individuare qual'è quello che deve essere usato, ed utilizzare le opportune
+individuare qual è quello che deve essere usato, ed utilizzare le opportune
 variabili.
 
 La gran parte delle opzioni utilizzano per \param{optval} un valore intero, se
@@ -2070,15 +2072,15 @@ anche di trattare i vari casi particolari, dato che nonostante queste opzioni
 siano indicate al livello generico, alcune di esse han senso solo per alcuni
 tipi di socket. L'elenco dettagliato del significato di ciascuna di esse è
 allora il seguente:
-\begin{basedescript}{\desclabelwidth{3cm}\desclabelstyle{\nextlinelabel}}
-\item[\const{SO\_KEEPALIVE}] una connessione può restare attiva senza che non
-  debba essere effettuato nessun traffico su di essa; in in certi casi può
-  essere utile controllarne lo stato per accorgersi di eventuali problemi, per
-  questo, se si imposta questa opzione, è 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), ed utilizza per \param{optval} un intero usato come valore logico.
+\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
+\item[\const{SO\_KEEPALIVE}] una connessione può restare attiva se non viene
+  effettuato alcun traffico su di essa; in certi casi però può essere utile
+  controllarne lo stato per accorgersi di eventuali problemi. Per questo, se
+  si imposta questa opzione, è 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), ed utilizza per
+  \param{optval} un intero usato come valore logico. 
 
   L'opzione si applica principalmente ai socket TCP.  Con le impostazioni di
   default (che sono riprese da BSD) Linux emette un messaggio di
@@ -2087,17 +2089,17 @@ allora il seguente:
   ricevuto e verrà emesso un segmento ACK di risposta, alla cui ricezione
   ripartirà un'altro ciclo di attesa per altre due ore di inattività; tutto
   ciò viene effettuato dal kernel e le applicazioni non riceveranno nessun
-  dato.
+  dato. 
 
   In caso di problemi invece si possono avere i due casi già illustrati in
   sez.~\ref{sec:TCP_conn_crash} per il caso di terminazione prococe del
-  server: il primo è quello in cui la macchina remota non riconosce più la
-  connessione, ad esempio perché ha avuto un crollo ed è stata
-  riavviata,\footnote{si ricordi che un normale riavvio non ha questo effetto,
-    in quanto si passa per la chiusura del processo che invia un segmento FIN
-    all'altro capo della connessione.} per cui si otterrà come risposta un
-  RST. In tal caso il socket viene chiuso dopo aver impostato un errore
-  \errcode{ECONNRESET}.
+  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}.
 
   Se invece non viene ricevuta nessuna risposta (indice che la macchina non è
   più raggiungibile) l'emissione dei messaggi viene ripetuta ad intervalli di
@@ -2105,39 +2107,36 @@ allora il seguente:
     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
+    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}. Se invece si riceve in risposta ad uno di
-  questi messaggi un pacchetto ICMP di destinazione irraggiungibile verrà
-  restituito l'errore corrispondente.
-
-  In generale questa opzione serve per individuare un crash della macchina
-  all'altro capo 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; abilitandola le connessioni
-  effettivamente terminate vengono chiuse ed 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}.
-
+  questi messaggi un pacchetto ICMP di destinazione irraggiungibile, 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.  Abilitandola le connessioni effettivamente terminate
+  vengono chiuse ed 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}. 
 
 
 \item[\const{SO\_OOBINLINE}] se questa opzione viene abilitata i dati
   \textit{out-of-band} vengono inviati direttamente nel flusso di dati del
   socket (e sono quindi letti con una normale \func{read}) invece che restare
   disponibili solo per l'accesso con l'uso del flag \const{MSG\_OOB} di
-  \func{recvmsg}. Tratteremo l'argomento in dettaglio in
+  \func{recvmsg}. L'argomento è trattato in dettaglio in
   sez.~\ref{sec:TCP_urgent_data}. L'opzione funziona soltanto con socket che
   supportino i dati \textit{out-of-band} (non ha senso per socket UDP ad
   esempio), ed utilizza per \param{optval} un intero usato come valore logico.
 
 
-
 \item[\const{SO\_RCVLOWAT}] questa opzione imposta il valore che indica il
   numero minimo di byte che devono essere presenti nel buffer di ricezione
   perché il kernel passi i dati all'utente, restituendoli ad una \func{read} o
@@ -2145,7 +2144,7 @@ allora il seguente:
   sono dati in ingresso. L'opzione utilizza per \param{optval} un intero che
   specifica il numero di byte, ma con Linux questo valore è sempre 1 e non può
   essere cambiato; \func{getsockopt} leggerà questo valore mentre
-  \func{setsockopt} darà un errore di \errcode{ENOPROTOOPT}.
+  \func{setsockopt} darà un errore di \errcode{ENOPROTOOPT}. 
 
 
 \item[\const{SO\_SNDLOWAT}] questa opzione imposta il valore che indica il
@@ -2154,9 +2153,9 @@ allora il seguente:
   \func{write} di ritornare o segnalando ad una \func{select} (vedi
   sez.~\ref{sec:TCP_sock_select}) che è possibile eseguire una scrittura.
   L'opzione utilizza per \param{optval} un intero che specifica il numero di
-  byte, ma con Linux questo valore è sempre 1 e non può essere cambiato;
-  \func{getsockopt} leggerà questo valore mentre \func{setsockopt} darà un
-  errore di \errcode{ENOPROTOOPT}.
+  byte, come per la precedente \const{SO\_RCVLOWAT} con Linux questo valore è
+  sempre 1 e non può essere cambiato; \func{getsockopt} leggerà questo valore
+  mentre \func{setsockopt} darà un errore di \errcode{ENOPROTOOPT}.
 
 
 \item[\const{SO\_RCVTIMEO}] l'opzione permette di impostare un tempo massimo
@@ -2165,57 +2164,70 @@ allora il seguente:
   identica a quella usata con \func{select}. Con \func{getsockopt} si può
   leggere il valore attuale, mentre con \func{setsockopt} si imposta il tempo
   voluto, usando un valore nullo per \struct{timeval} il timeout viene
-  rimosso.
+  rimosso. 
 
   Se l'opzione viene attivata tutte le volte che una delle funzioni di lettura
   (\func{read}, \func{readv}, \func{recv}, \func{recvfrom} e \func{recvmsg})
   si blocca in attesa di dati per un tempo maggiore di quello impostato, essa
   ritornerà un valore -1 e la variabile \var{errno} sarà impostata con un
   errore di \errcode{EAGAIN} e \errcode{EWOULDBLOCK}, così come sarebbe
-  avvenuto se si fosse aperto il socket in modalità non bloccante.
+  avvenuto se si fosse aperto il socket in modalità non bloccante.\footnote{in
+    teoria, se il numero di byte presenti nel buffer di ricezione fosse
+    inferiore a quello specificato da \const{SO\_RCVLOWAT}, l'effetto potrebbe
+    essere semplicemente quello di provocare l'uscita delle funzioni di
+    lettura restituendo il numero di byte fino ad allora ricevuti; dato che
+    con Linux questo valore è sempre 1 questo caso non esiste.}
+
+  In genere questa opzione non è molto utilizzata se si ha a che fare con la
+  lettura dei dati, in quanto è sempre possibile usare una \func{select} che
+  consente di specificare un \textit{timeout}; l'uso di \func{select} non
+  consente però di impostare il timout per l'uso di \func{connect}, per avere
+  il quale si può ricorrere a questa opzione. 
+
+% verificare con un programma di test
 
 \item[\const{SO\_SNDTIMEO}] l'opzione permette di impostare un tempo massimo
   sulle operazioni di scrittura su un socket, ed usa gli stessi valori di
   \const{SO\_RCVTIMEO}.  In questo caso però si avrà un errore di
   \errcode{EAGAIN} o \errcode{EWOULDBLOCK} per le funzioni di scrittura
   \func{write}, \func{writev}, \func{send}, \func{sendfrom} e \func{sendmsg}
-  qualora queste restino bloccate per un tempo maggiore di quello specificato.
+  qualora queste restino bloccate per un tempo maggiore di quello specificato. 
 
 \item[\const{SO\_BSDCOMPAT}] questa opzione abilita la compatibilità con il
   comportamento di BSD (in particolare ne riproduce i bug).  Attualmente è una
   opzione usata solo per il protocollo UDP e ne è prevista la rimozione in
   futuro.  L'opzione utilizza per \param{optval} un intero usato come valore
-  logico.
+  logico. 
 
   Quando viene abilitata gli errori riportati da messaggi ICMP per un socket
   UDP non vengono passati al programma in user space. Con le versioni 2.0.x
   del kernel erano anche abilitate altre opzioni per i socket raw, che sono
   state rimosse con il passaggio al 2.2; è consigliato correggere i programmi
-  piuttosto che usare questa funzione.
+  piuttosto che usare questa funzione. 
 
-\item[\const{SO\_PASSCRED}] questa opzione abilita la ricezione dei messaggi
-  di controllo di tipo \const{SCM\_CREDENTIALS} dei socket unix-domain. Prende
-  per \param{optval} un intero usato come valore logico.
+\item[\const{SO\_PASSCRED}] questa opzione abilita sui socket unix-domain la
+  ricezione dei messaggi di controllo di tipo \const{SCM\_CREDENTIALS}. Prende
+  come \param{optval} un intero usato come valore logico. 
 
 \item[\const{SO\_PEERCRED}] questa opzione restituisce le credenziali del
   processo remoto connesso al socket; l'opzione è disponibile solo per socket
-  unix-domain e può essere usata solo con \func{getsockopt}.  Prende come
-  valore per \param{optval} una apposita struttura \struct{ucred} (vedi
-  sez.~\ref{sec:unix_socket_xxx}).
+  unix-domain e può essere usata solo con \func{getsockopt}.  Utilizza per
+  \param{optval} una apposita struttura \struct{ucred} (vedi
+  sez.~\ref{sec:unix_socket_xxx}). 
 
 \item[\const{SO\_BINDTODEVICE}] questa opzione permette di \textsl{legare} il
-  socket ad una particolare interfaccia interfaccia, in modo che esso possa
-  ricevere ed inviare pacchetti solo su quella. L'opzione richiede per
+  socket ad una particolare interfaccia, in modo che esso possa ricevere ed
+  inviare pacchetti solo su quella. L'opzione richiede per
   \param{optval} il puntatore ad una stringa contenente il nome
   dell'interfaccia (ad esempio \texttt{eth0}); se si utilizza una stringa
   nulla o un valore nullo per \param{optlen} si rimuove un precedente
-  collegamento.
+  collegamento. 
 
   Il nome della interfaccia deve essere specificato con una stringa terminata
   da uno zero e di lunghezza massima pari a \const{IFNAMSIZ}; l'opzione è
   effettiva solo per alcuni tipi di socket, ed in particolare per quelli della
   famiglia \const{AF\_INET}; non è invece supportata per i \textit{packet
-    socket} (vedi sez.~\ref{cha:advanced_socket_xxx}).
+    socket} (vedi sez.~\ref{cha:advanced_socket_xxx}). 
 
 
 \item[\const{SO\_DEBUG}] questa opzione abilita il debugging delle operazioni
@@ -2224,37 +2236,203 @@ allora il seguente:
   di amministratore (in particolare con la \textit{capability}
   \const{CAP\_NET\_ADMIN}).  L'opzione necessita inoltre dell'opportuno
   supporto nel kernel;\footnote{deve cioè essere definita la macro di
-    preprocessore \texttt{SOCK\_DEBUGGING} nel file \file{include/net/sock.h}
+    preprocessore \macro{SOCK\_DEBUGGING} nel file \file{include/net/sock.h}
     dei sorgenti del kernel, questo è sempre vero nei kernel delle serie
     superiori alla 2.3, per i kernel delle serie precedenti invece è
     necessario aggiungere a mano detta definizione; è inoltre possibile
     abilitare anche il tracciamento degli stati del TCP definendo la macro
-    \texttt{STATE\_TRACE} in \file{include/net/tcp.h}.}  quando viene
+    \macro{STATE\_TRACE} in \file{include/net/tcp.h}.}  quando viene
   abilitata una serie di messaggi con le informazioni di debug vengono inviati
   direttamente al sistema del kernel log.\footnote{si tenga presente che il
     comportamento è diverso da quanto avviene con BSD, dove l'opzione opera
-    solo sui socket TCP causando la scrittura di tutti i pacchetti inviati
+    solo sui socket TCP, causando la scrittura di tutti i pacchetti inviati
     sulla rete su un buffer circolare che viene letto da un apposito
-    programma, \cmd{trpt}.}
+    programma, \cmd{trpt}.} 
+
+\item[\const{SO\_REUSEADDR}] questa opzione permette di eseguire la funzione
+  \func{bind} su indirizzi locali che siano già in uso; l'opzione utilizza per
+  \param{optval} un intero usato come valore logico.  Questa opzione modifica
+  il comportamento normale dell'interfaccia dei socket che fa fallire
+  l'esecuzione della funzione \func{bind} con un errore di
+  \errcode{EADDRINUSE} quando l'indirizzo locale\footnote{più propriamente il
+    controllo viene eseguito sulla porta.} è già in uso da parte di un altro
+  socket. 
+
+  Come Stevens sottolinea in \cite{UNP1} si distinguono quattro casi per
+  l'utilizzo di questa opzione; il primo è quello in cui un server è terminato
+  ma esistono ancora dei processi figli che mantengono attiva almeno una
+  connessione remota che utilizza l'indirizzo locale; quando si riavvia il
+  server questo viene bloccato 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 in questa situazione quando si sta sviluppando
+    un server che si ferma e si riavvia in continuazione.}  Inoltre se si usa
+  il protocollo TCP questo può avvenire anche dopo che l'ultimo processo
+  figlio è terminato, dato che la connessione può restare attiva anche dopo la
+  chiusura del socket mantenendosi nello stato \texttt{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 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
+    indirizzi IP e le porte degli estremi della nuova connessione, ma anche i
+    numeri di sequenza dei pacchetti, e questo è estremamente improbabile.}
+  che eventuali pacchetti rimasti intrappolati in una precedente connessione
+  possano finire fra quelli di una nuova.
+
+  Il secondo caso in cui viene usata questa opzione è quando si ha una
+  macchina cui sono assegnati diversi numeri IP (o come suol dirsi
+  \textit{multi-homed}) e si vuole porre in ascolto sulla stessa porta un
+  programma diverso (o una istanza diversa dello stesso programma) per
+  indirizzi IP diversi. Si ricordi infatti che è sempre possibile indicare a
+  \func{bind} di collegarsi solo su di un indirizzo specifico; in tal caso se
+  un altro programma cerca di riutilizzare la stessa porta (anche specificando
+  un indirizzo diverso) otterrà un errore a meno di non aver preventivamente
+  impostato \const{SO\_REUSEADDR}. Usando questa opzione diventa anche
+  possibile eseguire \func{bind} sull'indirizzo generico, e questo permetterà
+  il collegamento per tutti gli indirizzi (di quelli presenti) per i quali la
+  porta non risulti occupata da una precedente chiamata più specifica. Infine
+  si tenga presente che con il protocollo TCP non è mai possibile far partire
+  server che eseguano \func{bind} sullo stesso indirizzo e la stessa porta,
+  cioè ottenere quello che viene chiamato un \textit{completely duplicate
+    binding}.
+
+  Il terzo impiego è simile al precedente e prevede l'uso di \func{bind}
+  all'interno dello stesso programma per associare indirizzi diversi a socket
+  diversi. Il meccanismo funziona fintanto che ciascuna chiamata usa degli
+  indirizzi remoti diversi. In genere questo viene fatto per i socket UDP, per
+  ottenere l'indirizzo remoto, sui sistemi per i quali non è diponibile
+  l'opzione \const{IP\_RECVDSTADDR}, non viene usata per TCP dato che su tali
+  socket si può sempre invocare \func{getsockname} una volta che si è
+  completata la connessione.
 
-\item[\const{SO\_REUSEADDR}]  
 
 \item[\const{SO\_TYPE}] questa opzione permette di leggere il tipo di socket
   su cui si opera; funziona solo con \func{getsockopt}, ed utilizza per
-  \param{optval} un valore intero in cui verrà restituto il valore numerico
-  che lo identifica (ad esempio \const{SOCK\_STREAM}).
-
-\item[\const{SO\_ACCEPTCONN}]
-\item[\const{SO\_DONTROUTE}]
-\item[\const{SO\_BROADCAST}]
-\item[\const{SO\_SNDBUF}]
-\item[\const{SO\_RCVBUF}]  
-\item[\const{SO\_LINGER}]  
-\item[\const{SO\_PRIORITY}]
-\item[\const{SO\_ERROR}]
+  \param{optval} un intero in cui verrà restituto il valore numerico che lo
+  identifica (ad esempio \const{SOCK\_STREAM}). 
+
+\item[\const{SO\_ACCEPTCONN}] questa opzione permette di rilevare se il socket
+  su cui opera è stato posto in modalità di ricezione di eventuali connessioni
+  con una chiamata a \func{listen}. L'opzione può essere usata soltanto con
+  \func{getsockopt} e utilizza per \param{optval} un intero in cui viene
+  restituito 1 se il socket è in ascolto e 0 altrimenti. 
+
+\item[\const{SO\_DONTROUTE}] questa opzione forza l'invio diretto dei
+  pacchetti del socket, saltando ogni processo relativo all'uso della tabella
+  di routing del kernel. Prende per \param{optval} un intero usato come valore
+  logico.
+
+\item[\const{SO\_BROADCAST}] questa opzione abilita il \textit{broadcast};
+  quanto abilitata i socket di tipo \const{SOCK\_DGRAM} riceveranno i
+  pacchetti inviati all'indirizzo di broadcast, e potranno scrivere pacchetti
+  su tale indirizzo.  Prende per \param{optval} un intero usato come valore
+  logico. L'opzione non ha effetti su un socket di tipo \const{SOCK\_STREAM}.
+
+
+\item[\const{SO\_SNDBUF}] questa opzione imposta la dimenzione del buffer di
+  uscita del socket. Prende per \param{optval} un intero indicante il numero
+  di byte. Il valore di default ed il valore massimo che si può specificare
+  come argomento per questa opzione sono impostabili tramiti gli opportuni
+  valori di \func{sysctl} (vedi sez.~\ref{sec:sock_sysctl}).
+
+
+\item[\const{SO\_RCVBUF}] questa opzione imposta la dimenzione del buffer di
+  ingresso del socket. Prende per \param{optval} un intero indicante il numero
+  di byte. Il valore di default ed il valore massimo che si può specificare
+  come argomento per questa opzione sono impostabili tramiti gli opportuni
+  valori di \func{sysctl} (vedi sez.~\ref{sec:sock_sysctl}).
+
+
+\item[\const{SO\_LINGER}] 
+
+\item[\const{SO\_PRIORITY}] questa opzione permette di impostare le priorità
+  per tutti i pacchetti che sono inviati sul socket, prende per \param{optval}
+  un valore intero. Con questa opzione il kernel usa il valore per ordinare le
+  priorità sulle code di rete,\footnote{questo richiede che sia abilitato il
+    sistema di \textit{Quality of Service} disponibile con le opzioni di
+    routing avanzato.} i pacchetti con priorità più alta vengono processati
+  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}.
+
+\item[\const{SO\_ERROR}] questa opzione riceve un errore presente sul socket;
+  può essere utilizzata soltanto con \func{getsockopt} e prende per
+  \param{optval} un valore intero.  
 \end{basedescript}
 
 
+\subsection{Le opzioni per il protocollo IPv4}
+\label{sec:sock_ipv4_options}
+
+Il secondo insieme di opzioni dei socket che tratteremo è quello relativo ai
+socket che usano il protocollo IPv4.\footnote{come per le precedenti opzioni
+  generiche una descrizione di esse è disponibile nella settima sezione delle
+  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}.
+
+
+\begin{table}[!htb]
+  \centering
+  \footnotesize
+  \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{IP\_OPTIONS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+                          .\\
+    \const{IP\_PKTINFO}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+                          .\\
+    \const{IP\_RECVTOS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+                          .\\
+    \const{IP\_RECVTTL}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+                          .\\
+    \const{IP\_RECVOPTS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+                          .\\
+    \const{IP\_RETOPTS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+                          .\\
+    \const{IP\_TOS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+                          .\\
+    \const{IP\_TTL}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+                          .\\
+    \const{IP\_HDRINCL}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+                          .\\
+    \const{IP\_RECVERR}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+                          .\\
+    \const{IP\_MTU\_DISCOVER}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+                          .\\
+    \const{IP\_MTU}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+                          .\\
+    \const{IP\_ROUTER\_ALERT}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+                          .\\
+    \const{IP\_MULTICAST\_TTL}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+                          .\\
+    \const{IP\_MULTICAST\_LOOP}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+                          .\\
+    \const{IP\_ADD\_MEMBERSHIP}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+                          .\\
+    \const{IP\_DROP\_MEMBERSHIP}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+                          .\\
+    \const{IP\_MULTICAST\_IF}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+                          .\\
+   \hline
+  \end{tabular}
+  \caption{Le opzioni disponibili al livello \const{SOL\_IP}.} 
+  \label{tab:sock_opt_iplevel}
+\end{table}
+
+
+
 
 
 \section{Altre funzioni di controllo}
@@ -2273,7 +2451,7 @@ classiche per il controllo delle propriet
 Abbiamo già trattato l'uso di \func{fcntl} in sez.~\ref{sec:file_fcntl}, dove
 però ne abbiamo descritto le funzionalità nell'ambito della sua applicazione a
 file descriptor associati a file normali; tratteremo qui invece il suo uso
-specifico quando la si impiega su file descriptor associati a dei socket.
+specifico quando la si impiega su file descriptor associati a dei socket. 
 
 
 \subsection{L'uso di \func{ioctl} per i socket}
@@ -2282,7 +2460,7 @@ specifico quando la si impiega su file descriptor associati a dei socket.
 Come per \func{fcntl} abbiamo trattato l'uso di \func{ioctl} in
 sez.~\ref{sec:file_ioctl}, dove ne abbiamo descritto le funzionalità
 nell'ambito dell'applicazione su file normali; tratteremo qui il suo uso
-specifico quando la si impiega su file descriptor associati a dei socket.
+specifico quando la si impiega su file descriptor associati a dei socket. 
 
 
 \subsection{L'uso di \func{sysctl} per le proprietà della rete}
@@ -2294,9 +2472,47 @@ sez.~\ref{sec:sys_sysctl}) per quanto riguarda le sue capacit
 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.
-
+socket. 
+
+Le opzioni disponibili per le proprietà della rete sono riportate nella
+gerarchia dei valori impostabili con \func{sysctl}, sotto il nodo
+\texttt{net}, o, se acceduti tramite l'interfaccia del filesystem
+\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:
+\begin{verbatim}
+/proc/sys/net/
+|-- core
+|-- ethernet
+|-- ipv4
+|-- ipv6
+|-- irda
+|-- token-ring
+`-- unix
+\end{verbatim}
+
+
+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:
 
+\begin{basedescript}{\desclabelwidth{3cm}\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}] 
+\item[\texttt{message\_burst}] 
+\item[\texttt{netdev\_max\_backlog}] 
+\item[\texttt{optmem\_max}] 
+\end{basedescript}
 
 
 %%% Local Variables: