%% sockctrl.tex
%%
-%% Copyright (C) 2004-2011 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2004-2014 Simone Piccardi. Permission is granted to
%% copy, distribute and/or modify this document under the terms of the GNU Free
%% Documentation License, Version 1.1 or any later version published by the
%% Free Software Foundation; with the Invariant Sections being "Prefazione",
predefinito e non modificabile (a meno di una ricompilazione delle librerie
stesse).}
-\itindbeg{Name~Service~Switch}
+\itindbeg{Name~Service~Switch~(NSS)}
Per risolvere questa serie di problemi la risoluzione dei nomi a dominio
eseguirà dal \textit{resolver} è stata inclusa all'interno di un meccanismo
generico per la risoluzione di corrispondenze fra nomi ed informazioni ad essi
\hline
\hline
\texttt{passwd} & Corrispondenze fra nome dell'utente e relative
- proprietà (\acr{uid}, gruppo principale, ecc.).\\
+ proprietà (\ids{UID}, gruppo principale, ecc.).\\
\texttt{shadow} & Corrispondenze fra username e password dell'utente
(e altre informazioni relative alle password).\\
\texttt{group} & Corrispondenze fra nome del gruppo e proprietà dello
disposizione,\footnote{è cura della implementazione fattane nelle \acr{glibc}
tenere conto della presenza del \textit{Name Service Switch}.} e sono queste
quelle che tratteremo nelle sezioni successive.
-\itindend{Name~Service~Switch}
+\itindend{Name~Service~Switch~(NSS)}
\subsection{Le funzioni di interrogazione del \textit{resolver}}
sono specificati server verrà utilizzato l'indirizzo locale, e se non è
definito un dominio di default sarà usato quello associato con l'indirizzo
locale (ma questo può essere sovrascritto con l'uso della variabile di
-ambiente \texttt{LOCALDOMAIN}). In genere non è necessario eseguire questa
+ambiente \envvar{LOCALDOMAIN}). In genere non è necessario eseguire questa
funzione direttamente in quanto viene automaticamente chiamata la prima volta
che si esegue una delle altre.
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 \file{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:
+usata da tutte queste funzioni. Essa viene definita in \headfile{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:
\includecodesnip{listati/resolv_option.c}
Tutti i campi della struttura sono ad uso interno, e vengono usualmente
\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
- \texttt{HOSTALIASES}.\\
+ \envvar{HOSTALIASES}.\\
\const{RES\_USE\_INET6} & Restituisce indirizzi IPv6 con
\func{gethostbyname}. \\
\const{RES\_ROTATE} & Ruota la lista dei server DNS dopo ogni
modificarli direttamente; gran parte di essi sono infatti impostati dal
contenuto dei file di configurazione, mentre le funzionalità controllate da
alcuni di esse possono essere modificate con l'uso delle opportune variabili
-di ambiente come abbiamo visto per \texttt{LOCALDOMAIN}. In particolare con
-\texttt{RES\_RETRY} si soprassiede il valore del campo \var{retry} che
+di ambiente come abbiamo visto per \envvar{LOCALDOMAIN}. In particolare con
+\envvar{RES\_RETRY} si soprassiede il valore del campo \var{retry} che
controlla quante volte viene ripetuto il tentativo di connettersi ad un server
DNS prima di dichiarare fallimento; il valore di default è 4, un valore nullo
-significa bloccare l'uso del DNS. Infine con \texttt{RES\_TIMEOUT} si
+significa bloccare l'uso del DNS. Infine con \envvar{RES\_TIMEOUT} si
soprassiede il valore del campo \var{retrans},\footnote{preimpostato al valore
- della omonima costante \const{RES\_TIMEOUT} di \file{resolv.h}.} che è il
-valore preso come base (in numero di secondi) per definire la scadenza di una
-richiesta, ciascun tentativo di richiesta fallito viene ripetuto raddoppiando
-il tempo di scadenza per il numero massimo di volte stabilito da
+ della omonima costante \const{RES\_TIMEOUT} di \headfile{resolv.h}.} che è
+il valore preso come base (in numero di secondi) per definire la scadenza di
+una richiesta, ciascun tentativo di richiesta fallito viene ripetuto
+raddoppiando il tempo di scadenza per il numero massimo di volte stabilito da
\texttt{RES\_RETRY}.
La funzione di interrogazione principale è \funcd{res\_query}, che serve ad
eseguire una richiesta ad un server DNS per un nome a dominio
-\textsl{completamente specificato} (quello che si chiama FQDN, \textit{Fully
- Qualified Domain Name}); il suo prototipo è:
+\textsl{completamente specificato} (quello che si chiama
+\itindex{Fully~Qualified~Domain~Name~(FQDN)} FQDN, \textit{Fully Qualified
+ Domain Name}); il suo prototipo è:
\begin{functions}
\headdecl{netinet/in.h}
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
- \file{arpa/nameser.h} e \file{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
+ \headfile{arpa/nameser.h} e \headfile{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)
hanno gli stessi nomi usati per identificare i record nei file di zona di
BIND,\footnote{BIND, acronimo di \textit{Berkley Internet Name Domain}, è una
implementazione di un server DNS, ed, essendo utilizzata nella stragrande
- maggioranza dei casi, fa da riferimento; i dati relativi ad un certo
- dominio (cioè i suoi \textit{resource record} vengono mantenuti in quelli
- che sono usualmente chiamati \textsl{file di zona}, e in essi ciascun tipo
- di dominio è identificato da un nome che è appunto identico a quello delle
- costanti di tab.~\ref{tab:DNS_record_type} senza il \texttt{T\_} iniziale.}
-e che normalmente sono anche usati come nomi per indicare i record.
+ maggioranza dei casi, fa da riferimento; i dati relativi ad un certo dominio
+ (cioè i suoi \textit{resource record} vengono mantenuti in quelli che sono
+ usualmente chiamati \textsl{file di zona}, e in essi ciascun tipo di dominio
+ è identificato da un nome che è appunto identico a quello delle costanti di
+ tab.~\ref{tab:DNS_record_type} senza il \texttt{T\_} iniziale.} e che
+normalmente sono anche usati come nomi per indicare i record.
\begin{table}[!htb]
\centering
In questo caso la funzione prende un secondo argomento \param{af} che indica
(i soli valori consentiti sono \const{AF\_INET} o \const{AF\_INET6}, per
-questo è necessario l'uso di \texttt{sys/socket.h}) la famiglia di indirizzi
+questo è necessario l'uso di \headfile{sys/socket.h}) la famiglia di indirizzi
che dovrà essere utilizzata nei risultati restituiti dalla funzione. Per tutto
il resto la funzione è identica a \func{gethostbyname}, ed identici sono i
suoi risultati.
\noindent e come si può vedere la funzione è estremamente semplice, non
richiedendo nessun argomento.
+% TODO manca gethostent (e gethostent_r) e altro ? (vedi man page)
Infine si può richiedere la risoluzione inversa di un indirizzo IP od IPv6,
per ottenerne il nome a dominio ad esso associato, per fare questo si può
generale infatti ci sono una serie di funzioni nella forma
\texttt{getXXXbyname} e \texttt{getXXXbyaddr} (dove \texttt{XXX} indica il
servizio) per ciascuna delle informazioni di rete mantenute dal
-\itindex{Name~Service~Switch} \textit{Name Service Switch} che permettono
+\itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch} che permettono
rispettivamente di trovare una corrispondenza cercando per nome o per numero.
L'elenco di queste funzioni è riportato nelle colonne finali di
al tipo di informazione che forniscono (riportato in prima colonna). Nella
tabella si è anche riportato il file su cui vengono ordinariamente mantenute
queste informazioni, che però può essere sostituito da un qualunque supporto
-interno al \itindex{Name~Service~Switch} \textit{Name Service Switch} (anche
-se usualmente questo avviene solo per la risoluzione degli indirizzi).
+interno al \itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch}
+(anche se usualmente questo avviene solo per la risoluzione degli indirizzi).
Ciascuna funzione fa riferimento ad una sua apposita struttura che contiene i
relativi dati, riportata in terza colonna.
indirizzo &\conffile{/etc/hosts}&\struct{hostent}&\func{gethostbyname}&
\func{gethostbyaddr}\\
servizio &\conffile{/etc/services}&\struct{servent}&\func{getservbyname}&
- \func{getservbyaddr}\\
- rete &\conffile{/etc/networks}&\struct{netent}&\func{getnetbyname}&
- \func{getnetbyaddr}\\
+ \func{getservbyport}\\
+ rete &\conffile{/etc/networks}&\struct{netent}&\funcm{getnetbyname}&
+ \funcm{getnetbyaddr}\\
protocollo&\conffile{/etc/protocols}&\struct{protoent}&
- \func{getprotobyname}&\func{getprotobyaddr}\\
+ \funcm{getprotobyname}&\funcm{getprotobyaddr}\\
\hline
\end{tabular}
\caption{Funzioni di risoluzione dei nomi per i vari servizi del
- \itindex{Name~Service~Switch} \textit{Name Service Switch}.}
+ \itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch}.}
\label{tab:name_resolution_functions}
\end{table}
finora soltanto quelle relative alla risoluzione dei nomi, dato che sono le
più usate, e prevedono praticamente da sempre la necessità di rivolgersi ad
una entità esterna; per le altre invece, estensioni fornite dal
-\itindex{Name~Service~Switch} NSS a parte, si fa sempre riferimento ai dati
-mantenuti nei rispettivi file.
+\itindex{Name~Service~Switch~(NSS)} NSS a parte, si fa sempre riferimento ai
+dati mantenuti nei rispettivi file.
Dopo la risoluzione dei nomi a dominio una delle ricerche più comuni è quella
sui nomi dei servizi di rete più comuni (cioè \texttt{http}, \texttt{smtp},
ecc.) da associare alle rispettive porte. Le due funzioni da utilizzare per
-questo sono \funcd{getservbyname} e \funcd{getservbyaddr}, che permettono
+questo sono \funcd{getservbyname} e \funcd{getservbyport}, che permettono
rispettivamente di ottenere il numero di porta associato ad un servizio dato
il nome e viceversa; i loro prototipi sono:
\begin{functions}
specificato tramite la stringa \param{name}, mentre \func{getservbyport}
richiede il numero di porta in \param{port}. Entrambe le funzioni eseguono una
ricerca sul file \conffile{/etc/services}\footnote{il
- \itindex{Name~Service~Switch} \textit{Name Service Switch} astrae il
+ \itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch} astrae il
concetto a qualunque supporto su cui si possano mantenere i suddetti dati.}
ed estraggono i dati dalla prima riga che corrisponde agli argomenti
specificati; se la risoluzione ha successo viene restituito un puntatore ad
Oltre alle funzioni di ricerca esistono delle ulteriori funzioni che prevedono
una lettura sequenziale delle informazioni mantenute nel
-\itindex{Name~Service~Switch} \textit{Name Service Switch} (in sostanza
+\itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch} (in sostanza
permettono di leggere i file contenenti le informazioni riga per riga), che
sono analoghe a quelle elencate in tab.~\ref{tab:sys_passwd_func} per le
informazioni relative ai dati degli utenti e dei gruppi. Nel caso specifico
aperto riporta la posizione di lettura alla prima voce del file, in questo
modo si può far ricominciare da capo una lettura sequenziale. L'argomento
\param{stayopen}, se diverso da zero, fa sì che il file resti aperto anche fra
-diverse chiamate a \func{getservbyname} e \func{getservbyaddr}.\footnote{di
+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.
\hline
indirizzo &\func{sethostent} &\func{gethostent} &\func{endhostent} \\
servizio &\func{setservent} &\func{getservent} &\func{endservent}\\
- rete &\func{setnetent} &\func{getnetent} &\func{endnetent}\\
- protocollo&\func{setprotoent}&\func{getprotoent}&\func{endprotoent}\\
+ rete &\funcm{setnetent} &\funcm{getnetent} &\funcm{endnetent}\\
+ protocollo&\funcm{setprotoent}&\funcm{getprotoent}&\funcm{endprotoent}\\
\hline
\end{tabular}
\caption{Funzioni lettura sequenziale dei dati del
- \itindex{Name~Service~Switch} \textit{Name Service Switch}.}
+ \itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch}.}
\label{tab:name_sequential_read}
\end{table}
\end{figure}
Come illustrato la struttura \struct{addrinfo}, la cui definizione\footnote{la
- definizione è ripresa direttamente dal file \texttt{netdb.h} in questa
+ 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
Come per i codici di errore di \func{gethostbyname} anche in questo caso è
fornita una apposita funzione, analoga di \func{strerror}, che consente di
utilizzarli direttamente per stampare a video un messaggio esplicativo; la
-funzione è \func{gai\_strerror} ed il suo prototipo è:
+funzione è \funcd{gai\_strerror} ed il suo prototipo è:
\begin{functions}
\headdecl{netdb.h}
Anche la nuova interfaccia definita da POSIX prevede una nuova funzione per
eseguire la risoluzione inversa e determinare nomi di servizi e di dominio
dati i rispettivi valori numerici. La funzione che sostituisce le varie
-\func{gethostbyname}, \func{getipnodebyname} e \func{getservname} è
+\func{gethostbyname}, \func{getipnodebyname} e \func{getservbyname} è
\funcd{getnameinfo}, ed il suo prototipo è:
\begin{functions}
\headdecl{sys/socket.h}
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
- sono definite in \file{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 illustrati in
-tab.~\ref{tab:addrinfo_error_code}.
+ 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
+illustrati in tab.~\ref{tab:addrinfo_error_code}.
A questo punto possiamo fornire degli esempi di utilizzo della nuova
interfaccia, adottandola per le precedenti implementazioni del client e del
connessione al server, e quello in cui si specifica nel server un indirizzo
locale su cui porsi in ascolto.
-La prima funzione della nostra interfaccia semplificata è \func{sockconn} che
-permette di ottenere un socket, connesso all'indirizzo ed al servizio
+La prima funzione della nostra interfaccia semplificata è \texttt{sockconn}
+che permette di ottenere un socket, connesso all'indirizzo ed al servizio
specificati. Il corpo della funzione è riportato in
fig.~\ref{fig:sockconn_code}, il codice completo è nel file \file{SockUtil.c}
dei sorgenti allegati alla guida, che contiene varie funzioni di utilità per
\includecodesample{listati/sockconn.c}
\end{minipage}
\normalsize
- \caption{Il codice della funzione \func{sockconn}.}
+ \caption{Il codice della funzione \texttt{sockconn}.}
\label{fig:sockconn_code}
\end{figure}
prima (\texttt{\small 6}) azzera il contenuto della struttura \var{hint} e poi
provvede (\texttt{\small 7--9}) ad inizializzarne i valori necessari per la
chiamata (\texttt{\small 10}) a \func{getaddrinfo}. Di quest'ultima si
-controlla (\texttt{\small 12-16}) il codice di ritorno, in modo da stampare un
+controlla (\texttt{\small 12--16}) il codice di ritorno, in modo da stampare un
avviso di errore, azzerare \var{errno} ed uscire in caso di errore. Dato che
ad una macchina possono corrispondere più indirizzi IP, e di tipo diverso (sia
IPv4 che IPv6), mentre il servizio può essere in ascolto soltanto su uno solo
di questi, si provvede a tentare la connessione per ciascun indirizzo
-restituito all'interno di un ciclo (\texttt{\small 18-40}) di scansione della
+restituito all'interno di un ciclo (\texttt{\small 18--40}) di scansione della
lista restituita da \func{getaddrinfo}, ma prima (\texttt{\small 17}) si salva
il valore del puntatore per poterlo riutilizzare alla fine per disallocare la
lista.
fallisce si controlla (\texttt{\small 20}) se sono disponibili altri
indirizzi, nel qual caso si passa al successivo (\texttt{\small 21}) e si
riprende (\texttt{\small 22}) il ciclo da capo; se non ve ne sono si stampa
-l'errore ritornando immediatamente (\texttt{\small 24-27}). Quando la
+l'errore ritornando immediatamente (\texttt{\small 24--27}). Quando la
creazione del socket ha avuto successo si procede (\texttt{\small 29})
direttamente con la connessione, di nuovo in caso di fallimento viene ripetuto
(\texttt{\small 30--38}) il controllo se vi sono o no altri indirizzi da
Si noti come per la funzione sia del tutto irrilevante se la struttura
ritornata contiene indirizzi IPv6 o IPv4, in quanto si fa uso direttamente dei
dati relativi alle strutture degli indirizzi di \struct{addrinfo} che sono
-\textsl{opachi} rispetto all'uso della funzione \func{connect}.
+\index{tipo!opaco} opachi rispetto all'uso della funzione \func{connect}.
\begin{figure}[!htbp]
\footnotesize \centering
avremo una semplificazione per cui il corpo principale del nostro client
diventerà quello illustrato in fig.~\ref{fig:TCP_echo_fifth}, in cui le
chiamate a \func{socket}, \func{inet\_pton} e \func{connect} sono sostituite
-da una singola chiamata a \func{sockconn}. Inoltre il nuovo client (il cui
+da una singola chiamata a \texttt{sockconn}. Inoltre il nuovo client (il cui
codice completo è nel file \file{TCP\_echo\_fifth.c} dei sorgenti allegati)
consente di utilizzare come argomento del programma un nome a dominio al posto
dell'indirizzo numerico, e può utilizzare sia indirizzi IPv4 che IPv6.
\includecodesample{listati/sockbind.c}
\end{minipage}
\normalsize
- \caption{Il codice della funzione \func{sockbind}.}
+ \caption{Il codice della funzione \texttt{sockbind}.}
\label{fig:sockbind_code}
\end{figure}
-La seconda funzione di ausilio è \func{sockbind}, il cui corpo principale è
+La seconda funzione di ausilio è \texttt{sockbind}, il cui corpo principale è
riportato in fig.~\ref{fig:sockbind_code} (al solito il sorgente completo è
nel file \file{sockbind.c} dei sorgenti allegati alla guida). Come si può
-notare la funzione è del tutto analoga alla precedente \func{sockconn}, e
+notare la funzione è del tutto analoga alla precedente \texttt{sockconn}, e
prende gli stessi argomenti, però invece di eseguire una connessione con
\func{connect} si limita a chiamare \func{bind} per collegare il socket ad una
porta.
del valore \const{AI\_PASSIVE} serve ad ottenere il valore generico nella
rispettiva struttura degli indirizzi.
-Come già detto la funzione è analoga a \func{sockconn} ed inizia azzerando ed
-inizializzando (\texttt{\small 6-11}) opportunamente la struttura \var{hint}
-con i valori ricevuti come argomenti, soltanto che in questo caso si è usata
-(\texttt{\small 8}) una impostazione specifica dei flag di \var{hint} usando
-\const{AI\_PASSIVE} per indicare che il socket sarà usato per una apertura
-passiva. Per il resto la chiamata (\texttt{\small 12-18}) a \func{getaddrinfo}
-e ed il ciclo principale (\texttt{\small 20--42}) sono identici, solo che si è
-sostituita (\texttt{\small 31}) la chiamata a \func{connect} con una chiamata
-a \func{bind}. Anche la conclusione (\texttt{\small 43--44}) della funzione è
-identica.
+Come già detto la funzione è analoga a \texttt{sockconn} ed inizia azzerando
+ed inizializzando (\texttt{\small 6--11}) opportunamente la struttura
+\var{hint} con i valori ricevuti come argomenti, soltanto che in questo caso
+si è usata (\texttt{\small 8}) una impostazione specifica dei flag di
+\var{hint} usando \const{AI\_PASSIVE} per indicare che il socket sarà usato
+per una apertura passiva. Per il resto la chiamata (\texttt{\small 12--18}) a
+\func{getaddrinfo} e ed il ciclo principale (\texttt{\small 20--42}) sono
+identici, solo che si è sostituita (\texttt{\small 31}) la chiamata a
+\func{connect} con una chiamata a \func{bind}. Anche la conclusione
+(\texttt{\small 43--44}) della funzione è identica.
Si noti come anche in questo caso si siano inserite le stampe degli errori
sullo standard error, nonostante la funzione possa essere invocata da un
server \textit{echo}, che rispetto a quanto illustrato nella versione iniziale
di fig.~\ref{fig:TCP_echo_server_first_code} viene modificato nella forma
riportata in fig.~\ref{fig:TCP_echod_third}. In questo caso il socket su cui
-porsi in ascolto viene ottenuto (\texttt{\small 15--18}) da \func{sockbind}
+porsi in ascolto viene ottenuto (\texttt{\small 15--18}) da \texttt{sockbind}
che si cura anche della eventuale risoluzione di un indirizzo specifico sul
quale si voglia far ascoltare il server.
per mantenere dati amministrativi e strutture interne, e solo una parte
viene usata come buffer per i dati, mentre il valore letto da
\func{getsockopt} e quello riportato nei vari parametri di
- \textit{sysctl}\footnote{cioè \procrelfile{/proc/sys/net/core}{wmem\_max} e
- \procrelfile{/proc/sys/net/core}{rmem\_max} in \texttt{/proc/sys/net/core}
- e \procrelfile{/proc/sys/net/ipv4}{tcp\_wmem} e
- \procrelfile{/proc/sys/net/ipv4}{tcp\_rmem} in
+ \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
modifiche alle dimensioni dei buffer di ricezione e trasmissione, per poter
connessioni (è pertanto usata con i socket TCP ed ignorata per UDP) e
modifica il comportamento delle funzioni \func{close} e \func{shutdown}.
L'opzione richiede che l'argomento \param{optval} sia una struttura di tipo
- \struct{linger}, definita in \texttt{sys/socket.h} ed illustrata in
+ \struct{linger}, definita in \headfile{sys/socket.h} ed illustrata in
fig.~\ref{fig:sock_linger_struct}. Maggiori dettagli sul suo funzionamento
sono forniti in sez.~\ref{sec:sock_options_main}.
% Documentation/networking/timestamping.txt
+% TOFO documentare SO_REUSEPORT introdotta con il kernel 3.9, vedi
+% http://git.kernel.org/linus/c617f398edd4db2b8567a28e899a88f8f574798d
+
\end{basedescript}
connessione non esiste più.\footnote{si ricordi che un normale riavvio o il
crollo dell'applicazione non ha questo effetto, in quanto in tal caso si
passa sempre per la chiusura del processo, e questo, come illustrato in
- sez.~\ref{sec:file_close}, comporta anche la regolare chiusura del socket
- con l'invio di un segmento FIN all'altro capo della connessione.} In questo
-caso all'invio del messaggio di \textit{keep-alive} si otterrà come risposta
-un segmento RST che indica che l'altro capo non riconosce più l'esistenza
-della connessione ed il socket verrà chiuso riportando un errore di
-\errcode{ECONNRESET}.
+ sez.~\ref{sec:file_open_close}, comporta anche la regolare chiusura del
+ socket con l'invio di un segmento FIN all'altro capo della connessione.} In
+questo caso all'invio del messaggio di \textit{keep-alive} si otterrà come
+risposta un segmento RST che indica che l'altro capo non riconosce più
+l'esistenza della connessione ed il socket verrà chiuso riportando un errore
+di \errcode{ECONNRESET}.
Se invece non viene ricevuta nessuna risposta (indice che la macchina non è
più raggiungibile) l'emissione dei messaggi viene ripetuta ad intervalli di 75
finire fra quelli di una nuova.
Come esempio di uso di questa connessione abbiamo predisposto una nuova
-versione della funzione \func{sockbind} (vedi fig.~\ref{fig:sockbind_code})
+versione della funzione \texttt{sockbind} (vedi fig.~\ref{fig:sockbind_code})
che consenta l'impostazione di questa opzione. La nuova funzione è
-\func{sockbindopt}, e le principali differenze rispetto alla precedente sono
+\texttt{sockbindopt}, e le principali differenze rispetto alla precedente sono
illustrate in fig.~\ref{fig:sockbindopt_code}, dove si sono riportate le
sezioni di codice modificate rispetto alla versione precedente. Il codice
completo della funzione si trova, insieme alle altre funzioni di servizio dei
\includecodesample{listati/sockbindopt.c}
\end{minipage}
\normalsize
- \caption{Le sezioni della funzione \func{sockbindopt} modificate rispetto al
- codice della precedente \func{sockbind}.}
+ \caption{Le sezioni della funzione \texttt{sockbindopt} modificate rispetto al
+ codice della precedente \texttt{sockbind}.}
\label{fig:sockbindopt_code}
\end{figure}
In realtà tutto quello che si è fatto è stato introdurre nella nuova funzione
(\texttt{\small 1}) un nuovo argomento intero, \param{reuse}, che conterrà il
valore logico da usare nella successiva chiamata (\texttt{\small 14}) a
-\func{setsockopt}. Si è poi aggiunta una sezione (\texttt{\small 13-17}) che
+\func{setsockopt}. Si è poi aggiunta una sezione (\texttt{\small 13--17}) che
esegue l'impostazione dell'opzione fra la chiamata a \func{socket} e quella a
\func{bind}.
valore di default di questa variabile è nullo, ma usando l'opzione \texttt{-r}
nell'invocazione del server (al solito la gestione delle opzioni non è
riportata in fig.~\ref{fig:TCP_echod_fifth}) se ne potrà impostare ad 1 il
-valore, per cui in tal caso la successiva chiamata (\texttt{\small 13-17}) a
+valore, per cui in tal caso la successiva chiamata (\texttt{\small 13--17}) a
\func{setsockopt} attiverà l'opzione \const{SO\_REUSEADDR}.
\begin{figure}[!htbp]
\end{minipage}
\normalsize
\caption{Il nuovo codice per l'apertura passiva del server \textit{echo} che
- usa la nuova funzione \func{sockbindopt}.}
+ usa la nuova funzione \texttt{sockbindopt}.}
\label{fig:TCP_echod_fifth}
\end{figure}
introdotta una opzione ulteriore, \const{SO\_REUSEPORT} che richiede che detta
opzione sia specificata per tutti i socket per i quali si vuole eseguire il
\textit{completely duplicate binding}. Nel caso di Linux questa opzione non
-esiste, ma il comportamento di \const{SO\_REUSEADDR} è analogo, sarà cioè
-possibile effettuare un \textit{completely duplicate binding} ed ottenere il
-successo di \func{bind} su un socket legato allo stesso indirizzo e porta solo
-se il programma che ha eseguito per primo \func{bind} su di essi ha impostato
-questa opzione.\footnote{questa restrizione permette di evitare il cosiddetto
- \textit{port stealing}, in cui un programma, usando \const{SO\_REUSEADDR},
- può collegarsi ad una porta già in uso e ricevere i pacchetti destinati ad
- un altro programma; con questa caratteristica ciò è possibile soltanto se il
+esisteva fino al kernel 3.9, ma il comportamento di \const{SO\_REUSEADDR} è
+analogo, sarà cioè possibile effettuare un \textit{completely duplicate
+ binding} ed ottenere il successo di \func{bind} su un socket legato allo
+stesso indirizzo e porta solo se il programma che ha eseguito per primo
+\func{bind} su di essi ha impostato questa opzione.\footnote{questa
+ restrizione permette di evitare parzialmente il cosiddetto \textit{port
+ stealing}, in cui un programma, usando \const{SO\_REUSEADDR}, può
+ collegarsi ad una porta già in uso e ricevere i pacchetti destinati ad un
+ altro programma; con questa caratteristica ciò è possibile soltanto se il
primo programma a consentirlo, avendo usato fin dall'inizio
- \const{SO\_REUSEADDR}.}
+ \const{SO\_REUSEADDR}.}
+
+% TODO documentare SO_REUSEPORT, vedi https://lwn.net/Articles/542260/
+
\index{costante!{SO\_REUSEADDR}@{{\tt {SO\_REUSEADDR}}}|)}
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 \file{netinet/ip.h}, ed accessibili includendo detto file.
+sono definite in \headfile{netinet/ip.h}, ed accessibili includendo detto
+file.
\begin{table}[!htb]
\centering
\const{IP\_RECVERR} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
Abilita la gestione degli errori.\\
\const{IP\_MTU\_DISCOVER} &$\bullet$&$\bullet$& &\texttt{int}&
- Imposta il Path MTU \itindex{Maximum~Transfer~Unit} Discovery.\\
+ Imposta il Path MTU \itindex{Maximum~Transfer~Unit~(MTU)} Discovery.\\
\const{IP\_MTU} &$\bullet$& & &\texttt{int}&
- Legge il valore attuale della \itindex{Maximum~Transfer~Unit} MTU.\\
+ Legge il valore attuale della \itindex{Maximum~Transfer~Unit~(MTU)} 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}&
come valore logico e non è applicabile a socket di tipo
\const{SOCK\_STREAM}.
-\itindbeg{Maximum~Transfer~Unit}
+\itindbeg{Maximum~Transfer~Unit~(MTU)}
\item[\const{IP\_MTU\_DISCOVER}] Questa è una opzione introdotta con i kernel
della serie 2.2.x, ed è specifica di Linux. L'opzione permette di scrivere
o leggere le impostazioni della modalità usata per la determinazione della
ricerca è disabilitata ed è responsabilità del programma creare pacchetti di
dimensioni appropriate e ritrasmettere eventuali pacchetti persi. Se
l'opzione viene abilitata, il kernel si incaricherà di tenere traccia
- automaticamente della \itindex{Maximum~Transfer~Unit} \textit{Path MTU}
- verso ciascuna destinazione, e rifiuterà immediatamente la trasmissione di
- pacchetti di dimensioni maggiori della MTU con un errore di
- \errval{EMSGSIZE}.\footnote{in caso contrario la trasmissione del pacchetto
- sarebbe effettuata, ottenendo o un fallimento successivo della
- trasmissione, o la frammentazione dello stesso.}
+ automaticamente della \textit{Path MTU} verso ciascuna destinazione, e
+ rifiuterà immediatamente la trasmissione di pacchetti di dimensioni maggiori
+ della MTU con un errore di \errval{EMSGSIZE}.\footnote{in caso contrario la
+ 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}
di percorso del socket. L'opzione richiede per \param{optval} un intero che
esplicitamente connesso con \func{connect}.
Ad esempio con i socket UDP si potrà ottenere una stima iniziale della
- \itindex{Maximum~Transfer~Unit} \textit{Path MTU} eseguendo prima una
- \func{connect} verso la destinazione, e poi usando \func{getsockopt} con
- questa opzione. Si può anche avviare esplicitamente il procedimento di
- scoperta inviando un pacchetto di grosse dimensioni (che verrà scartato) e
- ripetendo l'invio coi dati aggiornati. Si tenga infine conto che durante il
- procedimento i pacchetti iniziali possono essere perduti, ed è compito
- dell'applicazione gestirne una eventuale ritrasmissione.
+ \textit{Path MTU} eseguendo prima una \func{connect} verso la destinazione,
+ e poi usando \func{getsockopt} con questa opzione. Si può anche avviare
+ esplicitamente il procedimento di scoperta inviando un pacchetto di grosse
+ dimensioni (che verrà scartato) e ripetendo l'invio coi dati aggiornati. Si
+ tenga infine conto che durante il procedimento i pacchetti iniziali possono
+ essere perduti, ed è compito dell'applicazione gestirne una eventuale
+ ritrasmissione.
-\itindend{Maximum~Transfer~Unit}
+\itindend{Maximum~Transfer~Unit~(MTU)}
\item[\const{IP\_ROUTER\_ALERT}] Questa è una opzione introdotta con i
kernel della serie 2.2.x, ed è specifica di Linux. Prende per
del \textit{multicast}, ed utilizza come \param{optval} le stesse strutture
\struct{ip\_mreqn} o \struct{ip\_mreq} delle due precedenti opzioni.
+% TODO chiarire quale è la struttura \struct{ip\_mreq}
+
+
\itindend{multicast}
\end{basedescript}
dove sono elencate le rispettive costanti da utilizzare come valore per
l'argomento \param{optname}. Dette costanti e tutte le altre costanti e
strutture collegate all'uso delle opzioni TCP sono definite in
-\file{netinet/tcp.h}, ed accessibili includendo detto file.\footnote{in realtà
- questo è il file usato dalle librerie; la definizione delle opzioni
- effettivamente supportate da Linux si trova nel file \texttt{linux/tcp.h},
- dal quale si sono estratte le costanti di tab.~\ref{tab:sock_opt_tcplevel}.}
+\headfile{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
+ estratte le costanti di tab.~\ref{tab:sock_opt_tcplevel}.}
\begin{table}[!htb]
\centering
\const{TCP\_NODELAY} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
Spedisce immediatamente i dati in segmenti singoli.\\
\const{TCP\_MAXSEG} &$\bullet$&$\bullet$& &\texttt{int}&
- Valore della \itindex{Maximum~Segment~Size} MSS per i segmenti in
+ Valore della \itindex{Maximum~Segment~Size~(MSS)} MSS per i segmenti in
uscita.\\
\const{TCP\_CORK} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
Accumula i dati in un unico segmento.\\
kernel 2.5.71.}
\item[\const{TCP\_MAXSEG}] con questa opzione si legge o si imposta il valore
- della \itindex{Maximum~Segment~Size} MSS (\textit{Maximum~Segment~Size},
- vedi sez.~\ref{sec:net_lim_dim} e sez.~\ref{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 annunciata all'altro capo della connessione. Se si specificano valori
- maggiori della \itindex{Maximum~Transfer~Unit} MTU questi verranno ignorati,
- inoltre TCP imporrà anche i suoi limiti massimo e minimo per questo valore.
+ della \itindex{Maximum~Segment~Size~(MSS)} 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.
\item[\const{TCP\_CORK}] questa opzione è il complemento naturale di
\const{TCP\_NODELAY} e serve a gestire a livello applicativo la situazione
\hline
reno& -- &Algoritmo tradizionale, usato in caso di assenza degli altri.\\
\texttt{bic} &\texttt{TCP\_CONG\_BIC} &
- \href{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}
- {\textsf{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}}.\\
+ \url{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}.\\
\texttt{cubic} &\texttt{TCP\_CONG\_CUBIC} &
- \href{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}
- {\textsf{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}}.\\
+ \url{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}.\\
\texttt{highspeed}&\texttt{TCP\_CONG\_HSTCP} &
- \href{http://www.icir.org/floyd/hstcp.html}
- {\textsf{http://www.icir.org/floyd/hstcp.html}}.\\
+ \url{http://www.icir.org/floyd/hstcp.html}.\\
\texttt{htcp} &\texttt{TCP\_CONG\_HTCP} &
- \href{http://www.hamilton.ie/net/htcp/}
- {\textsf{http://www.hamilton.ie/net/htcp/}}.\\
+ \url{http://www.hamilton.ie/net/htcp/}.\\
\texttt{hybla} &\texttt{TCP\_CONG\_HYBLA} &
- \href{http://www.danielinux.net/projects.html}
- {\textsf{http://www.danielinux.net/projects.html}}.\\
+ \url{http://www.danielinux.net/projects.html}.\\
\texttt{scalable}&\texttt{TCP\_CONG\_SCALABLE}&
- \href{http://www.deneholme.net/tom/scalable/}
- {\textsf{http://www.deneholme.net/tom/scalable/}}.\\
+ \url{http://www.deneholme.net/tom/scalable/}.\\
\texttt{vegas} &\texttt{TCP\_CONG\_VEGAS} &
- \href{http://www.cs.arizona.edu/protocols/}
- {\textsf{http://www.cs.arizona.edu/protocols/}}.\\
+ \url{http://www.cs.arizona.edu/protocols/}.\\
\texttt{westwood}&\texttt{TCP\_CONG\_WESTWOOD}&
- \href{http://www.cs.ucla.edu/NRL/hpi/tcpw/}
- {\textsf{http://www.cs.ucla.edu/NRL/hpi/tcpw/}}.\\
+ \url{http://www.cs.ucla.edu/NRL/hpi/tcpw/}.\\
% \texttt{}&\texttt{}& .\\
\hline
\end{tabular}
questo caso per poterle utilizzare occorrerà impostare l'opportuno valore per
l'argomento \param{level}, che è \const{SOL\_UDP} (o l'equivalente
\const{IPPROTO\_UDP}). Le costanti che identificano dette opzioni sono
-definite in \file{netinet/udp.h}, ed accessibili includendo detto
+definite in \headfile{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{linux/udp.h}, dal
- quale si sono estratte le costanti di tab.~\ref{tab:sock_opt_udplevel}.}
+ supportate dal kernel si trova in realtà nel file
+ \texttt{include/linux/udp.h}, dal quale si sono estratte le costanti di
+ tab.~\ref{tab:sock_opt_udplevel}.}
\begin{table}[!htb]
\centering
Benché la maggior parte delle caratteristiche dei socket sia gestibile con le
funzioni \func{setsockopt} e \func{getsockopt}, alcune proprietà possono
essere impostate attraverso le funzioni \func{fcntl} e \func{ioctl} già
-trattate in sez.~\ref{sec:file_fcntl} e sez.~\ref{sec:file_ioctl}; in
-quell'occasione abbiamo parlato di queste funzioni esclusivamente nell'ambito
-della loro applicazione a file descriptor associati a dei file normali; qui
-tratteremo invece i dettagli del loro utilizzo con file descriptor associati a
-dei socket.
+trattate in sez.~\ref{sec:file_fcntl_ioctl}; in quell'occasione abbiamo
+parlato di queste funzioni esclusivamente nell'ambito della loro applicazione
+a file descriptor associati a dei file normali; qui tratteremo invece i
+dettagli del loro utilizzo con file descriptor associati a dei socket.
\subsection{L'uso di \func{ioctl} e \func{fcntl} per i socket generici}
Tratteremo in questa sezione le caratteristiche specifiche delle funzioni
\func{ioctl} e \func{fcntl} quando esse vengono utilizzate con dei socket
-generici. Quanto già detto in precedenza in sez.~\ref{sec:file_fcntl} e
-sez.~\ref{sec:file_ioctl} continua a valere; quello che tratteremo qui sono le
-operazioni ed i comandi che sono validi, o che hanno significati peculiari,
-quando queste funzioni vengono applicate a dei socket generici.
+generici. Quanto già detto in precedenza sez.~\ref{sec:file_fcntl_ioctl}
+continua a valere; quello che tratteremo qui sono le operazioni ed i comandi
+che sono validi, o che hanno significati peculiari, quando queste funzioni
+vengono applicate a dei socket generici.
Nell'elenco seguente si riportano i valori specifici che può assumere il
secondo argomento della funzione \func{ioctl} (\param{request}, che indica il
\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} \textit{Round Trip Time} cui abbiamo già
+ \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}
\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 \acr{pid} del
+ \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
nullo.
\item[\const{FIOASYNC}] Abilita o disabilita la modalità di I/O asincrono sul
- socket. Questo significa (vedi sez.~\ref{sec:file_asyncronous_operation})
- che verrà inviato il segnale di \signal{SIGIO} (o quanto impostato con
- \const{F\_SETSIG}, vedi sez.~\ref{sec:file_fcntl}) in caso di eventi di I/O
- sul socket.
+ socket. Questo significa (vedi sez.~\ref{sec:signal_driven_io}) che verrà
+ inviato il segnale di \signal{SIGIO} (o quanto impostato con
+ \const{F\_SETSIG}, vedi sez.~\ref{sec:file_fcntl_ioctl}) in caso di eventi
+ di I/O sul socket.
\end{basedescript}
Nel caso dei socket generici anche \func{fcntl} prevede un paio di comandi
non ancora implementato, restituisce un errore di \errval{EOPNOTSUPP}.
\item[\const{SIOCGIFMTU}] permette di leggere il valore della
- \itindex{Maximum~Transfer~Unit} \textit{Maximum Transfer Unit} del
+ \itindex{Maximum~Transfer~Unit~(MTU)} \textit{Maximum Transfer Unit} del
dispositivo nel campo \var{ifr\_mtu}.
\item[\const{SIOCSIFMTU}] permette di impostare il valore della
- \itindex{Maximum~Transfer~Unit} \textit{Maximum Transfer Unit} del
+ \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.
\end{basedescript}
+
+% TODO aggiunta con il kernel 3.14 SIOCGHWTSTAMP per ottenere il timestamp
+% hardware senza modificarlo
+
Una ulteriore operazione, che consente di ricavare le caratteristiche delle
interfacce di rete, è \const{SIOCGIFCONF}; però per ragioni di compatibilità
questa operazione è disponibile soltanto per i socket della famiglia
\texttt{man 7 socket} sono i seguenti:
\begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}}
-\item[\procrelfile{/proc/sys/net/core}{rmem\_default}] imposta la dimensione
+\item[\sysctlrelfile{net/core}{rmem\_default}] imposta la dimensione
di default del buffer di ricezione (cioè per i dati in ingresso) dei socket.
-\item[\procrelfile{/proc/sys/net/core}{rmem\_max}] imposta la dimensione
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/core}{wmem\_default}] imposta la dimensione
+\item[\sysctlrelfile{net/core}{wmem\_default}] imposta la dimensione
di default del buffer di trasmissione (cioè per i dati in uscita) dei
socket.
-\item[\procrelfile{/proc/sys/net/core}{wmem\_max}] imposta la dimensione
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/core}{message\_cost},
- \procrelfile{/proc/sys/net/core}{message\_burst}] contengono le impostazioni
+\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
emissione (verranno accettati inizialmente fino ad un massimo di
\texttt{message\_cost/message\_burst} messaggi).
-\item[\procrelfile{/proc/sys/net/core}{netdev\_max\_backlog}] numero massimo
+\item[\sysctlrelfile{net/core}{netdev\_max\_backlog}] numero massimo
di pacchetti che possono essere contenuti nella coda di ingresso generale.
-\item[\procrelfile{/proc/sys/net/core}{optmem\_max}] lunghezza massima dei
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/core}{dev\_weight}] blocco di lavoro
+\item[\sysctlrelfile{net/core}{dev\_weight}] blocco di lavoro
(\textit{work quantum}) dello scheduler di processo dei pacchetti.
% TODO da documentare meglio
-\item[\procrelfile{/proc/sys/net/core}{lo\_cong}] valore per l'occupazione
+\item[\sysctlrelfile{net/core}{lo\_cong}] valore per l'occupazione
della coda di ricezione sotto la quale si considera di avere una bassa
congestione.
-\item[\procrelfile{/proc/sys/net/core}{mod\_cong}] valore per l'occupazione
+\item[\sysctlrelfile{net/core}{mod\_cong}] valore per l'occupazione
della coda di ricezione sotto la quale si considera di avere una congestione
moderata.
-\item[\procrelfile{/proc/sys/net/core}{no\_cong}] valore per l'occupazione
+\item[\sysctlrelfile{net/core}{no\_cong}] valore per l'occupazione
della coda di ricezione sotto la quale si considera di non avere
congestione.
-\item[\procrelfile{/proc/sys/net/core}{no\_cong\_thresh}] valore minimo
+\item[\sysctlrelfile{net/core}{no\_cong\_thresh}] valore minimo
(\textit{low water mark}) per il riavvio dei dispositivi congestionati.
- % \item[\procrelfile{/proc/sys/net/core}{netdev\_fastroute}] è presente
+ % \item[\sysctlrelfile{net/core}{netdev\_fastroute}] è presente
% soltanto quando si è compilato il kernel con l'apposita opzione di
% ottimizzazione per l'uso come router.
-\item[\procrelfile{/proc/sys/net/core}{somaxconn}] imposta la dimensione
+\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.
di manuale accessibile con \texttt{man 7 ip}, sono i seguenti:
\begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}}
-\item[\procrelfile{/proc/sys/net/ipv4}{ip\_default\_ttl}] imposta il valore di
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{ip\_forward}] abilita l'inoltro dei
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{ip\_dynaddr}] abilita la riscrittura
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{ip\_autoconfig}] specifica se
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{ip\_local\_port\_range}] imposta
+\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,
valore iniziale maggiore di 1024 (o meglio ancora di 4096) per evitare
conflitti con le porte usate dai servizi noti.
-\item[\procrelfile{/proc/sys/net/ipv4}{ip\_no\_pmtu\_disc}] permette di
+\item[\sysctlrelfile{net/ipv4}{ip\_no\_pmtu\_disc}] permette di
disabilitare per i socket \const{SOCK\_STREAM} la ricerca automatica della
- \itindex{Maximum~Transfer~Unit} \textit{Path MTU} (vedi
+ \itindex{Maximum~Transfer~Unit~(MTU)} \textit{Path MTU} (vedi
sez.~\ref{sec:net_lim_dim} e sez.~\ref{sec:sock_ipv4_options}). Prende un
valore logico, e di default è disabilitato (cioè la ricerca viene eseguita).
In genere si abilita questo parametro quando per qualche motivo il
- procedimento del \itindex{Maximum~Transfer~Unit} \textit{Path MTU discovery}
- fallisce; dato che questo può avvenire a causa di router\footnote{ad
- esempio se si scartano tutti i pacchetti ICMP, il problema è affrontato
- anche in sez.~3.4.4 di \cite{SGL}.} o interfacce\footnote{ad esempio se i
- due capi di un collegamento \textit{point-to-point} non si accordano sulla
- stessa MTU.} mal configurati è opportuno correggere le configurazioni,
- perché disabilitare globalmente il procedimento con questo parametro ha
- pesanti ripercussioni in termini di prestazioni di rete.
-
-\item[\procrelfile{/proc/sys/net/ipv4}{ip\_always\_defrag}] fa si che tutti i
+ procedimento del \itindex{Maximum~Transfer~Unit~(MTU)} \textit{Path MTU
+ discovery} fallisce; dato che questo può avvenire a causa di
+ router\footnote{ad esempio se si scartano tutti i pacchetti ICMP, il
+ problema è affrontato anche in sez.~3.4.4 di \cite{SGL}.} o
+ interfacce\footnote{ad esempio se i due capi di un collegamento
+ \textit{point-to-point} non si accordano sulla stessa MTU.} mal
+ configurati è opportuno correggere le configurazioni, perché 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
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
\itindex{netfilter} \textit{netfilter}, e questo parametro non è più
presente.
-\item[\procrelfile{/proc/sys/net/ipv4}{ipfrag\_high\_thresh}] indica il limite
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{ipfrag\_low\_thresh}] soglia bassa
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{ip\_nonlocal\_bind}] se abilitato rende
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_abort\_on\_overflow}] indica al
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_adv\_win\_scale}] indica al kernel
+\item[\sysctlrelfile{net/ipv4}{tcp\_adv\_win\_scale}] indica al kernel
quale frazione del buffer associato ad un socket\footnote{quello impostato
- con \procrelfile{/proc/sys/net/ipv4}{tcp\_rmem}.} deve essere utilizzata
+ con \sysctlrelfile{net/ipv4}{tcp\_rmem}.} deve essere utilizzata
per la finestra del protocollo TCP\footnote{in sostanza il valore che
costituisce la \itindex{advertised~window} \textit{advertised window}
annunciata all'altro capo del socket.} e quale come buffer applicativo per
negativo. Il default è 2 che significa che al buffer dell'applicazione
viene riservato un quarto del totale.
-\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_app\_win}] indica la frazione
- della finestra TCP che viene riservata per gestire l'overhaed dovuto alla
+\item[\sysctlrelfile{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 e $\texttt{window}/2^\texttt{tcp\_app\_win}$. Un valore nullo significa
- che non viene riservato nessuno spazio; il valore di default è 31.
+ dimensione in byte come il massimo fra la
+ \itindex{Maximum~Segment~Size~(MSS)} MSS e
+ $\texttt{window}/2^\texttt{tcp\_app\_win}$. Un valore nullo significa che
+ non viene riservato nessuno spazio; il valore di default è 31.
% vecchi, presumibilmente usati quando gli algoritmi di congestione non erano
% modularizzabili
% \item[\texttt{tcp\_bic\_low\_window}]
% \item[\texttt{tcp\_bic\_fast\_convergence}]
-\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_dsack}] abilita il supporto,
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_ecn}] abilita il meccanismo della
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_fack}] abilita il supporto per il
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_fin\_timeout}] specifica il numero
+\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
ma è utile per fronteggiare alcuni attacchi di
\itindex{Denial~of~Service~(DoS)} \textit{Denial of Service}.
-\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_frto}] abilita il supporto per
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_keepalive\_intvl}] indica il
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_keepalive\_probes}] indica il
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_keepalive\_time}] indica il numero
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_low\_latency}] indica allo stack
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_max\_orphans}] indica il numero
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_max\_syn\_backlog}] indica la
+\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
del kernel, in modo che sia $\mathtt{tcp\_max\_syn\_backlog} \ge
\mathtt{16*TCP\_SYNQ\_HSIZE}$, per poi ricompilare il kernel.}
-\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_max\_tw\_buckets}] indica il
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_mem}] viene usato dallo stack TCP
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_orphan\_retries}] indica il numero
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_reordering}] indica il numero
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_retrans\_collapse}] in caso di
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_retries1}] imposta il massimo
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_retries2}] imposta il numero di
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_rfc1337}] indica al kernel di
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_rmem}] viene usato dallo stack TCP
+\item[\sysctlrelfile{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:
in sistemi con poca memoria viene automaticamente ridotto a
\const{PAGE\_SIZE}. Questo valore viene usato per assicurare che anche in
situazioni di pressione sulla memoria (vedi quanto detto per
- \procrelfile{/proc/sys/net/ipv4}{tcp\_rmem}) le allocazioni al di sotto di
+ \sysctlrelfile{net/ipv4}{tcp\_rmem}) le allocazioni al di sotto di
questo limite abbiamo comunque successo. Questo valore non viene comunque
ad incidere sulla dimensione del buffer di ricezione di un singolo socket
dichiarata con l'opzione \const{SO\_RCVBUF}.
\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 \procfile{/proc/sys/net/core/mem\_default} che vale
+ 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
- \procrelfile{/proc/sys/net/ipv4}{tcp\_window\_scaling}).
+ \sysctlrelfile{net/ipv4}{tcp\_window\_scaling}).
\item il terzo valore, denominato \textit{max} nelle pagine di manuale,
indica la dimensione massima in byte del buffer di ricezione di un socket
TCP; il default è 174760 byte, che viene ridotto automaticamente a 87380
per sistemi con poca memoria. Il valore non può comunque eccedere il
limite generale per tutti i socket posto con
- \procfile{/proc/sys/net/core/rmem\_max}. Questo valore non viene ad
+ \sysctlfile{net/core/rmem\_max}. Questo valore non viene ad
incidere sulla dimensione del buffer di ricezione di un singolo socket
dichiarata con l'opzione \const{SO\_RCVBUF}.
\end{itemize}
-\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_sack}] indica al kernel di
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_stdurg}] indica al kernel di
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_synack\_retries}] indica il numero
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_syncookies}] abilita i \textit{TCP
+\item[\sysctlrelfile{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
con altre funzionalità come le estensioni e può causare problemi per i
client ed il reinoltro dei pacchetti.
-\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_syn\_retries}] imposta il numero
+\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[\procrelfile{/proc/sys/net/ipv4}{tcp\_timestamps}] abilita l'uso dei
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_tw\_recycle}] abilita il
+\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
\textit{netfilter}, per maggiori dettagli si consulti il cap.~2 di
\cite{FwGL}.}
-\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_tw\_reuse}] abilita il riutilizzo
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_window\_scaling}] un valore
+\item[\sysctlrelfile{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[\procrelfile{/proc/sys/net/ipv4}{tcp\_vegas\_cong\_avoid}]
+%\item[\sysctlrelfile{net/ipv4}{tcp\_vegas\_cong\_avoid}]
% TODO: controllare su internet
-%\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_westwood}]
+%\item[\sysctlrelfile{net/ipv4}{tcp\_westwood}]
% TODO: controllare su internet
-\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_wmem}] viene usato dallo stack TCP
+\item[\sysctlrelfile{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:
\begin{itemize}
\item il primo valore, chiamato \textit{min}, indica la dimensione minima in
byte del buffer di spedizione; il default è 4Kb. Come per l'analogo di
- \procrelfile{/proc/sys/net/ipv4}{tcp\_rmem}) viene usato per assicurare
+ \sysctlrelfile{net/ipv4}{tcp\_rmem}) viene usato per assicurare
che anche in situazioni di pressione sulla memoria (vedi
- \procrelfile{/proc/sys/net/ipv4}{tcp\_mem}) le allocazioni al di sotto di
+ \sysctlrelfile{net/ipv4}{tcp\_mem}) le allocazioni al di sotto di
questo limite abbiamo comunque successo. Di nuovo questo valore non viene
ad incidere sulla dimensione del buffer di trasmissione di un singolo
socket dichiarata con l'opzione \const{SO\_SNDBUF}.
\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 \procfile{/proc/sys/net/core/wmem\_default}. Il default è 87380
+ 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
- \procrelfile{/proc/sys/net/ipv4}{tcp\_rmem}) se si vuole che in
+ \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 \procrelfile{/proc/sys/net/ipv4}{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
viene ridotto automaticamente a 64Kb per sistemi con poca memoria. Il
valore non può comunque eccedere il limite generale per tutti i socket
- posto con \procfile{/proc/sys/net/core/wmem\_max}. Questo valore non viene
+ posto con \sysctlfile{net/core/wmem\_max}. Questo valore non viene
ad incidere sulla dimensione del buffer di trasmissione di un singolo
socket dichiarata con l'opzione \const{SO\_SNDBUF}.
\end{itemize}
% LocalWords: ERANGE sethostent stayopen endhostent gethostbyaddr order pton
% LocalWords: getipnodebyname getipnodebyaddr flags num MAPPED ALL ADDRCONFIG
% LocalWords: freehostent ip getXXXbyname getXXXbyaddr servent getservbyname
-% LocalWords: getservbyaddr netent getnetbyname getnetbyaddr protoent smtp udp
+% LocalWords: netent getnetbyname getnetbyaddr protoent smtp udp
% LocalWords: getprotobyname getprotobyaddr getservbyport port tcp setservent
% LocalWords: getservent endservent setXXXent getXXXent endXXXent gethostent
% LocalWords: setnetent getnetent endnetent setprotoent getprotoent POSIX RFC