Le impostazioni e lo stato del \textit{resolver} vengono mantenuti in una
serie di variabili raggruppate nei campi di una apposita struttura \var{\_res}
-usata da tutte queste funzioni. Essa viene definita in \headfile{resolv.h} ed
+usata da tutte queste funzioni. Essa viene definita in \headfiled{resolv.h} ed
è utilizzata internamente alle funzioni essendo definita come variabile
globale; questo consente anche di accedervi direttamente all'interno di un
qualunque programma, una volta che la sia opportunamente dichiarata come:
\textbf{Costante} & \textbf{Significato} \\
\hline
\hline
- \const{RES\_INIT} & Viene attivato se è stata chiamata
- \func{res\_init}. \\
- \const{RES\_DEBUG} & Stampa dei messaggi di debug.\\
- \const{RES\_AAONLY} & Accetta solo risposte autoritative.\\
- \const{RES\_USEVC} & Usa connessioni TCP per contattare i server
- invece che l'usuale UDP.\\
- \const{RES\_PRIMARY} & Interroga soltanto server DNS primari.
- \\
- \const{RES\_IGNTC} & Ignora gli errori di troncamento, non ritenta la
- richiesta con una connessione TCP.\\
- \const{RES\_RECURSE} & Imposta il bit che indica che si desidera
- eseguire una interrogazione ricorsiva.\\
- \const{RES\_DEFNAMES} & Se attivo \func{res\_search} aggiunge il nome
- del dominio di default ai nomi singoli (che non
- contengono cioè un ``\texttt{.}'').\\
- \const{RES\_STAYOPEN} & Usato con \const{RES\_USEVC} per mantenere
- aperte le connessioni TCP fra interrogazioni
- diverse. \\
- \const{RES\_DNSRCH} & Se attivo \func{res\_search} esegue le ricerche
- di nomi di macchine nel dominio corrente o nei
- domini ad esso sovrastanti.\\
- \const{RES\_INSECURE1} & Blocca i controlli di sicurezza di tipo 1.\\
- \const{RES\_INSECURE2} & Blocca i controlli di sicurezza di tipo 2.\\
- \const{RES\_NOALIASES} & Blocca l'uso della variabile di ambiente
- \envvar{HOSTALIASES}.\\
- \const{RES\_USE\_INET6} & Restituisce indirizzi IPv6 con
- \func{gethostbyname}. \\
- \const{RES\_ROTATE} & Ruota la lista dei server DNS dopo ogni
- interrogazione.\\
- \const{RES\_NOCHECKNAME}& Non controlla i nomi per verificarne la
- correttezza sintattica. \\
- \const{RES\_KEEPTSIG} & Non elimina i record di tipo \texttt{TSIG}.\\
- \const{RES\_BLAST} & Effettua un ``\textit{blast}'' inviando
- simultaneamente le richieste a tutti i server;
- non ancora implementata. \\
- \const{RES\_DEFAULT} & Combinazione di \const{RES\_RECURSE},
- \const{RES\_DEFNAMES} e \const{RES\_DNSRCH}.\\
+ \constd{RES\_INIT} & Viene attivato se è stata chiamata
+ \func{res\_init}. \\
+ \constd{RES\_DEBUG} & Stampa dei messaggi di debug.\\
+ \constd{RES\_AAONLY} & Accetta solo risposte autoritative.\\
+ \constd{RES\_USEVC} & Usa connessioni TCP per contattare i server
+ invece che l'usuale UDP.\\
+ \constd{RES\_PRIMARY} & Interroga soltanto server DNS primari.
+ \\
+ \constd{RES\_IGNTC} & Ignora gli errori di troncamento, non ritenta la
+ richiesta con una connessione TCP.\\
+ \constd{RES\_RECURSE} & Imposta il bit che indica che si desidera
+ eseguire una interrogazione ricorsiva.\\
+ \constd{RES\_DEFNAMES} & Se attivo \func{res\_search} aggiunge il nome
+ del dominio di default ai nomi singoli (che non
+ contengono cioè un ``\texttt{.}'').\\
+ \constd{RES\_STAYOPEN} & Usato con \const{RES\_USEVC} per mantenere
+ aperte le connessioni TCP fra interrogazioni
+ diverse. \\
+ \constd{RES\_DNSRCH} & Se attivo \func{res\_search} esegue le ricerche
+ di nomi di macchine nel dominio corrente o nei
+ domini ad esso sovrastanti.\\
+ \constd{RES\_INSECURE1} & Blocca i controlli di sicurezza di tipo 1.\\
+ \constd{RES\_INSECURE2} & Blocca i controlli di sicurezza di tipo 2.\\
+ \constd{RES\_NOALIASES} & Blocca l'uso della variabile di ambiente
+ \envvar{HOSTALIASES}.\\
+ \constd{RES\_USE\_INET6} & Restituisce indirizzi IPv6 con
+ \func{gethostbyname}. \\
+ \constd{RES\_ROTATE} & Ruota la lista dei server DNS dopo ogni
+ interrogazione.\\
+ \constd{RES\_NOCHECKNAME}& Non controlla i nomi per verificarne la
+ correttezza sintattica. \\
+ \constd{RES\_KEEPTSIG} & Non elimina i record di tipo \texttt{TSIG}.\\
+ \constd{RES\_BLAST} & Effettua un ``\textit{blast}'' inviando
+ simultaneamente le richieste a tutti i server;
+ non ancora implementata. \\
+ \constd{RES\_DEFAULT} & Combinazione di \const{RES\_RECURSE},
+ \const{RES\_DEFNAMES} e \const{RES\_DNSRCH}.\\
\hline
\end{tabular}
\caption{Costanti utilizzabili come valori per \var{\_res.options}.}
costanti che identificano dette classi, da usare come valore per l'argomento
\param{class} delle precedenti funzioni, sono riportate in
tab.~\ref{tab:DNS_address_class}.\footnote{esisteva in realtà anche una classe
- \const{C\_CSNET} per la omonima rete, ma è stata dichiarata obsoleta.}
+ \constd{C\_CSNET} per la omonima rete, ma è stata dichiarata obsoleta.}
\begin{table}[htb]
\centering
\textbf{Costante} & \textbf{Significato} \\
\hline
\hline
- \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}& Indirizzi per la rete \textit{Chaosnet}, un'altra rete
- sperimentale nata al MIT. \\
- \const{C\_ANY} & Indica un indirizzo di classe qualunque.\\
+ \constd{C\_IN} & Indirizzi internet, in pratica i soli utilizzati oggi.\\
+ \constd{C\_HS} & Indirizzi \textit{Hesiod}, utilizzati solo al MIT, oggi
+ completamente estinti. \\
+ \constd{C\_CHAOS}& Indirizzi per la rete \textit{Chaosnet}, un'altra rete
+ sperimentale nata al MIT. \\
+ \constd{C\_ANY} & Indica un indirizzo di classe qualunque.\\
\hline
\end{tabular}
\caption{Costanti identificative delle classi di indirizzi per l'argomento
Come accennato le tipologie di dati che sono mantenibili su un server DNS sono
diverse, ed a ciascuna di essa corrisponde un diverso tipo di \textit{resource
- record}. L'elenco delle costanti\footnote{ripreso dai file di dichiarazione
- \headfile{arpa/nameser.h} e \headfile{arpa/nameser\_compat.h}.} che
+ record}. L'elenco delle costanti, ripreso dai file di dichiarazione
+ \headfiled{arpa/nameser.h} e \headfiled{arpa/nameser\_compat.h}, che
definiscono i valori che si possono usare per l'argomento \param{type} per
specificare il tipo di \textit{resource record} da richiedere è riportato in
tab.~\ref{tab:DNS_record_type}; le costanti (tolto il \texttt{T\_} iniziale)
\textbf{Costante} & \textbf{Significato} \\
\hline
\hline
- \const{T\_A} & Indirizzo di una stazione.\\
- \const{T\_NS} & Server DNS autoritativo per il dominio richiesto.\\
- \const{T\_MD} & Destinazione per la posta elettronica.\\
- \const{T\_MF} & Redistributore per la posta elettronica.\\
- \const{T\_CNAME} & Nome canonico.\\
- \const{T\_SOA} & Inizio di una zona di autorità.\\
- \const{T\_MB} & Nome a dominio di una casella di posta.\\
- \const{T\_MG} & Nome di un membro di un gruppo di posta.\\
- \const{T\_MR} & Nome di un cambiamento di nome per la posta.\\
- \const{T\_NULL} & Record nullo.\\
- \const{T\_WKS} & Servizio noto.\\
- \const{T\_PTR} & Risoluzione inversa di un indirizzo numerico.\\
- \const{T\_HINFO} & Informazione sulla stazione.\\
- \const{T\_MINFO} & Informazione sulla casella di posta.\\
- \const{T\_MX} & Server cui instradare la posta per il dominio.\\
- \const{T\_TXT} & Stringhe di testo (libere).\\
- \const{T\_RP} & Nome di un responsabile (\textit{responsible person}).\\
- \const{T\_AFSDB} & Database per una cella AFS.\\
- \const{T\_X25} & Indirizzo di chiamata per X.25.\\
- \const{T\_ISDN} & Indirizzo di chiamata per ISDN.\\
- \const{T\_RT} & Router.\\
- \const{T\_NSAP} & Indirizzo NSAP.\\
- \const{T\_NSAP\_PTR}& Risoluzione inversa per NSAP (deprecato).\\
- \const{T\_SIG} & Firma digitale di sicurezza.\\
- \const{T\_KEY} & Chiave per firma.\\
- \const{T\_PX} & Corrispondenza per la posta X.400.\\
- \const{T\_GPOS} & Posizione geografica.\\
- \const{T\_AAAA} & Indirizzo IPv6.\\
- \const{T\_LOC} & Informazione di collocazione.\\
- \const{T\_NXT} & Dominio successivo.\\
- \const{T\_EID} & Identificatore di punto conclusivo.\\
- \const{T\_NIMLOC}& Posizionatore \textit{nimrod}.\\
- \const{T\_SRV} & Servizio.\\
- \const{T\_ATMA} & Indirizzo ATM.\\
- \const{T\_NAPTR} & Puntatore ad una \textit{naming authority}.\\
- \const{T\_TSIG} & Firma di transazione.\\
- \const{T\_IXFR} & Trasferimento di zona incrementale.\\
- \const{T\_AXFR} & Trasferimento di zona di autorità.\\
- \const{T\_MAILB} & Trasferimento di record di caselle di posta.\\
- \const{T\_MAILA} & Trasferimento di record di server di posta.\\
- \const{T\_ANY} & Valore generico.\\
+ \constd{T\_A} & Indirizzo di una stazione.\\
+ \constd{T\_NS} & Server DNS autoritativo per il dominio richiesto.\\
+ \constd{T\_MD} & Destinazione per la posta elettronica.\\
+ \constd{T\_MF} & Redistributore per la posta elettronica.\\
+ \constd{T\_CNAME} & Nome canonico.\\
+ \constd{T\_SOA} & Inizio di una zona di autorità.\\
+ \constd{T\_MB} & Nome a dominio di una casella di posta.\\
+ \constd{T\_MG} & Nome di un membro di un gruppo di posta.\\
+ \constd{T\_MR} & Nome di un cambiamento di nome per la posta.\\
+ \constd{T\_NULL} & Record nullo.\\
+ \constd{T\_WKS} & Servizio noto.\\
+ \constd{T\_PTR} & Risoluzione inversa di un indirizzo numerico.\\
+ \constd{T\_HINFO} & Informazione sulla stazione.\\
+ \constd{T\_MINFO} & Informazione sulla casella di posta.\\
+ \constd{T\_MX} & Server cui instradare la posta per il dominio.\\
+ \constd{T\_TXT} & Stringhe di testo (libere).\\
+ \constd{T\_RP} & Nome di un responsabile (\textit{responsible person}).\\
+ \constd{T\_AFSDB} & Database per una cella AFS.\\
+ \constd{T\_X25} & Indirizzo di chiamata per X.25.\\
+ \constd{T\_ISDN} & Indirizzo di chiamata per ISDN.\\
+ \constd{T\_RT} & Router.\\
+ \constd{T\_NSAP} & Indirizzo NSAP.\\
+ \constd{T\_NSAP\_PTR}& Risoluzione inversa per NSAP (deprecato).\\
+ \constd{T\_SIG} & Firma digitale di sicurezza.\\
+ \constd{T\_KEY} & Chiave per firma.\\
+ \constd{T\_PX} & Corrispondenza per la posta X.400.\\
+ \constd{T\_GPOS} & Posizione geografica.\\
+ \constd{T\_AAAA} & Indirizzo IPv6.\\
+ \constd{T\_LOC} & Informazione di collocazione.\\
+ \constd{T\_NXT} & Dominio successivo.\\
+ \constd{T\_EID} & Identificatore di punto conclusivo.\\
+ \constd{T\_NIMLOC}& Posizionatore \textit{nimrod}.\\
+ \constd{T\_SRV} & Servizio.\\
+ \constd{T\_ATMA} & Indirizzo ATM.\\
+ \constd{T\_NAPTR} & Puntatore ad una \textit{naming authority}.\\
+ \constd{T\_TSIG} & Firma di transazione.\\
+ \constd{T\_IXFR} & Trasferimento di zona incrementale.\\
+ \constd{T\_AXFR} & Trasferimento di zona di autorità.\\
+ \constd{T\_MAILB} & Trasferimento di record di caselle di posta.\\
+ \constd{T\_MAILA} & Trasferimento di record di server di posta.\\
+ \constd{T\_ANY} & Valore generico.\\
\hline
\end{tabular}
\caption{Costanti identificative del tipo di record per l'argomento
\textbf{Costante} & \textbf{Significato} \\
\hline
\hline
- \const{HOST\_NOT\_FOUND} & L'indirizzo richiesto non è valido e la
+ \constd{HOST\_NOT\_FOUND}& L'indirizzo richiesto non è valido e la
macchina indicata è sconosciuta.\\
- \const{NO\_ADDRESS} & Il nome a dominio richiesto è valido, ma non ha
+ \constd{NO\_ADDRESS} & Il nome a dominio richiesto è valido, ma non ha
un indirizzo associato ad esso
(alternativamente può essere indicato come
- \const{NO\_DATA}).\\
- \const{NO\_RECOVERY} & Si è avuto un errore non recuperabile
+ \constd{NO\_DATA}).\\
+ \constd{NO\_RECOVERY} & Si è avuto un errore non recuperabile
nell'interrogazione di un server DNS.\\
- \const{TRY\_AGAIN} & Si è avuto un errore temporaneo
+ \constd{TRY\_AGAIN} & Si è avuto un errore temporaneo
nell'interrogazione di un server DNS, si può
ritentare l'interrogazione in un secondo
tempo.\\
\subsection{La risoluzione dei nomi a dominio}
\label{sec:sock_name_services}
-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
-scopo è ottenere l'indirizzo di una stazione noto il suo nome a dominio, il
-suo prototipo è:
+La principale funzionalità del \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 scopo è ottenere l'indirizzo di
+una stazione noto il suo nome a dominio, il suo prototipo è:
\begin{prototype}{netdb.h}
{struct hostent *gethostbyname(const char *name)}
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
-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 è:
+modificare le opzioni del \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 è:
\begin{functions}
\headdecl{netdb.h}
\headdecl{sys/socket.h}
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
-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.
+programma che esegue una semplice interrogazione al \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.
Il programma richiede un solo argomento che specifichi il nome da cercare,
senza il quale (\texttt{\small 15--18}) esce con un errore. Dopo di che
\textbf{Costante} & \textbf{Significato} \\
\hline
\hline
- \const{AI\_V4MAPPED} & Usato con \const{AF\_INET6} per richiedere una
- ricerca su un indirizzo IPv4 invece che IPv6; gli
- eventuali risultati saranno rimappati su indirizzi
- IPv6.\\
- \const{AI\_ALL} & Usato con \const{AI\_V4MAPPED}; richiede sia
- indirizzi IPv4 che IPv6, e gli indirizzi IPv4
- saranno rimappati in IPv6.\\
- \const{AI\_ADDRCONFIG}& Richiede che una richiesta IPv4 o IPv6 venga
- eseguita solo se almeno una interfaccia del
- sistema è associata ad un indirizzo di tale tipo.\\
- \const{AI\_DEFAULT} & Il valore di default, è equivalente alla
- combinazione di \const{AI\_ADDRCONFIG} e di
- \const{AI\_V4MAPPED}.\\
+ \constd{AI\_V4MAPPED} & Usato con \const{AF\_INET6} per richiedere una
+ ricerca su un indirizzo IPv4 invece che IPv6; gli
+ eventuali risultati saranno rimappati su indirizzi
+ IPv6.\\
+ \constd{AI\_ALL} & Usato con \const{AI\_V4MAPPED}; richiede sia
+ indirizzi IPv4 che IPv6, e gli indirizzi IPv4
+ saranno rimappati in IPv6.\\
+ \constd{AI\_ADDRCONFIG}& Richiede che una richiesta IPv4 o IPv6 venga
+ eseguita solo se almeno una interfaccia del
+ sistema è associata ad un indirizzo di tale tipo.\\
+ \constd{AI\_DEFAULT} & Il valore di default, è equivalente alla
+ combinazione di \const{AI\_ADDRCONFIG} e di
+ \const{AI\_V4MAPPED}.\\
\hline
\end{tabular}
\caption{Valori possibili per i bit dell'argomento \param{flags} della
diverse chiamate a \func{getservbyname} e \func{getservbyport}.\footnote{di
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.
+funzione, \func{endservent}, provvede semplicemente a chiudere il file.
Queste tre funzioni per la lettura sequenziale di nuovo sono presenti per
ciascuno dei vari tipi di informazione relative alle reti di
i propri risultati. La funzione infatti è 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 \struct{addrinfo} contenenti tutte le informazioni ottenute.
+puntatore iniziale ad una \textit{linked list} di strutture di tipo
+\struct{addrinfo} contenenti tutte le informazioni ottenute.
\begin{figure}[!htb]
\footnotesize \centering
\label{fig:sock_addrinfo_struct}
\end{figure}
-Come illustrato la struttura \struct{addrinfo}, la cui definizione\footnote{la
- definizione è ripresa direttamente dal file \headfile{netdb.h} in questa
- struttura viene dichiarata, la pagina di manuale riporta \type{size\_t} come
- tipo di dato per il campo \var{ai\_addrlen}, qui viene usata quanto previsto
- dallo standard POSIX, in cui viene utilizzato \type{socklen\_t}; i due tipi
- di dati sono comunque equivalenti.} è riportata in
-fig.~\ref{fig:sock_addrinfo_struct}, viene usata sia in ingresso, per passare
-dei valori di controllo alla funzione, che in uscita, per ricevere i
-risultati. Il primo campo, \var{ai\_flags}, è una maschera binaria di bit che
+Come illustrato la struttura \struct{addrinfo}, la cui definizione è riportata
+in fig.~\ref{fig:sock_addrinfo_struct}, viene usata sia in ingresso, per
+passare dei valori di controllo alla funzione, che in uscita, per ricevere i
+risultati. La definizione è ripresa direttamente dal file \headfiled{netdb.h}
+in questa struttura viene dichiarata, la pagina di manuale riporta
+\type{size\_t} come tipo di dato per il campo \var{ai\_addrlen}, qui viene
+usata quanto previsto dallo standard POSIX, in cui viene utilizzato
+\type{socklen\_t}; i due tipi di dati sono comunque equivalenti.
+
+Il primo campo, \var{ai\_flags}, è una maschera binaria di bit che
permettono di controllare le varie modalità di risoluzione degli indirizzi,
che viene usato soltanto in ingresso. I tre campi successivi \var{ai\_family},
\var{ai\_socktype}, e \var{ai\_protocol} contengono rispettivamente la
\textbf{Costante} & \textbf{Significato} \\
\hline
\hline
- \const{AI\_PASSIVE} & Viene utilizzato per ottenere un indirizzo in
- formato adatto per una successiva chiamata a
- \func{bind}. Se specificato quando si è usato
- \val{NULL} come valore per \param{node} gli
- indirizzi restituiti saranno inizializzati al
- valore generico (\const{INADDR\_ANY} per IPv4 e
- \const{IN6ADDR\_ANY\_INIT} per IPv6), altrimenti
- verrà usato l'indirizzo dell'interfaccia di
- \textit{loopback}. Se invece non è impostato gli
- 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
- indirizzo sarà restituito nel campo
- \var{ai\_canonname} della prima struttura
- \struct{addrinfo} dei risultati. Se il nome
- canonico non è disponibile al suo posto
- viene restituita una copia di \param{node}. \\
- \const{AI\_NUMERICHOST}& Se impostato il nome della macchina specificato
- con \param{node} deve essere espresso in forma
- numerica, altrimenti sarà restituito un errore
- \const{EAI\_NONAME} (vedi
- tab.~\ref{tab:addrinfo_error_code}), in questo
- modo si evita ogni chiamata alle funzioni di
- risoluzione.\\
+ \constd{AI\_PASSIVE} & Viene utilizzato per ottenere un indirizzo in
+ formato adatto per una successiva chiamata a
+ \func{bind}. Se specificato quando si è usato
+ \val{NULL} come valore per \param{node} gli
+ indirizzi restituiti saranno inizializzati al
+ valore generico (\const{INADDR\_ANY} per IPv4 e
+ \const{IN6ADDR\_ANY\_INIT} per IPv6), altrimenti
+ verrà usato l'indirizzo dell'interfaccia di
+ \textit{loopback}. Se invece non è impostato gli
+ indirizzi verranno restituiti in formato adatto ad
+ una chiamata a \func{connect} o \func{sendto}.\\
+ \constd{AI\_CANONNAME} & Richiede la restituzione del nome canonico della
+ macchina, che verrà salvato in una stringa il cui
+ indirizzo sarà restituito nel campo
+ \var{ai\_canonname} della prima struttura
+ \struct{addrinfo} dei risultati. Se il nome
+ canonico non è disponibile al suo posto
+ viene restituita una copia di \param{node}. \\
+ \constd{AI\_NUMERICHOST}& Se impostato il nome della macchina specificato
+ con \param{node} deve essere espresso in forma
+ numerica, altrimenti sarà restituito un errore
+ \const{EAI\_NONAME} (vedi
+ tab.~\ref{tab:addrinfo_error_code}), in questo
+ modo si evita ogni chiamata alle funzioni di
+ risoluzione.\\
\const{AI\_V4MAPPED} & Stesso significato dell'analoga di
- tab.~\ref{tab:sock_getipnodebyname_flags}.\\
+ tab.~\ref{tab:sock_getipnodebyname_flags}.\\
\const{AI\_ALL} & Stesso significato dell'analoga di
- tab.~\ref{tab:sock_getipnodebyname_flags}.\\
+ tab.~\ref{tab:sock_getipnodebyname_flags}.\\
\const{AI\_ADDRCONFIG} & Stesso significato dell'analoga di
- tab.~\ref{tab:sock_getipnodebyname_flags}.\\
+ tab.~\ref{tab:sock_getipnodebyname_flags}.\\
\hline
\end{tabular}
\caption{Costanti associate ai bit del campo \var{ai\_flags} della struttura
\textbf{Costante} & \textbf{Significato} \\
\hline
\hline
- \const{EAI\_FAMILY} & La famiglia di indirizzi richiesta non è
- supportata. \\
- \const{EAI\_SOCKTYPE}& Il tipo di socket richiesto non è supportato. \\
- \const{EAI\_BADFLAGS}& Il campo \var{ai\_flags} contiene dei valori non
- validi. \\
- \const{EAI\_NONAME} & Il nome a dominio o il servizio non sono noti,
- viene usato questo errore anche quando si specifica
- il valore \val{NULL} per entrambi gli argomenti
- \param{node} e \param{service}. \\
- \const{EAI\_SERVICE} & Il servizio richiesto non è disponibile per il tipo
- di socket richiesto, anche se può esistere per
- altri tipi di socket. \\
- \const{EAI\_ADDRFAMILY}& La rete richiesta non ha nessun indirizzo di rete
- per la famiglia di indirizzi specificata. \\
- \const{EAI\_NODATA} & La macchina specificata esiste, ma non ha nessun
- indirizzo di rete definito. \\
- \const{EAI\_MEMORY} & È stato impossibile allocare la memoria necessaria
- alle operazioni. \\
- \const{EAI\_FAIL} & Il DNS ha restituito un errore di risoluzione
- permanente. \\
- \const{EAI\_AGAIN} & Il DNS ha restituito un errore di risoluzione
- temporaneo, si può ritentare in seguito. \\
- \const{EAI\_SYSTEM} & C'è stato un errore di sistema, si può controllare
- \var{errno} per i dettagli. \\
+ \constd{EAI\_FAMILY} & La famiglia di indirizzi richiesta non è
+ supportata. \\
+ \constd{EAI\_SOCKTYPE}& Il tipo di socket richiesto non è supportato. \\
+ \constd{EAI\_BADFLAGS}& Il campo \var{ai\_flags} contiene dei valori non
+ validi. \\
+ \constd{EAI\_NONAME} & Il nome a dominio o il servizio non sono noti,
+ viene usato questo errore anche quando si specifica
+ il valore \val{NULL} per entrambi gli argomenti
+ \param{node} e \param{service}. \\
+ \constd{EAI\_SERVICE} & Il servizio richiesto non è disponibile per il tipo
+ di socket richiesto, anche se può esistere per
+ altri tipi di socket. \\
+ \constd{EAI\_ADDRFAMILY}& La rete richiesta non ha nessun indirizzo di rete
+ per la famiglia di indirizzi specificata. \\
+ \constd{EAI\_NODATA} & La macchina specificata esiste, ma non ha nessun
+ indirizzo di rete definito. \\
+ \constd{EAI\_MEMORY} & È stato impossibile allocare la memoria necessaria
+ alle operazioni. \\
+ \constd{EAI\_FAIL} & Il DNS ha restituito un errore di risoluzione
+ permanente. \\
+ \constd{EAI\_AGAIN} & Il DNS ha restituito un errore di risoluzione
+ temporaneo, si può ritentare in seguito. \\
+ \constd{EAI\_SYSTEM} & C'è stato un errore di sistema, si può controllare
+ \var{errno} per i dettagli. \\
% \hline
% TODO estensioni GNU, trovarne la documentazione
-% \const{EAI\_INPROGRESS}& Richiesta in corso. \\
-% \const{EAI\_CANCELED}& La richiesta è stata cancellata.\\
-% \const{EAI\_NOTCANCELED}& La richiesta non è stata cancellata. \\
-% \const{EAI\_ALLDONE} & Tutte le richieste sono complete. \\
-% \const{EAI\_INTR} & Richiesta interrotta. \\
+% \constd{EAI\_INPROGRESS}& Richiesta in corso. \\
+% \constd{EAI\_CANCELED}& La richiesta è stata cancellata.\\
+% \constd{EAI\_NOTCANCELED}& La richiesta non è stata cancellata. \\
+% \constd{EAI\_ALLDONE} & Tutte le richieste sono complete. \\
+% \constd{EAI\_INTR} & Richiesta interrotta. \\
\hline
\end{tabular}
\caption{Costanti associate ai valori dei codici di errore della funzione
\begin{figure}[!htb]
\centering
\includegraphics[width=10cm]{img/addrinfo_list}
- \caption{La \itindex{linked~list} \textit{linked list} delle strutture
- \struct{addrinfo} restituite da \func{getaddrinfo}.}
+ \caption{La \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
-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
-dell'argomento \var{hints} per restringere le ricerche su protocolli, tipi di
-socket o famiglie di indirizzi, è disponibile nel file \texttt{mygetaddr.c}
-dei sorgenti allegati alla guida.
+elementare di interrogazione del \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 dell'argomento \var{hints} per
+restringere le ricerche su protocolli, tipi di socket o famiglie di indirizzi,
+è disponibile nel file \texttt{mygetaddr.c} dei sorgenti allegati alla guida.
\begin{figure}[!htbp]
\footnotesize \centering
\end{Verbatim}
%$
-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
+Una volta estratti i risultati dalla \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 è:
\begin{functions}
\headdecl{netdb.h}
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
-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.
+avere cura di eseguire una \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.
Anche la nuova interfaccia definita da POSIX prevede una nuova funzione per
eseguire la risoluzione inversa e determinare nomi di servizi e di dominio
\textbf{Costante} & \textbf{Significato} \\
\hline
\hline
- \const{NI\_NOFQDN} & Richiede che venga restituita solo il nome della
- macchina all'interno del dominio al posto del
- nome completo (FQDN).\\
- \const{NI\_NUMERICHOST}& Richiede che venga restituita la forma numerica
- dell'indirizzo (questo succede sempre se il nome
- non può essere ottenuto).\\
- \const{NI\_NAMEREQD} & Richiede la restituzione di un errore se il nome
- non può essere risolto.\\
- \const{NI\_NUMERICSERV}& Richiede che il servizio venga restituito in
- forma numerica (attraverso il numero di porta).\\
- \const{NI\_DGRAM} & Richiede che venga restituito il nome del
- servizio su UDP invece che quello su TCP per quei
- pichi servizi (porte 512-214) che soni diversi
- nei due protocolli.\\
+ \constd{NI\_NOFQDN} & Richiede che venga restituita solo il nome della
+ macchina all'interno del dominio al posto del
+ nome completo (FQDN).\\
+ \constd{NI\_NUMERICHOST}& Richiede che venga restituita la forma numerica
+ dell'indirizzo (questo succede sempre se il nome
+ non può essere ottenuto).\\
+ \constd{NI\_NAMEREQD} & Richiede la restituzione di un errore se il nome
+ non può essere risolto.\\
+ \constd{NI\_NUMERICSERV}& Richiede che il servizio venga restituito in
+ forma numerica (attraverso il numero di porta).\\
+ \constd{NI\_DGRAM} & Richiede che venga restituito il nome del
+ servizio su UDP invece che quello su TCP per quei
+ pichi servizi (porte 512-214) che soni diversi
+ nei due protocolli.\\
\hline
\end{tabular}
\caption{Costanti associate ai bit dell'argomento \param{flags} della
terminate dal carattere NUL, a meno che queste non debbano essere troncate
qualora la loro dimensione ecceda quelle specificate dagli argomenti
\param{hostlen} e \param{servlen}. Sono comunque definite le due costanti
-\const{NI\_MAXHOST} e \const{NI\_MAXSERV}\footnote{in Linux le due costanti
+\constd{NI\_MAXHOST} e \constd{NI\_MAXSERV}\footnote{in Linux le due costanti
sono definite in \headfile{netdb.h} ed hanno rispettivamente il valore 1024
e 12.} che possono essere utilizzate come limiti massimi. In caso di
errore viene restituito invece un codice che assume gli stessi valori
\textbf{Livello} & \textbf{Significato} \\
\hline
\hline
- \const{SOL\_SOCKET}& Opzioni generiche dei socket.\\
- \const{SOL\_IP} & Opzioni specifiche per i socket che usano IPv4.\\
- \const{SOL\_TCP} & Opzioni per i socket che usano TCP.\\
- \const{SOL\_IPV6} & Opzioni specifiche per i socket che usano IPv6.\\
- \const{SOL\_ICMPV6}& Opzioni specifiche per i socket che usano ICMPv6.\\
+ \constd{SOL\_SOCKET}& Opzioni generiche dei socket.\\
+ \constd{SOL\_IP} & Opzioni specifiche per i socket che usano IPv4.\\
+ \constd{SOL\_TCP} & Opzioni per i socket che usano TCP.\\
+ \constd{SOL\_IPV6} & Opzioni specifiche per i socket che usano IPv6.\\
+ \constd{SOL\_ICMPV6}& Opzioni specifiche per i socket che usano ICMPv6.\\
\hline
\end{tabular}
\caption{Possibili valori dell'argomento \param{level} delle
\const{SO\_KEEPALIVE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
Controlla l'attività della connessione.\\
\const{SO\_OOBINLINE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Lascia in linea i dati \itindex{out-of-band}
- \textit{out-of-band}.\\
+ Lascia in linea i dati \textit{out-of-band}.\\
\const{SO\_RCVLOWAT} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
Basso livello sul buffer di ricezione.\\
\const{SO\_SNDLOWAT} &$\bullet$&$\bullet$& &\texttt{int}&
\const{SO\_DONTROUTE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
Non invia attraverso un gateway.\\
\const{SO\_BROADCAST}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Attiva o disattiva il \itindex{broadcast}
- \textit{broadcast}.\\
+ Attiva o disattiva il \textit{broadcast}.\\
\const{SO\_SNDBUF} &$\bullet$&$\bullet$& &\texttt{int}&
Imposta dimensione del buffer di trasmissione.\\
\const{SO\_RCVBUF} &$\bullet$&$\bullet$& &\texttt{int}&
usato come valore logico. Maggiori dettagli sul suo funzionamento sono
forniti in sez.~\ref{sec:sock_options_main}.
-\item[\const{SO\_OOBINLINE}] se questa opzione viene abilitata i dati
- \itindex{out-of-band} \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}. L'argomento è trattato in dettaglio in
+\item[\constd{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}. L'argomento è trattato in dettaglio in
sez.~\ref{sec:TCP_urgent_data}. L'opzione funziona soltanto con socket che
- supportino i dati \itindex{out-of-band} \textit{out-of-band} (non ha senso
- per socket UDP ad esempio), ed utilizza per \param{optval} un intero usato
- come valore logico.
+ 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
+\item[\constd{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
segnalando ad una \func{select} (vedi sez.~\ref{sec:TCP_sock_select}) che ci
essere cambiato; \func{getsockopt} leggerà questo valore mentre
\func{setsockopt} darà un errore di \errcode{ENOPROTOOPT}.
-\item[\const{SO\_SNDLOWAT}] questa opzione imposta il valore che indica il
+\item[\constd{SO\_SNDLOWAT}] questa opzione imposta il valore che indica il
numero minimo di byte che devono essere presenti nel buffer di trasmissione
perché il kernel li invii al protocollo successivo, consentendo ad una
\func{write} di ritornare o segnalando ad una \func{select} (vedi
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
+\item[\constd{SO\_RCVTIMEO}] l'opzione permette di impostare un tempo massimo
sulle operazioni di lettura da un socket, e prende per \param{optval} una
struttura di tipo \struct{timeval} (vedi fig.~\ref{fig:sys_timeval_struct})
identica a quella usata con \func{select}. Con \func{getsockopt} si può
% TODO verificare il timeout con un programma di test
-\item[\const{SO\_SNDTIMEO}] l'opzione permette di impostare un tempo massimo
+\item[\constd{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{sendto} e \func{sendmsg}
qualora queste restino bloccate per un tempo maggiore di quello specificato.
-\item[\const{SO\_BSDCOMPAT}] questa opzione abilita la compatibilità con il
+\item[\constd{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
state rimosse con il passaggio al 2.2; è consigliato correggere i programmi
piuttosto che usare questa funzione.
-\item[\const{SO\_PASSCRED}] questa opzione abilita sui socket unix-domain
+\item[\constd{SO\_PASSCRED}] questa opzione abilita sui socket unix-domain
(vedi sez.~\ref{sec:unix_socket}) 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
+\item[\constd{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}. Utilizza per
\param{optval} una apposita struttura \struct{ucred} (vedi
sez.~\ref{sec:unix_socket}).
-\item[\const{SO\_BINDTODEVICE}] questa opzione permette di \textsl{legare} il
+\item[\constd{SO\_BINDTODEVICE}] questa opzione permette di \textsl{legare} il
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
\param{optlen} si può rimuovere un precedente 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 è
+ da uno zero e di lunghezza massima pari a \constd{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{sec:socket_raw}).
-\item[\const{SO\_DEBUG}] questa opzione abilita il debugging delle operazioni
+\item[\constd{SO\_DEBUG}] questa opzione abilita il debugging delle operazioni
dei socket; l'opzione utilizza per \param{optval} un intero usato come
valore logico, e può essere utilizzata solo da un processo con i privilegi
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 \macro{SOCK\_DEBUGGING} nel file \file{include/net/sock.h}
+ preprocessore \macrod{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
- \macro{STATE\_TRACE} in \file{include/net/tcp.h}.} quando viene abilitata
- una serie di messaggi con le informazioni di debug vengono inviati
+ \macrod{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
socket. Maggiori dettagli sul suo funzionamento sono forniti in
sez.~\ref{sec:sock_options_main}.
-\item[\const{SO\_TYPE}] questa opzione permette di leggere il tipo di socket
+\item[\constd{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 intero in cui verrà restituito il valore numerico che lo
identifica (ad esempio \const{SOCK\_STREAM}).
-\item[\const{SO\_ACCEPTCONN}] questa opzione permette di rilevare se il socket
+\item[\constd{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
+\item[\constd{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 \itindex{broadcast}
- \textit{broadcast}; quanto abilitata i socket di tipo \const{SOCK\_DGRAM}
- riceveranno i pacchetti inviati all'indirizzo di \textit{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[\constd{SO\_BROADCAST}] questa opzione abilita il \textit{broadcast};
+ quanto abilitata i socket di tipo \const{SOCK\_DGRAM} riceveranno i
+ pacchetti inviati all'indirizzo di \textit{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 dimensione del buffer di
+\item[\constd{SO\_SNDBUF}] questa opzione imposta la dimensione del buffer di
trasmissione del socket. Prende per \param{optval} un intero indicante il
numero di byte. Il valore di default ed il valore massimo che si possono
specificare come argomento per questa opzione sono impostabili
rispettivamente tramite gli opportuni valori di \func{sysctl} (vedi
sez.~\ref{sec:sock_sysctl}).
-\item[\const{SO\_RCVBUF}] questa opzione imposta la dimensione del buffer di
+\item[\constd{SO\_RCVBUF}] questa opzione imposta la dimensione del buffer di
ricezione del socket. Prende per \param{optval} un intero indicante il
numero di byte. Il valore di default ed il valore massimo che si può
specificare come argomento per questa opzione sono impostabili tramiti gli
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è \sysctlrelfile{net/core}{wmem\_max} e
- \sysctlrelfile{net/core}{rmem\_max} in \texttt{/proc/sys/net/core}
- e \sysctlrelfile{net/ipv4}{tcp\_wmem} e
- \sysctlrelfile{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
+ \sysctlrelfile{net/core}{rmem\_max} in \texttt{/proc/sys/net/core} e
+ \sysctlrelfile{net/ipv4}{tcp\_wmem} e \sysctlrelfile{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 ricezione e trasmissione, per poter
essere effettive, devono essere impostate prima della chiamata alle funzioni
\func{listen} o \func{connect}.
fig.~\ref{fig:sock_linger_struct}. Maggiori dettagli sul suo funzionamento
sono forniti in sez.~\ref{sec:sock_options_main}.
-\item[\const{SO\_PRIORITY}] questa opzione permette di impostare le priorità
+\item[\constd{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
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;
+\item[\constd{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, nel quale viene restituito il codice di
errore, e la condizione di errore sul socket viene cancellata. Viene
sez.~\ref{sec:TCP_sock_select}, quando si sta osservando il socket con una
\func{select} che ritorna a causa dello stesso.
-\item[\const{SO\_ATTACH\_FILTER}] questa opzione permette di agganciare ad un
+\item[\constd{SO\_ATTACH\_FILTER}] questa opzione permette di agganciare ad un
socket un filtro di pacchetti che consente di selezionare quali pacchetti,
fra tutti quelli ricevuti, verranno letti. Viene usato principalmente con i
socket di tipo \const{PF\_PACKET} con la libreria \texttt{libpcap} per
implementare programmi di cattura dei pacchetti, torneremo su questo in
sez.~\ref{sec:packet_socket}.
-\item[\const{SO\_DETACH\_FILTER}] consente di distaccare un filtro
+\item[\constd{SO\_DETACH\_FILTER}] consente di distaccare un filtro
precedentemente aggiunto ad un socket.
% TODO documentare SO_ATTACH_FILTER e SO_DETACH_FILTER
approfondimento sul significato delle opzioni generiche più importanti.
-\index{costante!{SO\_KEEPALIVE}@{{\tt {SO\_KEEPALIVE}}}|(}
+\constbeg{SO\_KEEPALIVE}
\subsubsection{L'opzione \const{SO\_KEEPALIVE}}
La prima opzione da approfondire è \const{SO\_KEEPALIVE} che permette di
connessione verrà pertanto eseguita o meno la sezione (\texttt{\small 14--17})
che esegue l'impostazione di \const{SO\_KEEPALIVE} sul socket connesso,
attivando il relativo comportamento.
-\index{costante!{SO\_KEEPALIVE}@{{\tt {SO\_KEEPALIVE}}}|)}
+\constend{SO\_KEEPALIVE}
-\index{costante!{SO\_REUSEADDR}@{{\tt {SO\_REUSEADDR}}}|(}
+\constbeg{SO\_REUSEADDR}
\subsubsection{L'opzione \const{SO\_REUSEADDR}}
La seconda opzione da approfondire è \const{SO\_REUSEADDR}, che consente di
all'interno dello stesso programma per associare indirizzi locali diversi a
socket diversi. In genere questo viene fatto per i socket UDP quando è
necessario ottenere l'indirizzo a cui sono rivolte le richieste del client ed
-il sistema non supporta l'opzione \const{IP\_RECVDSTADDR};\footnote{nel caso
+il sistema non supporta l'opzione \constd{IP\_RECVDSTADDR};\footnote{nel caso
di Linux questa opzione è stata supportata per in certo periodo nello
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
primo programma a consentirlo, avendo usato fin dall'inizio
\const{SO\_REUSEADDR}.}
-% TODO documentare SO_REUSEPORT, vedi https://lwn.net/Articles/542260/
-
+\constend{SO\_REUSEADDR}
-\index{costante!{SO\_REUSEADDR}@{{\tt {SO\_REUSEADDR}}}|)}
+% TODO documentare SO_REUSEPORT, vedi https://lwn.net/Articles/542260/
-\index{costante!{SO\_LINGER}@{{\tt {SO\_LINGER}}}|(}
+\constbeg{SO\_LINGER}
\subsubsection{L'opzione \const{SO\_LINGER}}
La terza opzione da approfondire è \const{SO\_LINGER}; essa, come il nome
completamento della trasmissione dei dati sul buffer.} pari al valore
specificato in \var{l\_linger}.
-\index{costante!{SO\_LINGER}@{{\tt {SO\_LINGER}}}|)}
+\constend{SO\_LINGER}
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} (o l'equivalente \const{IPPROTO\_IP});
-si è riportato un elenco di queste opzioni in tab.~\ref{tab:sock_opt_iplevel}.
-Le costanti indicanti le opzioni e tutte le altre costanti ad esse collegate
-sono definite in \headfile{netinet/ip.h}, ed accessibili includendo detto
-file.
+livello da utilizzare è \const{SOL\_IP} (o l'equivalente
+\constd{IPPROTO\_IP}); si è riportato un elenco di queste opzioni in
+tab.~\ref{tab:sock_opt_iplevel}. Le costanti indicanti le opzioni e tutte le
+altre costanti ad esse collegate sono definite in \headfiled{netinet/ip.h}, ed
+accessibili includendo detto file.
\begin{table}[!htb]
\centering
\const{IP\_MTU\_DISCOVER} &$\bullet$&$\bullet$& &\texttt{int}&
Imposta il \textit{Path MTU Discovery}.\\
\const{IP\_MTU} &$\bullet$& & &\texttt{int}&
- Legge il valore attuale della \itindex{Maximum~Transfer~Unit~(MTU)} MTU.\\
+ 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$& &\texttt{int}&
\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
-\item[\const{IP\_OPTIONS}] l'opzione permette di impostare o leggere le
+\item[\constd{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
torneremo in parte sull'argomento in sez.~\ref{sec:sock_IP_options}.
-\item[\const{IP\_PKTINFO}] Quando abilitata l'opzione permette di ricevere
+\item[\constd{IP\_PKTINFO}] Quando abilitata l'opzione permette di ricevere
insieme ai pacchetti un messaggio ancillare (vedi
sez.~\ref{sec:net_ancillary_data}) di tipo \const{IP\_PKTINFO} contenente
una struttura \struct{pktinfo} (vedi fig.~\ref{fig:sock_pktinfo_struct}) che
sez.~\ref{sec:net_sendmsg}).
-\item[\const{IP\_RECVTOS}] Quando abilitata l'opzione permette di ricevere
+\item[\constd{IP\_RECVTOS}] Quando abilitata l'opzione permette di ricevere
insieme ai pacchetti un messaggio ancillare (vedi
sez.~\ref{sec:net_ancillary_data}) 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
+\item[\constd{IP\_RECVTTL}] Quando abilitata l'opzione permette di ricevere
insieme ai pacchetti un messaggio ancillare (vedi
sez.~\ref{sec:net_ancillary_data}) di tipo \const{IP\_RECVTTL}, contenente
un byte con il valore del campo \textit{Time to Live} dell'intestazione IP
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
+\item[\constd{IP\_RECVOPTS}] Quando abilitata l'opzione permette di ricevere
insieme ai pacchetti un messaggio ancillare (vedi
sez.~\ref{sec:net_ancillary_data}) di tipo \const{IP\_OPTIONS}, contenente
le opzioni IP del protocollo (vedi sez.~\ref{sec:IP_options}). Le
valore logico. L'opzione non è supportata per socket di tipo
\const{SOCK\_STREAM}.
-\item[\const{IP\_RETOPTS}] Identica alla precedente \const{IP\_RECVOPTS}, ma
+\item[\constd{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
+\item[\constd{IP\_TOS}] L'opzione consente di leggere o impostare il campo
\textit{Type of Service} dell'intestazione IP (per una trattazione più
dettagliata, che riporta anche i valori possibili e le relative costanti di
definizione si veda sez.~\ref{sec:IP_header}) che permette di indicare le
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 per tutti i
+\item[\constd{IP\_TTL}] L'opzione consente di leggere o impostare per tutti i
pacchetti associati al socket il campo \textit{Time to Live}
dell'intestazione IP che indica il numero massimo di \textit{hop} (passaggi
da un router ad un altro) restanti al paccheto (per una trattazione più
l'opzione richiede che \param{optval} sia un intero, che ne conterrà il
valore.
-\item[\const{IP\_MINTTL}] L'opzione, introdotta con il kernel 2.6.34, imposta
+\item[\constd{IP\_MINTTL}] L'opzione, introdotta con il kernel 2.6.34, imposta
un valore minimo per il campo \textit{Time to Live} dei pacchetti associati
al socket su cui è attivata, che se non rispettato ne causa lo scarto
automatico. L'opzione è nata per implementare
senza carico aggiuntivo sulla CPU (che altrimenti dovrebbe calcolare una
checksum).}
-\item[\const{IP\_HDRINCL}] Se abilitata l'utente deve fornire lui stesso
+\item[\constd{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
dell'intestazione vengono comunque modificati dal kernel, torneremo
sull'argomento in sez.~\ref{sec:socket_raw}
-\item[\const{IP\_RECVERR}] Questa è una opzione introdotta con i kernel della
+\item[\constd{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
\const{SOCK\_STREAM}.
\itindbeg{Path~MTU}
-\item[\const{IP\_MTU\_DISCOVER}] Questa è una opzione introdotta con i kernel
+\item[\constd{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 della modalità usata per la determinazione della
\textit{Path MTU} (vedi sez.~\ref{sec:net_lim_dim}) del
\multicolumn{2}{|c|}{\textbf{Valore}}&\textbf{Significato} \\
\hline
\hline
- \const{IP\_PMTUDISC\_DONT}&0& Non effettua la ricerca dalla \textit{Path
- MTU}.\\
- \const{IP\_PMTUDISC\_WANT}&1& Utilizza il valore impostato per la rotta
- utilizzata dai pacchetti (dal comando
- \texttt{route}).\\
- \const{IP\_PMTUDISC\_DO} &2& Esegue la procedura di determinazione
- della \textit{Path MTU} come richiesto
- dall'\href{http://www.ietf.org/rfc/rfc1191.txt}{RFC~1191}.\\
+ \constd{IP\_PMTUDISC\_DONT}&0& Non effettua la ricerca dalla \textit{Path
+ MTU}.\\
+ \constd{IP\_PMTUDISC\_WANT}&1& Utilizza il valore impostato per la rotta
+ utilizzata dai pacchetti (dal comando
+ \texttt{route}).\\
+ \constd{IP\_PMTUDISC\_DO} &2& Esegue la procedura di determinazione
+ della \textit{Path MTU} come richiesto
+ dall'\href{http://www.ietf.org/rfc/rfc1191.txt}{RFC~1191}.\\
\hline
\end{tabular}
\caption{Valori possibili per l'argomento \param{optval} di
trasmissione del pacchetto sarebbe effettuata, ottenendo o un fallimento
successivo della trasmissione, o la frammentazione dello stesso.}
-\item[\const{IP\_MTU}] Permette di leggere il valore della \textit{Path MTU}
+\item[\constd{IP\_MTU}] Permette di leggere il valore della \textit{Path MTU}
di percorso del socket. L'opzione richiede per \param{optval} un intero che
conterrà il valore della \textit{Path MTU} in byte. Questa è una opzione
introdotta con i kernel della serie 2.2.x, ed è specifica di Linux.
\itindend{Path~MTU}
-\item[\const{IP\_ROUTER\_ALERT}] Questa è una opzione introdotta con i
+\item[\constd{IP\_ROUTER\_ALERT}] Questa è una opzione introdotta con i
kernel della serie 2.2.x, ed è specifica di Linux. Prende per
\param{optval} un intero usato come valore logico. Se abilitata
passa tutti i pacchetti con l'opzione \textit{IP Router Alert} (vedi
sez.~\ref{sec:IP_options}) che devono essere inoltrati al socket
corrente. Può essere usata soltanto per socket di tipo raw.
-\item[\const{IP\_MULTICAST\_TTL}] L'opzione permette di impostare o leggere il
+\item[\constd{IP\_MULTICAST\_TTL}] L'opzione permette di impostare o leggere il
valore del campo TTL per i pacchetti \textit{multicast} 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
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
+\item[\constd{IP\_MULTICAST\_LOOP}] L'opzione consente di decidere se i dati
che si inviano su un socket usato con il \textit{multicast} vengano ricevuti
anche sulla stessa macchina da cui li si stanno inviando. Prende per
\param{optval} un intero usato come valore logico.
disponibili in locale l'uso di questa opzione permette di disabilitare
questo tipo di traffico.
-\item[\const{IP\_ADD\_MEMBERSHIP}] L'opzione consente di unirsi ad gruppo di
+\item[\constd{IP\_ADD\_MEMBERSHIP}] L'opzione consente di unirsi ad gruppo di
\textit{multicast}, e può essere usata solo con \func{setsockopt}.
L'argomento \param{optval} in questo caso deve essere una struttura di tipo
\struct{ip\_mreqn}, illustrata in fig.~\ref{fig:ip_mreqn_struct}, che
\label{fig:ip_mreqn_struct}
\end{figure}
-\item[\const{IP\_DROP\_MEMBERSHIP}] Lascia un gruppo di \textit{multicast},
+\item[\constd{IP\_DROP\_MEMBERSHIP}] Lascia un gruppo di \textit{multicast},
prende per \param{optval} la stessa struttura \struct{ip\_mreqn} (o
\struct{ip\_mreq}) usata anche per \const{IP\_ADD\_MEMBERSHIP}.
-\item[\const{IP\_MULTICAST\_IF}] Imposta l'interfaccia locale per l'utilizzo
+\item[\constd{IP\_MULTICAST\_IF}] Imposta l'interfaccia locale per l'utilizzo
del \textit{multicast}, ed utilizza come \param{optval} le stesse strutture
\struct{ip\_mreqn} o \struct{ip\_mreq} delle due precedenti opzioni.
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
+\constd{IPPROTO\_TCP}) come valore per l'argomento \param{level}. Si sono
riportate le varie opzioni disponibili in tab.~\ref{tab:sock_opt_tcplevel},
dove sono elencate le rispettive costanti da utilizzare come valore per
l'argomento \param{optname}. Dette costanti e tutte le altre costanti e
strutture collegate all'uso delle opzioni TCP sono definite in
-\headfile{netinet/tcp.h}, ed accessibili includendo detto file.\footnote{in
+\headfiled{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{include/linux/tcp.h} dei sorgenti del kernel, dal quale si sono
\const{TCP\_NODELAY} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
Spedisce immediatamente i dati in segmenti singoli.\\
\const{TCP\_MAXSEG} &$\bullet$&$\bullet$& &\texttt{int}&
- Valore della \itindex{Maximum~Segment~Size~(MSS)} MSS per i segmenti in
- uscita.\\
+ Valore della MSS per i segmenti in uscita.\\
\const{TCP\_CORK} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
Accumula i dati in un unico segmento.\\
\const{TCP\_KEEPIDLE} &$\bullet$&$\bullet$& &\texttt{int}&
quantità di dettagli è fornita nel seguente elenco:
\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
-\item[\const{TCP\_NODELAY}] il protocollo TCP utilizza un meccanismo di
+\item[\constd{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
- \index{algoritmo~di~Nagle} l'\textsl{algoritmo di Nagle}.} Questo
- meccanismo è controllato da un apposito algoritmo (detto
- \index{algoritmo~di~Nagle} \textsl{algoritmo di Nagle}, vedi
+ disponibile.\footnote{il problema è chiamato anche
+ \itindex{silly~window~syndrome} \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 \index{algoritmo~di~Nagle}
+ l'\textsl{algoritmo di Nagle}.} Questo meccanismo è controllato da un
+ apposito algoritmo (detto \textsl{algoritmo di Nagle}, vedi
sez.~\ref{sec: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
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
- \index{algoritmo~di~Nagle} dell'\textsl{algoritmo di Nagle} ed i dati
- vengono inviati immediatamente in singoli segmenti, qualunque sia la loro
- dimensione. Ovviamente l'uso di questa opzione è dedicato a chi ha esigenze
- particolari come quella illustrata, che possono essere stabilite solo per la
- singola applicazione.
+ 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
essere specificata insieme a \const{TCP\_NODELAY} soltanto a partire dal
kernel 2.5.71.}
-\item[\const{TCP\_MAXSEG}] con questa opzione si legge o si imposta il valore
- della \itindex{Maximum~Segment~Size~(MSS)} MSS
- (\textit{Maximum~Segment~Size}, vedi sez.~\ref{sec:net_lim_dim} e
+\item[\constd{TCP\_MAXSEG}] con questa opzione si legge o si imposta il valore
+ della MSS (\textit{Maximum Segment Size}, vedi sez.~\ref{sec:net_lim_dim} e
sez.~\ref{sec: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)} MSS annunciata all'altro capo della
- connessione. Se si specificano valori maggiori della
- \itindex{Maximum~Transfer~Unit~(MTU)} MTU questi verranno ignorati, inoltre
- TCP imporrà anche i suoi limiti massimo e minimo per questo valore.
+ 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}] questa opzione è il complemento naturale di
+\item[\constd{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 \index{algoritmo~di~Nagle}
- l'\textsl{algoritmo di Nagle} tenderà a suddividerli in dimensioni da lui
- ritenute opportune,\footnote{l'algoritmo cerca di tenere conto di queste
- situazioni, ma essendo un algoritmo generico tenderà comunque ad
- introdurre delle suddivisioni in segmenti diversi, anche quando potrebbero
- non essere necessarie, con conseguente spreco di banda.} ma sapendo fin
- dall'inizio quale è la dimensione dei dati si potranno di nuovo ottenere
- delle migliori prestazioni disabilitandolo, e gestendo direttamente l'invio
- del nostro blocco di dati in soluzione unica.
+ 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
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
+\item[\constd{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
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
+\item[\constd{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
+\item[\constd{TCP\_KEEPCNT}] con questa opzione si legge o si imposta il numero
totale di messaggi di \textit{keep-alive} da inviare prima di concludere che
la connessione è caduta per assenza di risposte ad un messaggio di
\textit{keep-alive} (di nuovo vedi sez.~\ref{sec:sock_options_main}). Come
la precedente non è disponibile su tutti i kernel unix-like e deve essere
evitata se si vuole scrivere codice portabile.
-\item[\const{TCP\_SYNCNT}] con questa opzione si legge o si imposta il numero
- di tentativi di ritrasmissione dei segmenti SYN usati nel
- \itindex{three~way~handshake} \textit{three way handshake} prima che il
- tentativo di connessione venga abortito (si ricordi quanto accennato in
- sez.~\ref{sec:TCP_func_connect}). Sovrascrive per il singolo socket il valore
- globale impostato con la \textit{sysctl} \texttt{tcp\_syn\_retries} (vedi
- sez.~\ref{sec:sock_ipv4_sysctl}). Non vengono accettati valori maggiori di
- 255; anche questa opzione non è standard e deve essere evitata se si vuole
- scrivere codice portabile.
-
-\item[\const{TCP\_LINGER2}] con questa opzione si legge o si imposta, in
+\item[\constd{TCP\_SYNCNT}] con questa opzione si legge o si imposta il numero
+ di tentativi di ritrasmissione dei segmenti SYN usati nel \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[\constd{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
sez.~\ref{sec:sock_ipv4_sysctl}). Anche questa opzione è da evitare se si
ha a cuore la portabilità del codice.
-\item[\const{TCP\_DEFER\_ACCEPT}] questa opzione consente di modificare il
+\item[\constd{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.
+ connessione; se ricordiamo il meccanismo del \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.
+ del segmento con l'ultimo ACK del \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.
+ inviare immediatamente l'ACK finale del \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
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}.
+ \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
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
+\item[\constd{TCP\_WINDOW\_CLAMP}] con questa opzione si legge o si imposta
alla dimensione specificata, in byte, il valore dichiarato della
\textit{advertised window} (vedi sez.~\ref{sec:tcp_protocol_xxx}). Il kernel
impone comunque una dimensione minima pari a \texttt{SOCK\_MIN\_RCVBUF/2}.
\label{fig:tcp_info_struct}
\end{figure}
-\item[\const{TCP\_INFO}] questa opzione, specifica di Linux, ma introdotta
+\item[\constd{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
%Si noti come nell'esempio si sia (
-\item[\const{TCP\_QUICKACK}] con questa opzione è possibile eseguire una forma
+\item[\constd{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
% TODO trattare con gli esempi di apache
-\item[\const{TCP\_CONGESTION}] questa opzione permette di impostare quale
+\item[\constd{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{sec:tcp_protocol_xxx}) per evitare di trasmettere inutilmente
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 \headfile{netinet/udp.h}, ed accessibili includendo detto
+\constd{IPPROTO\_UDP}). Le costanti che identificano dette opzioni sono
+definite in \headfiled{netinet/udp.h}, ed accessibili includendo detto
file.\footnote{come per TCP, la definizione delle opzioni effettivamente
supportate dal kernel si trova in realtà nel file
\texttt{include/linux/udp.h}, dal quale si sono estratte le costanti di
\textbf{Descrizione}\\
\hline
\hline
- \const{UDP\_CORK} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& %???
+ \constd{UDP\_CORK} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& %???
Accumula tutti i dati su un unico pacchetto.\\
- \const{UDP\_ENCAP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& %???
+ \constd{UDP\_ENCAP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& %???
Non documentata.\\
\hline
\end{tabular}
caratteristiche delle opzioni citate è quello dell'elenco seguente:
\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
-\item[\const{UDP\_CORK}] questa opzione ha l'identico effetto dell'analoga
+\item[\constd{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}] Questa opzione permette di gestire l'incapsulazione
+\item[\constd{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.
precedentemente allocata. Le costanti che identificano le operazioni sono le
seguenti:
\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
-\item[\const{SIOCGSTAMP}] restituisce il contenuto di una struttura
+\item[\constd{SIOCGSTAMP}] restituisce il contenuto di una struttura
\struct{timeval} con la marca temporale dell'ultimo pacchetto ricevuto sul
socket, questa operazione può essere utilizzata per effettuare delle
- misurazioni precise del tempo di andata e ritorno\footnote{il
- \itindex{Round~Trip~Time~(RTT)} \textit{Round Trip Time} cui abbiamo già
- accennato in sez.~\ref{sec:net_tcp}.} dei pacchetti sulla rete.
-
-\item[\const{SIOCSPGRP}] imposta il processo o il \itindex{process~group}
- \textit{process group} a cui inviare i segnali \signal{SIGIO} e
- \signal{SIGURG} quando viene completata una operazione di I/O asincrono o
- arrivano dei dati urgenti \itindex{out-of-band} (\texttt{out-of-band}). Il
- terzo argomento deve essere un puntatore ad una variabile di tipo
- \type{pid\_t}; un valore positivo indica direttamente il \ids{PID} del
- processo, mentre un valore negativo indica (col valore assoluto) il
- \textit{process group}. Senza privilegi di amministratore o la capability
- \const{CAP\_KILL} si può impostare solo se stessi o il proprio
+ misurazioni precise del tempo di andata e ritorno\footnote{il \textit{Round
+ Trip Time} cui abbiamo già accennato in sez.~\ref{sec:net_tcp}.} dei
+ pacchetti sulla rete.
+
+\item[\constd{SIOCSPGRP}] imposta il processo o il \textit{process group} a cui
+ inviare i segnali \signal{SIGIO} e \signal{SIGURG} quando viene completata
+ una operazione di I/O asincrono o arrivano dei dati urgenti
+ (\texttt{out-of-band}). Il terzo argomento deve essere un puntatore ad una
+ variabile di tipo \type{pid\_t}; un valore positivo indica direttamente il
+ \ids{PID} del processo, mentre un valore negativo indica (col valore
+ assoluto) il \textit{process group}. Senza privilegi di amministratore o la
+ capability \const{CAP\_KILL} si può impostare solo se stessi o il proprio
\textit{process group}.
-\item[\const{SIOCGPGRP}] legge le impostazioni presenti sul socket
- relativamente all'eventuale processo o \itindex{process~group}
- \textit{process group} cui devono essere inviati i segnali \signal{SIGIO} e
- \signal{SIGURG}. Come per \const{SIOCSPGRP} l'argomento passato deve un
- puntatore ad una variabile di tipo \type{pid\_t}, con lo stesso significato.
- Qualora non sia presente nessuna impostazione verrà restituito un valore
- nullo.
+\item[\constd{SIOCGPGRP}] legge le impostazioni presenti sul socket
+ relativamente all'eventuale processo o \textit{process group} cui devono
+ essere inviati i segnali \signal{SIGIO} e \signal{SIGURG}. Come per
+ \const{SIOCSPGRP} l'argomento passato deve un puntatore ad una variabile di
+ tipo \type{pid\_t}, con lo stesso significato. Qualora non sia presente
+ nessuna impostazione verrà restituito un valore nullo.
\item[\const{FIOASYNC}] Abilita o disabilita la modalità di I/O asincrono sul
socket. Questo significa (vedi sez.~\ref{sec:signal_driven_io}) che verrà
dell'interfaccia su cui si vuole operare (ad esempio \texttt{eth0},
\texttt{ppp0}, ecc.), e si inseriscono (o ricevono) i valori relativi alle
diversa caratteristiche e funzionalità nel secondo campo, che come si può
-notare è definito come una \direct{union} proprio in quanto il suo significato
+notare è definito come una \dirct{union} proprio in quanto il suo significato
varia a secondo dell'operazione scelta.
Si tenga inoltre presente che alcune di queste operazioni (in particolare
\const{CAP\_NET\_ADMIN}, altrimenti si otterrà un errore di \errval{EPERM}.
Le costanti che identificano le operazioni disponibili sono le seguenti:
\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
-\item[\const{SIOCGIFNAME}] questa è l'unica operazione che usa il campo
+\item[\constd{SIOCGIFNAME}] questa è l'unica operazione che usa il campo
\var{ifr\_name} per restituire un risultato, tutte le altre lo utilizzano
per indicare l'interfaccia sulla quale operare. L'operazione richiede che si
indichi nel campo \var{ifr\_ifindex} il valore numerico dell'\textsl{indice}
ordinato in base a tale valore (riportato come primo campo).
-\item[\const{SIOCGIFINDEX}] restituisce nel campo \var{ifr\_ifindex} il valore
+\item[\constd{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
+\item[\constd{SIOCGIFFLAGS}] permette di ottenere nel campo \var{ifr\_flags} il
valore corrente dei flag dell'interfaccia specificata (con \var{ifr\_name}).
Il valore restituito è una maschera binaria i cui bit sono identificabili
attraverso le varie costanti di tab.~\ref{tab:netdevice_iface_flag}.
\textbf{Flag} & \textbf{Significato} \\
\hline
\hline
- \const{IFF\_UP} & L'interfaccia è attiva.\\
- \const{IFF\_BROADCAST} & L'interfaccia ha impostato un indirizzo di
- \itindex{broadcast} \textit{broadcast} valido.\\
- \const{IFF\_DEBUG} & È attivo il flag interno di debug.\\
- \const{IFF\_LOOPBACK} & L'interfaccia è una interfaccia di
+ \constd{IFF\_UP} & L'interfaccia è attiva.\\
+ \constd{IFF\_BROADCAST} & L'interfaccia ha impostato un indirizzo di
+ \textit{broadcast} valido.\\
+ \constd{IFF\_DEBUG} & È attivo il flag interno di debug.\\
+ \constd{IFF\_LOOPBACK} & L'interfaccia è una interfaccia di
\textit{loopback}.\\
- \const{IFF\_POINTOPOINT}&L'interfaccia è associata ad un collegamento
+ \constd{IFF\_POINTOPOINT}&L'interfaccia è associata ad un collegamento
\textsl{punto-punto}.\\
- \const{IFF\_RUNNING} & L'interfaccia ha delle risorse allocate (non può
+ \constd{IFF\_RUNNING} & L'interfaccia ha delle risorse allocate (non può
quindi essere disattivata).\\
- \const{IFF\_NOARP} & L'interfaccia ha il protocollo ARP disabilitato o
+ \constd{IFF\_NOARP} & L'interfaccia ha il protocollo ARP disabilitato o
l'indirizzo del livello di rete non è impostato.\\
- \const{IFF\_PROMISC} & L'interfaccia è in \index{modo~promiscuo}
- \textsl{modo promiscuo} (riceve cioè tutti i
- pacchetti che vede passare, compresi quelli non
- direttamente indirizzati a lei).\\
- \const{IFF\_NOTRAILERS}& Evita l'uso di \textit{trailer} nei pacchetti.\\
- \const{IFF\_ALLMULTI} & Riceve tutti i pacchetti di \textit{multicast}.\\
- \const{IFF\_MASTER} & L'interfaccia è il master di un bundle per il
+ \constd{IFF\_PROMISC} & L'interfaccia è nel cosiddetto
+ \index{modo~promiscuo} \textsl{modo promiscuo},
+ riceve cioè tutti i pacchetti che vede passare,
+ compresi quelli non direttamente indirizzati a
+ lei.\\
+ \constd{IFF\_NOTRAILERS}& Evita l'uso di \textit{trailer} nei pacchetti.\\
+ \constd{IFF\_ALLMULTI} & Riceve tutti i pacchetti di \textit{multicast}.\\
+ \constd{IFF\_MASTER} & L'interfaccia è il master di un bundle per il
bilanciamento di carico.\\
- \const{IFF\_SLAVE} & L'interfaccia è uno slave di un bundle per il
+ \constd{IFF\_SLAVE} & L'interfaccia è uno slave di un bundle per il
bilanciamento di carico.\\
- \const{IFF\_MULTICAST} & L'interfaccia ha il supporto per il
+ \constd{IFF\_MULTICAST} & L'interfaccia ha il supporto per il
\textit{multicast} attivo.\\
- \const{IFF\_PORTSEL} & L'interfaccia può impostare i suoi parametri
+ \constd{IFF\_PORTSEL} & L'interfaccia può impostare i suoi parametri
hardware (con l'uso di \struct{ifmap}).\\
- \const{IFF\_AUTOMEDIA} & L'interfaccia è in grado di selezionare
+ \constd{IFF\_AUTOMEDIA} & L'interfaccia è in grado di selezionare
automaticamente il tipo di collegamento.\\
- \const{IFF\_DYNAMIC} & Gli indirizzi assegnati all'interfaccia vengono
+ \constd{IFF\_DYNAMIC} & Gli indirizzi assegnati all'interfaccia vengono
persi quando questa viene disattivata.\\
% \const{IFF\_} & .\\
\hline
\end{table}
-\item[\const{SIOCSIFFLAGS}] permette di impostare il valore dei flag
+\item[\constd{SIOCSIFFLAGS}] permette di impostare il valore dei flag
dell'interfaccia specificata (sempre con \var{ifr\_name}, non staremo a
ripeterlo oltre) attraverso il valore della maschera binaria da passare nel
campo \var{ifr\_flags}, che può essere ottenuta con l'OR aritmetico delle
costanti di tab.~\ref{tab:netdevice_iface_flag}; questa operazione è
privilegiata.
-\item[\const{SIOCGIFMETRIC}] permette di leggere il valore della metrica del
+\item[\constd{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
+\item[\constd{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~(MTU)} \textit{Maximum Transfer Unit} del
- dispositivo nel campo \var{ifr\_mtu}.
+\item[\constd{SIOCGIFMTU}] permette di leggere il valore della \textit{Maximum
+ Transfer Unit} del dispositivo nel campo \var{ifr\_mtu}.
-\item[\const{SIOCSIFMTU}] permette di impostare il valore della
- \itindex{Maximum~Transfer~Unit~(MTU)} \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[\constd{SIOCSIFMTU}] permette di impostare il valore della
+ \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
+\item[\constd{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
+\item[\constd{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[\constd{SIOCSIFHWBROADCAST}] imposta l'indirizzo \textit{broadcast}
+ hardware dell'interfaccia al valore specificato dal campo
+ \var{ifr\_hwaddr}. L'operazione è privilegiata.
-\item[\const{SIOCGIFMAP}] legge alcuni parametri hardware (memoria, interrupt,
+\item[\constd{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
\label{fig:netdevice_ifmap_struct}
\end{figure}
-\item[\const{SIOCSIFMAP}] imposta i parametri hardware del driver
+\item[\constd{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 \textit{multicast} ai
+\item[\constd{SIOCADDMULTI}] aggiunge un indirizzo di \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 è
si possono usare i \textit{packet socket}, vedi
sez.~\ref{sec:packet_socket}.
-\item[\const{SIOCDELMULTI}] rimuove un indirizzo di \textit{multicast} ai
+\item[\constd{SIOCDELMULTI}] rimuove un indirizzo di \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
+\item[\constd{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
+\item[\constd{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
+\item[\constd{SIOCSIFNAME}] consente di cambiare il nome dell'interfaccia
indicata da \var{ifr\_name} utilizzando il nuovo nome specificato nel campo
\var{ifr\_rename}.
% hardware senza modificarlo
Una ulteriore operazione, che consente di ricavare le caratteristiche delle
-interfacce di rete, è \const{SIOCGIFCONF}; però per ragioni di compatibilità
+interfacce di rete, è \constd{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
\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
- \direct{union}, questo consente di utilizzare una delle due forme a piacere.}
+ \dirct{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
come \textit{value result argument}, deve essere sempre il puntatore ad una
variabile di tipo \ctyp{int}:
\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
-\item[\const{SIOCINQ}] restituisce la quantità di dati non ancora letti
+\item[\constd{SIOCINQ}] restituisce la quantità di dati non ancora letti
presenti nel buffer di ricezione; il socket non deve essere in stato
\texttt{LISTEN}, altrimenti si avrà un errore di \errval{EINVAL}.
-\item[\const{SIOCATMARK}] ritorna un intero non nullo, da intendere come
+\item[\constd{SIOCATMARK}] ritorna un intero non nullo, da intendere come
valore logico, se il flusso di dati letti sul socket è arrivato sulla
- posizione (detta anche \textit{urgent mark}) in cui sono stati ricevuti
- \itindex{out-of-band} dati urgenti (vedi sez.~\ref{sec:TCP_urgent_data}).
- Una operazione di lettura da un socket non attraversa mai questa posizione,
- per cui è possibile controllare se la si è raggiunta o meno con questa
- operazione.
+ posizione (detta anche \textit{urgent mark}) in cui sono stati ricevuti dati
+ urgenti (vedi sez.~\ref{sec:TCP_urgent_data}). Una operazione di lettura da
+ un socket non attraversa mai questa posizione, per cui è possibile
+ controllare se la si è raggiunta o meno con questa operazione.
Questo è utile quando si attiva l'opzione \const{SO\_OOBINLINE} (vedi
sez.~\ref{sec:sock_generic_options}) per ricevere i dati urgenti all'interno
dati urgenti e non il normale traffico; torneremo su questo in maggior
dettaglio in sez.~\ref{sec:TCP_urgent_data}.
-\item[\const{SIOCOUTQ}] restituisce la quantità di dati non ancora inviati
+\item[\constd{SIOCOUTQ}] restituisce la quantità di dati non ancora inviati
presenti nel buffer di spedizione; come per \const{SIOCINQ} il socket non
deve essere in stato \texttt{LISTEN}, altrimenti si avrà un errore di
\errval{EINVAL}.
\texttt{man 7 socket} sono i seguenti:
\begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}}
-\item[\sysctlrelfile{net/core}{rmem\_default}] imposta la dimensione
+\item[\sysctlrelfiled{net/core}{rmem\_default}] imposta la dimensione
di default del buffer di ricezione (cioè per i dati in ingresso) dei socket.
-\item[\sysctlrelfile{net/core}{rmem\_max}] imposta la dimensione
+\item[\sysctlrelfiled{net/core}{rmem\_max}] imposta la dimensione
massima che si può assegnare al buffer di ricezione dei socket attraverso
l'uso dell'opzione \const{SO\_RCVBUF}.
-\item[\sysctlrelfile{net/core}{wmem\_default}] imposta la dimensione
+\item[\sysctlrelfiled{net/core}{wmem\_default}] imposta la dimensione
di default del buffer di trasmissione (cioè per i dati in uscita) dei
socket.
-\item[\sysctlrelfile{net/core}{wmem\_max}] imposta la dimensione
+\item[\sysctlrelfiled{net/core}{wmem\_max}] imposta la dimensione
massima che si può assegnare al buffer di trasmissione dei socket attraverso
l'uso dell'opzione \const{SO\_SNDBUF}.
-\item[\sysctlrelfile{net/core}{message\_cost},
- \sysctlrelfile{net/core}{message\_burst}] contengono le impostazioni
- del \itindex{bucket~filter} \textit{bucket filter} che controlla l'emissione
- di messaggi di avviso da parte del 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
- analogo viene usato nel \itindex{netfilter} \textit{netfilter} per imporre
- dei limiti sul flusso dei pacchetti.} senza dovere eseguire medie
+\item[\sysctlrelfiled{net/core}{message\_cost},
+ \sysctlrelfiled{net/core}{message\_burst}] contengono le impostazioni del
+ \textit{bucket filter} che controlla l'emissione di
+ messaggi di avviso da parte del kernel per eventi relativi a problemi sulla
+ rete, imponendo un limite che consente di prevenire eventuali attacchi di
+ \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.}
+
+ \itindbeg{bucket~filter}
+
+ Il \textit{bucket filter} è un algoritmo generico che permette di impostare
+ dei limiti di flusso su una quantità\footnote{uno analogo viene usato per
+ imporre dei limiti sul flusso dei pacchetti nel \itindex{netfilter}
+ \textit{netfilter} di Linux (il \textit{netfilter} è l'infrastruttura
+ usata per il filtraggio dei pacchetti del kernel, per maggiori dettagli si
+ consulti il cap.~2 di \cite{FwGL}).} senza dovere eseguire medie
temporali, che verrebbero a dipendere in misura non controllabile dalla
dimensione dell'intervallo su cui si media e dalla distribuzione degli
eventi;\footnote{in caso di un picco di flusso (il cosiddetto
l'aver fissato un flusso di uscita garantisce che a regime questo sarà il
valore medio del flusso ottenibile dal \textit{bucket}.
+ \itindend{bucket~filter}
+
I due valori indicano rispettivamente il flusso a regime (non sarà inviato
più di un messaggio per il numero di secondi specificato da
\texttt{message\_cost}) e la dimensione iniziale per in caso di picco di
emissione (verranno accettati inizialmente fino ad un massimo di
\texttt{message\_cost/message\_burst} messaggi).
-\item[\sysctlrelfile{net/core}{netdev\_max\_backlog}] numero massimo
+\item[\sysctlrelfiled{net/core}{netdev\_max\_backlog}] numero massimo
di pacchetti che possono essere contenuti nella coda di ingresso generale.
-\item[\sysctlrelfile{net/core}{optmem\_max}] lunghezza massima dei
+\item[\sysctlrelfiled{net/core}{optmem\_max}] lunghezza massima dei
dati ancillari e di controllo (vedi sez.~\ref{sec:net_ancillary_data}).
\end{basedescript}
nel file \texttt{Documentation/networking/ip-sysctl.txt}; la maggior parte di
questi però non è documentato:
\begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}}
-\item[\sysctlrelfile{net/core}{dev\_weight}] blocco di lavoro (\textit{work
+\item[\sysctlrelfiled{net/core}{dev\_weight}] blocco di lavoro (\textit{work
quantum}) dello \textit{scheduler} di processo dei pacchetti.
% TODO da documentare meglio
-\item[\sysctlrelfile{net/core}{lo\_cong}] valore per l'occupazione
+\item[\sysctlrelfiled{net/core}{lo\_cong}] valore per l'occupazione
della coda di ricezione sotto la quale si considera di avere una bassa
congestione.
-\item[\sysctlrelfile{net/core}{mod\_cong}] valore per l'occupazione
- della coda di ricezione sotto la quale si considera di avere una congestione
+\item[\sysctlrelfiled{net/core}{mod\_cong}] valore per l'occupazione della
+ coda di ricezione sotto la quale si considera di avere una congestione
moderata.
-\item[\sysctlrelfile{net/core}{no\_cong}] valore per l'occupazione
- della coda di ricezione sotto la quale si considera di non avere
- congestione.
+\item[\sysctlrelfiled{net/core}{no\_cong}] valore per l'occupazione della coda
+ di ricezione sotto la quale si considera di non avere congestione.
-\item[\sysctlrelfile{net/core}{no\_cong\_thresh}] valore minimo
- (\textit{low water mark}) per il riavvio dei dispositivi congestionati.
+\item[\sysctlrelfiled{net/core}{no\_cong\_thresh}] valore minimo (\textit{low
+ water mark}) per il riavvio dei dispositivi congestionati.
- % \item[\sysctlrelfile{net/core}{netdev\_fastroute}] è presente
+ % \item[\sysctlrelfiled{net/core}{netdev\_fastroute}] è presente
% soltanto quando si è compilato il kernel con l'apposita opzione di
% ottimizzazione per l'uso come router.
-\item[\sysctlrelfile{net/core}{somaxconn}] imposta la dimensione
- massima utilizzabile per il \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[\sysctlrelfiled{net/core}{somaxconn}] imposta la dimensione massima
+ utilizzabile per il \textit{backlog} della funzione \func{listen} (vedi
+ sez.~\ref{sec:TCP_func_listen}), e corrisponde al valore della costante
+ \constd{SOMAXCONN}; il suo valore di default è 128.
\end{basedescript}
di manuale accessibile con \texttt{man 7 ip}, sono i seguenti:
\begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}}
-\item[\sysctlrelfile{net/ipv4}{ip\_default\_ttl}] imposta il valore di
+\item[\sysctlrelfiled{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
quanto in caso di problemi di routing si allunga inutilmente il numero di
ritrasmissioni.
-\item[\sysctlrelfile{net/ipv4}{ip\_forward}] abilita l'inoltro dei
+\item[\sysctlrelfiled{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), di default è disabilitato.
-\item[\sysctlrelfile{net/ipv4}{ip\_dynaddr}] abilita la riscrittura
+\item[\sysctlrelfiled{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
diverso dai precedenti) la si abilità in modalità \textsl{prolissa}; di
default la funzionalità è disabilitata.
-\item[\sysctlrelfile{net/ipv4}{ip\_autoconfig}] specifica se
+\item[\sysctlrelfiled{net/ipv4}{ip\_autoconfig}] specifica se
l'indirizzo IP è stato configurato automaticamente dal kernel all'avvio
attraverso DHCP, BOOTP o RARP. Riporta un valore logico (0 falso, 1 vero)
accessibile solo in lettura, è inutilizzato nei kernel recenti ed eliminato
a partire dal kernel 2.6.18.
-\item[\sysctlrelfile{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 interi separati da spazi,
- 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[\sysctlrelfile{net/ipv4}{ip\_no\_pmtu\_disc}] permette di disabilitare
+\item[\sysctlrelfiled{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 interi separati da spazi, che indicano gli estremi
+ dell'intervallo. Si abbia cura di non definire un intervallo che si
+ sovrappone a quello delle porte usate per il \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[\sysctlrelfiled{net/ipv4}{ip\_no\_pmtu\_disc}] permette di disabilitare
per i socket \const{SOCK\_STREAM} la ricerca automatica della \textit{Path
MTU} (vedi sez.~\ref{sec:net_lim_dim} e
sez.~\ref{sec:sock_ipv4_options}). Prende un valore logico, e di default è
disabilitare globalmente il procedimento con questo parametro ha pesanti
ripercussioni in termini di prestazioni di rete.
-\item[\sysctlrelfile{net/ipv4}{ip\_always\_defrag}] fa si che tutti i
+\item[\sysctlrelfiled{net/ipv4}{ip\_always\_defrag}] fa si che tutti i
pacchetti IP frammentati siano riassemblati, anche in caso in successivo
immediato inoltro.\footnote{introdotto con il kernel 2.2.13, nelle versioni
precedenti questo comportamento poteva essere solo stabilito un volta per
\texttt{CONFIG\_IP\_ALWAYS\_DEFRAG}.} Prende un valore logico e di default
è disabilitato. Con i kernel dalla serie 2.4 in poi la deframmentazione
viene attivata automaticamente quando si utilizza il sistema del
- \itindex{netfilter} \textit{netfilter}, e questo parametro non è più
- presente.
+ \textit{netfilter}, e questo parametro non è più presente.
-\item[\sysctlrelfile{net/ipv4}{ipfrag\_high\_thresh}] indica il limite
+\item[\sysctlrelfiled{net/ipv4}{ipfrag\_high\_thresh}] indica il 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}. Prende un valore intero.
-\item[\sysctlrelfile{net/ipv4}{ipfrag\_low\_thresh}] soglia bassa
+\item[\sysctlrelfiled{net/ipv4}{ipfrag\_low\_thresh}] soglia bassa
(specificata in byte) a cui viene riportata la coda dei pacchetti IP
frammentati quando si raggiunge il valore massimo dato da
\texttt{ipfrag\_high\_thresh}. Prende un valore intero.
-\item[\sysctlrelfile{net/ipv4}{ip\_nonlocal\_bind}] se abilitato rende
+\item[\sysctlrelfiled{net/ipv4}{ip\_nonlocal\_bind}] se abilitato rende
possibile ad una applicazione eseguire \func{bind} anche su un indirizzo che
non è presente su nessuna interfaccia locale. Prende un valore logico e di
default è disabilitato.
pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti:
\begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}}
-\item[\sysctlrelfile{net/ipv4}{tcp\_abort\_on\_overflow}] indica al
+\item[\sysctlrelfiled{net/ipv4}{tcp\_abort\_on\_overflow}] indica al
kernel di azzerare le connessioni quando il programma che le riceve è troppo
lento ed incapace di accettarle. Prende un valore logico ed è disabilitato
di default. Questo consente di recuperare le connessioni se si è avuto un
quando si è sicuri che non è possibile ottimizzare il server in modo che sia
in grado di accettare connessioni più rapidamente.
-\item[\sysctlrelfile{net/ipv4}{tcp\_adv\_win\_scale}] indica al kernel quale
+\item[\sysctlrelfiled{net/ipv4}{tcp\_adv\_win\_scale}] indica al kernel quale
frazione del buffer associato ad un socket\footnote{quello impostato con
\sysctlrelfile{net/ipv4}{tcp\_rmem}.} deve essere utilizzata per la
finestra del protocollo TCP\footnote{in sostanza il valore che costituisce
negativo. Il default è 2 che significa che al buffer dell'applicazione
viene riservato un quarto del totale.
-\item[\sysctlrelfile{net/ipv4}{tcp\_app\_win}] indica la frazione della
+\item[\sysctlrelfiled{net/ipv4}{tcp\_app\_win}] indica la frazione della
finestra TCP che viene riservata per gestire l'overhaed dovuto alla
bufferizzazione. Prende un valore valore intero che consente di calcolare la
- dimensione in byte come il massimo fra la
- \itindex{Maximum~Segment~Size~(MSS)} MSS e
+ dimensione in byte come il massimo fra la MSS e
$\texttt{window}/2^\texttt{tcp\_app\_win}$. Un valore nullo significa che
non viene riservato nessuno spazio; il valore di default è 31.
% \item[\texttt{tcp\_bic\_low\_window}]
% \item[\texttt{tcp\_bic\_fast\_convergence}]
-\item[\sysctlrelfile{net/ipv4}{tcp\_dsack}] abilita il supporto,
+\item[\sysctlrelfiled{net/ipv4}{tcp\_dsack}] abilita il supporto,
definito nell'\href{http://www.ietf.org/rfc/rfc2884.txt}{RFC~2884}, per il
cosiddetto \textit{Duplicate SACK}.\footnote{si indica con SACK
(\textit{Selective Acknowledgement}) un'opzione TCP, definita
% mettere riferimento nelle appendici
-\item[\sysctlrelfile{net/ipv4}{tcp\_ecn}] abilita il meccanismo della
+\item[\sysctlrelfiled{net/ipv4}{tcp\_ecn}] abilita il meccanismo della
\textit{Explicit Congestion Notification} (in breve ECN) nelle connessioni
TCP. Prende valore logico che di default è disabilitato. La \textit{Explicit
Congestion Notification} \itindex{Explicit~Congestion~Notification} è un
% mettere riferimento nelle appendici
-\item[\sysctlrelfile{net/ipv4}{tcp\_fack}] abilita il supporto per il
+\item[\sysctlrelfiled{net/ipv4}{tcp\_fack}] abilita il supporto per il
\textit{TCP Forward Acknowledgement}, un algoritmo per il controllo della
congestione del traffico. Prende un valore logico e di default è abilitato.
% TODO documentare o descrivere che cos'è il TCP Forward Acknowledgement o
% mettere riferimento nelle appendici
-\item[\sysctlrelfile{net/ipv4}{tcp\_fin\_timeout}] specifica il numero
- di secondi da passare in stato \texttt{FIN\_WAIT2} nell'attesa delle
- ricezione del pacchetto FIN conclusivo, passati quali il socket viene
- comunque chiuso forzatamente. Prende un valore intero che indica i secondi
- e di default è 60.\footnote{nei kernel della serie 2.2.x era il valore
- utilizzato era invece di 120 secondi.} 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[\sysctlrelfile{net/ipv4}{tcp\_frto}] abilita il supporto per
+\item[\sysctlrelfiled{net/ipv4}{tcp\_fin\_timeout}] specifica il numero di
+ secondi da passare in stato \texttt{FIN\_WAIT2} nell'attesa delle ricezione
+ del pacchetto FIN conclusivo, passati quali il socket viene comunque chiuso
+ forzatamente. Prende un valore intero che indica i secondi e di default è
+ 60.\footnote{nei kernel della serie 2.2.x era il valore utilizzato era
+ invece di 120 secondi.} L'uso di questa opzione realizza quella che in
+ sostanza è una violazione delle specifiche del protocollo TCP, ma è utile
+ per fronteggiare alcuni attacchi di \textit{Denial of Service}.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_frto}] 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. Prende un valore logico e di default è
disabilitato.
-\item[\sysctlrelfile{net/ipv4}{tcp\_keepalive\_intvl}] indica il
+\item[\sysctlrelfiled{net/ipv4}{tcp\_keepalive\_intvl}] indica 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}). Prende un valore intero che di
default è 75.
-\item[\sysctlrelfile{net/ipv4}{tcp\_keepalive\_probes}] indica il
+\item[\sysctlrelfiled{net/ipv4}{tcp\_keepalive\_probes}] indica 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. Prende un valore intero che di default è 9.
-\item[\sysctlrelfile{net/ipv4}{tcp\_keepalive\_time}] indica il numero
+\item[\sysctlrelfiled{net/ipv4}{tcp\_keepalive\_time}] indica il numero
di secondi che devono passare senza traffico sulla connessione prima che il
kernel inizi ad inviare pacchetti di pacchetti di
\textit{keepalive}.\footnote{ha effetto solo per i socket per cui si è
sez.~\ref{sec:sock_options_main}.} Prende un valore intero che di default
è 7200, pari a due ore.
-\item[\sysctlrelfile{net/ipv4}{tcp\_low\_latency}] indica allo stack
+\item[\sysctlrelfiled{net/ipv4}{tcp\_low\_latency}] 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. Prende un
valore logico che di default è disabilitato in quanto un maggior utilizzo
riduzione della latenza è più importante (ad esempio per i cluster di
calcolo parallelo) nelle quali lo si può abilitare.
-\item[\sysctlrelfile{net/ipv4}{tcp\_max\_orphans}] indica il numero
+\item[\sysctlrelfiled{net/ipv4}{tcp\_max\_orphans}] indica 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
% TODO verificare la spiegazione di connessione orfana.
-\item[\sysctlrelfile{net/ipv4}{tcp\_max\_syn\_backlog}] 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[\sysctlrelfiled{net/ipv4}{tcp\_max\_syn\_backlog}] 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 \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. Prende un valore intero; il default, che
del kernel, in modo che sia $\mathtt{tcp\_max\_syn\_backlog} \ge
\mathtt{16*TCP\_SYNQ\_HSIZE}$, per poi ricompilare il kernel.}
-\item[\sysctlrelfile{net/ipv4}{tcp\_max\_tw\_buckets}] indica il
+\item[\sysctlrelfiled{net/ipv4}{tcp\_max\_tw\_buckets}] indica il
numero massimo di socket in stato \texttt{TIME\_WAIT} consentito nel
sistema. Prende un valore intero di default è impostato al doppio del valore
del parametro \texttt{NR\_FILE}, ma che viene aggiustato automaticamente a
prevenire alcuni semplici attacchi di \textit{denial of service}.
-\item[\sysctlrelfile{net/ipv4}{tcp\_mem}] viene usato dallo stack TCP
+\item[\sysctlrelfiled{net/ipv4}{tcp\_mem}] viene usato dallo stack TCP
per gestire le modalità con cui esso utilizzerà la memoria. Prende una
tripletta di valori interi, che indicano un numero di pagine:
ogni altro valore specificato dagli altri limiti del kernel.
\end{itemize*}
-\item[\sysctlrelfile{net/ipv4}{tcp\_orphan\_retries}] indica il numero
+\item[\sysctlrelfiled{net/ipv4}{tcp\_orphan\_retries}] indica 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. Prende un valore
intero che di default è 8.
-\item[\sysctlrelfile{net/ipv4}{tcp\_reordering}] indica il numero
+\item[\sysctlrelfiled{net/ipv4}{tcp\_reordering}] indica 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{sec:tcp_protocol_xxx}) viene usata
ritrasmissioni provocate dal riordinamento. Prende un valore intero che di
default che è 3, e che non è opportuno modificare.
-\item[\sysctlrelfile{net/ipv4}{tcp\_retrans\_collapse}] in caso di
+\item[\sysctlrelfiled{net/ipv4}{tcp\_retrans\_collapse}] in caso di
pacchetti persi durante una connessione, per ottimizzare l'uso della banda
il kernel cerca di eseguire la ritrasmissione inviando pacchetti della
massima dimensione possibile; in sostanza dati che in precedenza erano stati
pacchetto (o su un numero minore di pacchetti di dimensione
maggiore). Prende un valore logico e di default è abilitato.
-\item[\sysctlrelfile{net/ipv4}{tcp\_retries1}] imposta il massimo
+\item[\sysctlrelfiled{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
aggiornamento della rotta verso la destinazione prima di eseguire ogni
successiva ritrasmissione. Prende un valore intero che di default è 3.
-\item[\sysctlrelfile{net/ipv4}{tcp\_retries2}] imposta il numero di
+\item[\sysctlrelfiled{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}). Prende un
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[\sysctlrelfile{net/ipv4}{tcp\_rfc1337}] indica al kernel di
+\item[\sysctlrelfiled{net/ipv4}{tcp\_rfc1337}] indica al kernel di
abilitare il comportamento richiesto
nell'\href{http://www.ietf.org/rfc/rfc1337.txt}{RFC~1337}. Prende un valore
logico e di default è disabilitato, il che significa che alla ricezione di
immediatamente senza attendere la conclusione del periodo di
\texttt{TIME\_WAIT}.
-\item[\sysctlrelfile{net/ipv4}{tcp\_rmem}] viene usato dallo stack TCP
+\item[\sysctlrelfiled{net/ipv4}{tcp\_rmem}] viene usato dallo stack TCP
per controllare dinamicamente le dimensioni dei propri buffer di ricezione,
anche in rapporto alla memoria disponibile. Prende una tripletta di valori
interi separati da spazi che indicano delle dimensioni in byte:
\item il secondo valore, denominato \textit{default} nelle pagine di
manuale, indica la dimensione di default, in byte, del buffer di ricezione
di un socket TCP. Questo valore sovrascrive il default iniziale impostato
- per tutti i socket con \sysctlfile{net/core/mem\_default} che vale
- per qualunque protocollo. Il default è 87380 byte, ridotto a 43689 per
- sistemi con poca memoria. Se si desiderano dimensioni più ampie per tutti
- i socket si può aumentare questo valore, ma se si vuole che in
- corrispondenza aumentino anche le dimensioni usate per la finestra TCP si
- deve abilitare il \itindex{TCP~window~scaling} \textit{TCP window scaling}
- (di default è abilitato, vedi più avanti
+ per tutti i socket con \sysctlfile{net/core/mem\_default} che vale per
+ qualunque protocollo. Il default è 87380 byte, ridotto a 43689 per sistemi
+ con poca memoria. Se si desiderano dimensioni più ampie per tutti i socket
+ si può aumentare questo valore, ma se si vuole che in corrispondenza
+ aumentino anche le dimensioni usate per la finestra TCP si deve abilitare
+ il \textit{TCP window scaling} (di default è abilitato, vedi più avanti
\sysctlrelfile{net/ipv4}{tcp\_window\_scaling}).
\item il terzo valore, denominato \textit{max} nelle pagine di manuale,
dichiarata con l'opzione \const{SO\_RCVBUF}.
\end{itemize}
-\item[\sysctlrelfile{net/ipv4}{tcp\_sack}] indica al kernel di
+\item[\sysctlrelfiled{net/ipv4}{tcp\_sack}] indica al kernel di
utilizzare il meccanismo del \textit{TCP selective acknowledgement} definito
nell'\href{http://www.ietf.org/rfc/rfc2018.txt}{RFC~2018}. Prende un valore
logico e di default è abilitato.
-\item[\sysctlrelfile{net/ipv4}{tcp\_stdurg}] indica al kernel di
+\item[\sysctlrelfiled{net/ipv4}{tcp\_stdurg}] indica al kernel di
utilizzare l'interpretazione che viene data
dall'\href{http://www.ietf.org/rfc/rfc1122.txt}{RFC~1122} del puntatore dei
\textit{dati urgenti} (vedi sez.~\ref{sec:TCP_urgent_data}) in cui questo
Prende un valore logico e di default è disabilitato, perché abilitarlo può
dar luogo a problemi di interoperabilità.
-\item[\sysctlrelfile{net/ipv4}{tcp\_synack\_retries}] indica il numero
+\item[\sysctlrelfiled{net/ipv4}{tcp\_synack\_retries}] indica il numero
massimo di volte che verrà ritrasmesso il segmento SYN/ACK nella creazione di
una connessione (vedi sez.~\ref{sec:TCP_conn_cre}). Prende un valore intero
ed il valore di default è 5; non si deve superare il valore massimo di 255.
-\item[\sysctlrelfile{net/ipv4}{tcp\_syncookies}] abilita i \textit{TCP
+\item[\sysctlrelfiled{net/ipv4}{tcp\_syncookies}] abilita i \textit{TCP
syncookies}.\footnote{per poter usare questa funzionalità è necessario
avere abilitato l'opzione \texttt{CONFIG\_SYN\_COOKIES} nella compilazione
del kernel.} Prende un valore logico, e di default è disabilitato. Questa
funzionalità serve a fornire una protezione in caso di un attacco di tipo
- \index{SYN~flood} \textit{SYN flood}, e deve essere utilizzato come ultima
- risorsa dato che costituisce una violazione del protocollo TCP e confligge
- con altre funzionalità come le estensioni e può causare problemi per i
- client ed il reinoltro dei pacchetti.
-
-\item[\sysctlrelfile{net/ipv4}{tcp\_syn\_retries}] imposta il numero
- di tentativi 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}). Prende un valore
- intero che di default è 5; non si deve superare il valore massimo di 255.
-
-\item[\sysctlrelfile{net/ipv4}{tcp\_timestamps}] abilita l'uso dei
+ \textit{SYN flood}, e deve essere utilizzato come ultima risorsa dato che
+ costituisce una violazione del protocollo TCP e confligge con altre
+ funzionalità come le estensioni e può causare problemi per i client ed il
+ reinoltro dei pacchetti.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_syn\_retries}] imposta il numero di
+ tentativi di ritrasmissione dei pacchetti SYN di inizio connessione del
+ \textit{three way handshake} (si ricordi quanto illustrato in
+ sez.~\ref{sec:TCP_func_connect}). Prende un valore intero che di default è
+ 5; non si deve superare il valore massimo di 255.
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_timestamps}] abilita l'uso dei
\textit{TCP timestamps}, come definiti
nell'\href{http://www.ietf.org/rfc/rfc1323.txt}{RFC~1323}. Prende un valore
logico e di default è abilitato.
-\item[\sysctlrelfile{net/ipv4}{tcp\_tw\_recycle}] abilita il
- riutilizzo rapido dei socket in stato \texttt{TIME\_WAIT}. Prende un valore
- logico e di default è disabilitato. Non è opportuno abilitare questa opzione
- che può causare problemi con il NAT.\footnote{il \textit{Network Address
- Translation} è una tecnica, impiegata nei firewall e nei router, che
- consente di modificare al volo gli indirizzi dei pacchetti che transitano
- per una macchina, Linux la supporta con il \itindex{netfilter}
- \textit{netfilter}, per maggiori dettagli si consulti il cap.~2 di
- \cite{FwGL}.}
-
-\item[\sysctlrelfile{net/ipv4}{tcp\_tw\_reuse}] abilita il riutilizzo
+\item[\sysctlrelfiled{net/ipv4}{tcp\_tw\_recycle}] abilita il riutilizzo
+ rapido dei socket in stato \texttt{TIME\_WAIT}. Prende un valore logico e di
+ default è disabilitato. Non è opportuno abilitare questa opzione che può
+ causare problemi con il NAT.\footnote{il
+ \itindex{Network~Address~Translation} \textit{Network Address Translation}
+ è una tecnica, impiegata nei firewall e nei router, che consente di
+ modificare al volo gli indirizzi dei pacchetti che transitano per una
+ macchina, Linux la supporta con il \textit{netfilter}.}
+
+\item[\sysctlrelfiled{net/ipv4}{tcp\_tw\_reuse}] abilita il riutilizzo
dello stato \texttt{TIME\_WAIT} quando questo è sicuro dal punto di vista
del protocollo. Prende un valore logico e di default è disabilitato.
-\item[\sysctlrelfile{net/ipv4}{tcp\_window\_scaling}] un valore
+\item[\sysctlrelfiled{net/ipv4}{tcp\_window\_scaling}] un valore
logico, attivo di default, che abilita la funzionalità del
\itindex{TCP~window~scaling} \textit{TCP window scaling} definita
dall'\href{http://www.ietf.org/rfc/rfc1323.txt}{RFC~1323}. Prende un valore
\itindex{TCP~window~scaling} \textit{TCP window scaling} con l'altro capo
della connessione non viene effettuata.
-%\item[\sysctlrelfile{net/ipv4}{tcp\_vegas\_cong\_avoid}]
+%\item[\sysctlrelfiled{net/ipv4}{tcp\_vegas\_cong\_avoid}]
% TODO: controllare su internet
-%\item[\sysctlrelfile{net/ipv4}{tcp\_westwood}]
+%\item[\sysctlrelfiled{net/ipv4}{tcp\_westwood}]
% TODO: controllare su internet
-\item[\sysctlrelfile{net/ipv4}{tcp\_wmem}] viene usato dallo stack TCP
+\item[\sysctlrelfiled{net/ipv4}{tcp\_wmem}] viene usato dallo stack TCP
per controllare dinamicamente le dimensioni dei propri buffer di spedizione,
adeguandole in rapporto alla memoria disponibile. Prende una tripletta di
valori interi separati da spazi che indicano delle dimensioni in byte:
\item il secondo valore, denominato \textit{default}, indica la dimensione
di default in byte del buffer di spedizione di un socket TCP. Questo
valore sovrascrive il default iniziale impostato per tutti i tipi di
- socket con \sysctlfile{net/core/wmem\_default}. Il default è 87380
- byte, ridotto a 43689 per sistemi con poca memoria. Si può aumentare
- questo valore quando si desiderano dimensioni più ampie del buffer di
+ socket con \sysctlfile{net/core/wmem\_default}. Il default è 87380 byte,
+ ridotto a 43689 per sistemi con poca memoria. Si può aumentare questo
+ valore quando si desiderano dimensioni più ampie del buffer di
trasmissione per i socket TCP, ma come per il precedente
- \sysctlrelfile{net/ipv4}{tcp\_rmem}) se si vuole che in
- corrispondenza aumentino anche le dimensioni usate per la finestra TCP si
- deve abilitare il \itindex{TCP~window~scaling} \textit{TCP window scaling}
- con \sysctlrelfile{net/ipv4}{tcp\_window\_scaling}.
+ \sysctlrelfile{net/ipv4}{tcp\_rmem}) se si vuole che in corrispondenza
+ aumentino anche le dimensioni usate per la finestra TCP si deve abilitare
+ il \textit{TCP window scaling} con
+ \sysctlrelfile{net/ipv4}{tcp\_window\_scaling}.
\item il terzo valore, denominato \textit{max}, indica la dimensione massima
in byte del buffer di spedizione di un socket TCP; il default è 128Kb, che