%% sockctrl.tex
%%
-%% Copyright (C) 2004-2012 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2004-2015 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",
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:
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)
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{\textwidth}
+ \begin{minipage}[c]{0.80\textwidth}
\includestruct{listati/hostent.h}
\end{minipage}
\caption{La struttura \structd{hostent} per la risoluzione dei nomi a
Le funzioni illustrate finora hanno un difetto: utilizzando una area di
memoria interna per allocare i contenuti della struttura \struct{hostent} non
-possono essere\index{funzioni!rientranti} rientranti. Questo comporta anche
-che in due successive chiamate i dati potranno essere sovrascritti. Si tenga
-presente poi che copiare il contenuto della sola struttura non è sufficiente
-per salvare tutti i dati, in quanto questa contiene puntatori ad altri dati,
-che pure possono essere sovrascritti; per questo motivo, se si vuole salvare
-il risultato di una chiamata, occorrerà eseguire quella che si chiama una
-\itindex{deep~copy} \textit{deep copy}.\footnote{si chiama così quella tecnica
- per cui, quando si deve copiare il contenuto di una struttura complessa (con
- puntatori che puntano ad altri dati, che a loro volta possono essere
- puntatori ad altri dati) si deve copiare non solo il contenuto della
- struttura, ma eseguire una scansione per risolvere anche tutti i puntatori
- contenuti in essa (e così via se vi sono altre sotto-strutture con altri
- puntatori) e copiare anche i dati da questi referenziati.}
+possono essere rientranti. Questo comporta anche che in due successive
+chiamate i dati potranno essere sovrascritti. Si tenga presente poi che
+copiare il contenuto della sola struttura non è sufficiente per salvare tutti
+i dati, in quanto questa contiene puntatori ad altri dati, che pure possono
+essere sovrascritti; per questo motivo, se si vuole salvare il risultato di
+una chiamata, occorrerà eseguire quella che si chiama una \itindex{deep~copy}
+\textit{deep copy}.\footnote{si chiama così quella tecnica per cui, quando si
+ deve copiare il contenuto di una struttura complessa (con puntatori che
+ puntano ad altri dati, che a loro volta possono essere puntatori ad altri
+ dati) si deve copiare non solo il contenuto della struttura, ma eseguire una
+ scansione per risolvere anche tutti i puntatori contenuti in essa (e così
+ via se vi sono altre sotto-strutture con altri puntatori) e copiare anche i
+ dati da questi referenziati.}
Per ovviare a questi problemi nelle \acr{glibc} sono definite anche delle
-versioni \index{funzioni!rientranti} rientranti delle precedenti funzioni, al
-solito queste sono caratterizzate dall'avere un suffisso \texttt{\_r},
-pertanto avremo le due funzioni \funcd{gethostbyname\_r} e
-\funcd{gethostbyname2\_r} i cui prototipi sono:
+versioni rientranti delle precedenti funzioni, al solito queste sono
+caratterizzate dall'avere un suffisso \texttt{\_r}, pertanto avremo le due
+funzioni \funcd{gethostbyname\_r} e \funcd{gethostbyname2\_r} i cui prototipi
+sono:
\begin{functions}
\headdecl{netdb.h}
\headdecl{sys/socket.h}
\param{buf} e \param{buflen}.
Gli ultimi due argomenti vengono utilizzati per avere indietro i risultati
-come \itindex{value~result~argument} \textit{value result argument}, si deve
-specificare l'indirizzo della variabile su cui la funzione dovrà salvare il
-codice di errore con \param{h\_errnop} e quello su cui dovrà salvare il
-puntatore che si userà per accedere i dati con \param{result}.
+come \textit{value result argument}, si deve specificare l'indirizzo della
+variabile su cui la funzione dovrà salvare il codice di errore
+con \param{h\_errnop} e quello su cui dovrà salvare il puntatore che si userà
+per accedere i dati con \param{result}.
In caso di successo entrambe le funzioni restituiscono un valore nullo,
altrimenti restituiscono un codice di errore negativo e all'indirizzo puntato
da \param{result} sarà salvato un puntatore nullo, mentre a quello puntato da
\param{h\_errnop} sarà salvato il valore del codice di errore, dato che per
-essere \index{funzioni!rientranti} rientrante la funzione non può la variabile
-globale \var{h\_errno}. In questo caso il codice di errore, oltre ai valori di
+essere rientrante la funzione non può la variabile globale \var{h\_errno}. In
+questo caso il codice di errore, oltre ai valori di
tab.~\ref{tab:h_errno_values}, può avere anche quello di \errcode{ERANGE}
qualora il buffer allocato su \param{buf} non sia sufficiente a contenere i
dati, in tal caso si dovrà semplicemente ripetere l'esecuzione della funzione
servizi di risoluzione dei nomi illustrati in sez.~\ref{sec:sock_resolver}; in
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~(NSS)} \textit{Name Service Switch} che permettono
-rispettivamente di trovare una corrispondenza cercando per nome o per numero.
+servizio) per ciascuna delle informazioni di rete mantenute dal \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
tab.~\ref{tab:name_resolution_functions}, dove le si sono suddivise rispetto
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~(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.
+interno al \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.
\begin{table}[!htb]
\centering
\hline
\end{tabular}
\caption{Funzioni di risoluzione dei nomi per i vari servizi del
- \itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch}.}
+ \textit{Name Service Switch} riguardanti la rete.}
\label{tab:name_resolution_functions}
\end{table}
Delle funzioni di tab.~\ref{tab:name_resolution_functions} abbiamo trattato
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)} NSS a parte, si fa sempre riferimento ai
-dati mantenuti nei rispettivi file.
+una entità esterna; per le altre invece, estensioni fornite dal \textit{Name
+ Service Switch} 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},
Il primo argomento è il nome del servizio per \func{getservbyname},
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~(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
-una apposita struttura \struct{servent} contenente tutti i risultati,
-altrimenti viene restituito un puntatore nullo. Si tenga presente che anche
-in questo caso i dati vengono mantenuti in una area di memoria statica e che
-quindi la funzione non è \index{funzioni!rientranti} rientrante.
+ricerca sul file \conffile{/etc/services}\footnote{il \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 una apposita struttura \struct{servent} contenente
+tutti i risultati, altrimenti viene restituito un puntatore nullo. Si tenga
+presente che anche in questo caso i dati vengono mantenuti in una area di
+memoria statica e che quindi la funzione non è rientrante.
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{\textwidth}
+ \begin{minipage}[c]{0.80\textwidth}
\includestruct{listati/servent.h}
\end{minipage}
\caption{La struttura \structd{servent} per la risoluzione dei nomi dei
trovati nelle rispettive pagine di manuale.
Oltre alle funzioni di ricerca esistono delle ulteriori funzioni che prevedono
-una lettura sequenziale delle informazioni mantenute nel
-\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
-dei servizi avremo allora le tre funzioni \funcd{setservent},
-\funcd{getservent} e \funcd{endservent} i cui prototipi sono:
+una lettura sequenziale delle informazioni mantenute nel \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 dei servizi avremo allora le tre
+funzioni \funcd{setservent}, \funcd{getservent} e \funcd{endservent} i cui
+prototipi sono:
\begin{functions}
\headdecl{netdb.h}
\funcdecl{void setservent(int stayopen)}
\hline
\end{tabular}
\caption{Funzioni lettura sequenziale dei dati del
- \itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch}.}
+ \textit{Name Service Switch}.}
\label{tab:name_sequential_read}
\end{table}
Come ultimo argomento in \param{res} deve essere passato un puntatore ad una
variabile (di tipo puntatore ad una struttura \struct{addrinfo}) che verrà
-utilizzata dalla funzione per riportare (come \itindex{value~result~argument}
-\textit{value result argument}) i propri risultati. La funzione infatti è
-\index{funzioni!rientranti} 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.
+utilizzata dalla funzione per riportare (come \textit{value result argument})
+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 \textit{linked list} di strutture di tipo
+\struct{addrinfo} contenenti tutte le informazioni ottenute.
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{\textwidth}
+ \begin{minipage}[c]{0.80\textwidth}
\includestruct{listati/addrinfo.h}
\end{minipage}
\caption{La struttura \structd{addrinfo} usata nella nuova interfaccia POSIX
\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
\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}
\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}
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
-\index{tipo!opaco} opachi rispetto all'uso della funzione \func{connect}.
+opachi rispetto all'uso della funzione \func{connect}.
\begin{figure}[!htbp]
\footnotesize \centering
rispettiva struttura degli indirizzi.
Come già detto la funzione è analoga a \texttt{sockconn} ed inizia azzerando
-ed inizializzando (\texttt{\small 6-11}) opportunamente la struttura
+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
+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
per entrambe le funzioni. In questo caso \param{optval} viene usato per
ricevere le informazioni ed indica l'indirizzo a cui andranno scritti i dati
letti dal socket, infine \param{optlen} diventa un puntatore ad una variabile
-che viene usata come \itindex{value~result~argument} \textit{value result
- argument} per indicare, prima della chiamata della funzione, la lunghezza
-del buffer allocato per \param{optval} e per ricevere indietro, dopo la
-chiamata della funzione, la dimensione effettiva dei dati scritti su di esso.
-Se la dimensione del buffer allocato per \param{optval} non è sufficiente si
-avrà un errore.
+che viene usata come \textit{value result argument} per indicare, prima della
+chiamata della funzione, la lunghezza del buffer allocato per \param{optval} e
+per ricevere indietro, dopo la chiamata della funzione, la dimensione
+effettiva dei dati scritti su di esso. Se la dimensione del buffer allocato
+per \param{optval} non è sufficiente si avrà un errore.
\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}&
\label{tab:sock_opt_socklevel}
\end{table}
+% TODO aggiungere e documentare SO_ATTACH_BPF, introdotta con il kernel 3.19,
+% vedi http://lwn.net/Articles/625224/
+% TODO aggiungere e documentare SO_INCOMING_CPU, introdotta con il kernel 3.19,
+% vedi https://lwn.net/Articles/626150/
+
La tabella elenca le costanti che identificano le singole opzioni da usare
come valore per \param{optname}; le due colonne seguenti indicano per quali
delle due funzioni (\func{getsockopt} o \func{setsockopt}) l'opzione è
separatamente in sez.~\ref{sec:sock_options_main}. Quello che segue è quindi
soltanto un elenco più dettagliato della breve descrizione di
tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
-\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
+\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
\item[\const{SO\_KEEPALIVE}] questa opzione abilita un meccanismo di verifica
della persistenza di una connessione associata al socket (ed è pertanto
\item[\const{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 \itindex{capabilities}
- \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} 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 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 sulla rete su un buffer circolare che viene letto da un
- apposito programma, \cmd{trpt}.}
+ 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}
+ 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
+ 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
+ sulla rete su un buffer circolare che viene letto da un apposito
+ programma, \cmd{trpt}.}
\item[\const{SO\_REUSEADDR}] questa opzione permette di eseguire la funzione
\func{bind} su indirizzi locali che siano già in uso da altri socket;
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[\const{SO\_BROADCAST}] questa opzione abilita il \textit{broadcast};
+ quanto abilitata i socket di tipo \const{SOCK\_DGRAM} riceveranno i
+ pacchetti inviati all'indirizzo di \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
trasmissione del socket. Prende per \param{optval} un intero indicante il
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}.
valori del campo \textit{type of service} (noto come TOS, vedi
sez.~\ref{sec:IP_header}) per i pacchetti uscenti. Per impostare una
priorità al di fuori dell'intervallo di valori fra 0 e 6 sono richiesti i
- privilegi di amministratore con la \itindex{capabilities} capability
- \const{CAP\_NET\_ADMIN}.
+ privilegi di amministratore con la capability \const{CAP\_NET\_ADMIN}.
\item[\const{SO\_ERROR}] questa opzione riceve un errore presente sul socket;
può essere utilizzata soltanto con \func{getsockopt} e prende per
% Documentation/networking/timestamping.txt
+% TOFO documentare SO_REUSEPORT introdotta con il kernel 3.9, vedi
+% http://git.kernel.org/linus/c617f398edd4db2b8567a28e899a88f8f574798d
+
\end{basedescript}
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 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
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
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]
\func{bind} su un indirizzo ed una porta che sono già \textsl{legati} ad un
altro socket. Questo ovviamente non ha senso per il normale traffico di rete,
in cui i pacchetti vengono scambiati direttamente fra due applicazioni; ma
-quando un sistema supporta il traffico in \itindex{multicast}
-\textit{multicast}, in cui una applicazione invia i pacchetti a molte altre
-(vedi sez.~\ref{sec:xxx_multicast}), allora ha senso che su una macchina i
-pacchetti provenienti dal traffico in \itindex{multicast} \textit{multicast}
+quando un sistema supporta il traffico in \textit{multicast}, allora ha senso
+che su una macchina i pacchetti provenienti dal traffico in \textit{multicast}
possano essere ricevuti da più applicazioni\footnote{l'esempio classico di
traffico in \textit{multicast} è quello di uno streaming di dati (audio,
video, ecc.), l'uso del \textit{multicast} consente in tal caso di
questo caso è perfettamente logico aspettarsi che sulla stessa macchina più
utenti possano lanciare un programma che permetta loro di ricevere gli
stessi dati.} o da diverse istanze della stessa applicazione.
-\itindex{multicast}
In questo caso utilizzando \const{SO\_REUSEADDR} si consente ad una
applicazione eseguire \func{bind} sulla stessa porta ed indirizzo usata da
la cosa non ha alcun senso per i socket TCP, ed infatti in questo tipo di
applicazione è normale l'uso del protocollo UDP). La regola è che quando si
hanno più applicazioni che hanno eseguito \func{bind} sulla stessa porta, di
-tutti pacchetti destinati ad un indirizzo di \itindex{broadcast}
-\textit{broadcast} o di \itindex{multicast} \textit{multicast} viene inviata
-una copia a ciascuna applicazione. Non è definito invece cosa accade qualora
-il pacchetto sia destinato ad un indirizzo normale (unicast).
+tutti pacchetti destinati ad un indirizzo di \textit{broadcast} o di
+\textit{multicast} viene inviata una copia a ciascuna applicazione. Non è
+definito invece cosa accade qualora il pacchetto sia destinato ad un indirizzo
+normale (unicast).
Essendo questo un caso particolare in alcuni sistemi (come BSD) è stata
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}.}
+
+\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
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{\textwidth}
+ \begin{minipage}[c]{0.80\textwidth}
\includestruct{listati/linger.h}
\end{minipage}
\caption{La struttura \structd{linger} richiesta come valore dell'argomento
Un esempio di questo comportamento si può abilitare nel nostro client del
servizio \textit{echo} utilizzando l'opzione \texttt{-r}; riportiamo in
fig.~\ref{fig:TCP_echo_sixth} la sezione di codice che permette di introdurre
-questa funzionalità,; al solito il codice completo è disponibile nei sorgenti
+questa funzionalità; al solito il codice completo è disponibile nei sorgenti
allegati.
\begin{figure}[!htbp]
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}
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
+sono definite in \headfiled{netinet/ip.h}, ed accessibili includendo detto
file.
\begin{table}[!htb]
\centering
\footnotesize
- \begin{tabular}[c]{|l|c|c|c|l|l|}
+ \begin{tabular}[c]{|l|c|c|c|l|p{6cm}|}
\hline
\textbf{Opzione}&\texttt{get}&\texttt{set}&\textbf{flag}&\textbf{Tipo}&
\textbf{Descrizione}\\
\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~(MTU)} Discovery.\\
+ Imposta il \textit{Path MTU Discovery}.\\
\const{IP\_MTU} &$\bullet$& & &\texttt{int}&
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}&
- Imposta il TTL per i pacchetti \itindex{multicast} \textit{multicast}.\\
+ Imposta il TTL per i pacchetti \textit{multicast}.\\
\const{IP\_MULTICAST\_LOOP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Controlla il reinvio a se stessi dei dati di \itindex{multicast}
- \textit{multicast}.\\
+ Controlla il reinvio a se stessi dei dati di \textit{multicast}.\\
\const{IP\_ADD\_MEMBERSHIP} & &$\bullet$& &\struct{ip\_mreqn}&
- Si unisce a un gruppo di \itindex{multicast} \textit{multicast}.\\
+ Si unisce a un gruppo di \textit{multicast}.\\
\const{IP\_DROP\_MEMBERSHIP}& &$\bullet$& &\struct{ip\_mreqn}&
Si sgancia da un gruppo di \textit{multicast}.\\
\const{IP\_MULTICAST\_IF} & &$\bullet$& &\struct{ip\_mreqn}&
- Imposta l'interfaccia locale di un socket \itindex{multicast}
- \textit{multicast}.\\
+ Imposta l'interfaccia locale di un socket \textit{multicast}.\\
\hline
\end{tabular}
\caption{Le opzioni disponibili al livello \const{SOL\_IP}.}
Le descrizioni riportate in tab.~\ref{tab:sock_opt_iplevel} sono estremamente
succinte, una maggiore quantità di dettagli sulle varie opzioni è fornita nel
seguente elenco:
-\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
+\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
\item[\const{IP\_OPTIONS}] l'opzione permette di impostare o leggere le
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{\textwidth}
+ \begin{minipage}[c]{0.80\textwidth}
\includestruct{listati/pktinfo.h}
\end{minipage}
\caption{La struttura \structd{pktinfo} usata dall'opzione
definizione si veda sez.~\ref{sec:IP_header}) che permette di indicare le
priorità dei pacchetti. Se impostato il valore verrà mantenuto per tutti i
pacchetti del socket; alcuni valori (quelli che aumentano la priorità)
- richiedono i privilegi di amministrazione con la \itindex{capabilities}
- capability \const{CAP\_NET\_ADMIN}.
+ richiedono i privilegi di amministrazione con la capability
+ \const{CAP\_NET\_ADMIN}.
Il campo TOS è di 8 bit e l'opzione richiede per \param{optval} un intero
che ne contenga il valore. Sono definite anche alcune costanti che
come valore logico e non è applicabile a socket di tipo
\const{SOCK\_STREAM}.
-\itindbeg{Maximum~Transfer~Unit~(MTU)}
+\itindbeg{Path~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
- \textit{Path Maximum Transfer Unit} (vedi sez.~\ref{sec:net_lim_dim}) del
+ \textit{Path MTU} (vedi sez.~\ref{sec:net_lim_dim}) del
socket. L'opzione prende per \param{optval} un valore intero che indica la
modalità usata, da specificare con una delle costanti riportate in
tab.~\ref{tab:sock_ip_mtu_discover}.
essere perduti, ed è compito dell'applicazione gestirne una eventuale
ritrasmissione.
-\itindend{Maximum~Transfer~Unit~(MTU)}
+\itindend{Path~MTU}
\item[\const{IP\_ROUTER\_ALERT}] Questa è una opzione introdotta con i
kernel della serie 2.2.x, ed è specifica di Linux. Prende per
sez.~\ref{sec:IP_options}) che devono essere inoltrati al socket
corrente. Può essere usata soltanto per socket di tipo raw.
-\itindbeg{multicast}
\item[\const{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
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{\textwidth}
+ \begin{minipage}[c]{0.80\textwidth}
\includestruct{listati/ip_mreqn.h}
\end{minipage}
\caption{La struttura \structd{ip\_mreqn} utilizzata dalle opzioni dei
% 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
-\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\_DEFER\_ACCEPT}&$\bullet$&$\bullet$& &\texttt{int}&
Ritorna da \func{accept} solo in presenza di dati.\\
\const{TCP\_WINDOW\_CLAMP}&$\bullet$&$\bullet$& &\texttt{int}&
- Valore della \itindex{advertised~window} \textit{advertised window}.\\
+ Valore della \textit{advertised window}.\\
\const{TCP\_INFO} &$\bullet$& & &\struct{tcp\_info}&
Restituisce informazioni sul socket.\\
\const{TCP\_QUICKACK} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
tab.~\ref{tab:sock_opt_tcplevel} sono estremamente sintetiche ed indicative,
la spiegazione del funzionamento delle singole opzioni con una maggiore
quantità di dettagli è fornita nel seguente elenco:
-\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
-
+\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
\item[\const{TCP\_NODELAY}] il protocollo TCP utilizza un meccanismo di
bufferizzazione dei dati uscenti, per evitare la trasmissione di tanti
\item[\const{TCP\_WINDOW\_CLAMP}] con questa opzione si legge o si imposta
alla dimensione specificata, in byte, il valore dichiarato della
- \itindex{advertised~window} \textit{advertised window} (vedi
- sez.~\ref{sec:tcp_protocol_xxx}). Il kernel impone comunque una dimensione
- minima pari a \texttt{SOCK\_MIN\_RCVBUF/2}. Questa opzione non deve essere
- utilizzata in codice che vuole essere portabile.
+ \textit{advertised window} (vedi sez.~\ref{sec:tcp_protocol_xxx}). Il kernel
+ impone comunque una dimensione minima pari a \texttt{SOCK\_MIN\_RCVBUF/2}.
+ Questa opzione non deve essere utilizzata in codice che vuole essere
+ portabile.
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{\textwidth}
+ \begin{minipage}[c]{0.80\textwidth}
\includestruct{listati/tcp_info.h}
\end{minipage}
\caption{La struttura \structd{tcp\_info} contenente le informazioni sul
\begin{table}[!htb]
\centering
\footnotesize
- \begin{tabular}[c]{|l|l|p{10cm}|}
+ \begin{tabular}[c]{|l|l|l|}
\hline
\textbf{Nome}&\textbf{Configurazione}&\textbf{Riferimento} \\
\hline
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
+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
Ancora una volta le descrizioni contenute tab.~\ref{tab:sock_opt_udplevel}
sono un semplice riferimento, una maggiore quantità di dettagli sulle
caratteristiche delle opzioni citate è quello dell'elenco seguente:
-\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
+\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
\item[\const{UDP\_CORK}] questa opzione ha l'identico effetto dell'analoga
\const{TCP\_CORK} vista in precedenza per il protocollo TCP, e quando
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
generico. Nell'elenco si illustrerà anche, per ciascuna operazione, il tipo di
dato usato come terzo argomento della funzione ed il significato che esso
viene ad assumere. Dato che in caso di lettura questi dati vengono restituiti
-come \itindex{value~result~argument} \textit{value result argument}, con
-queste operazioni il terzo argomento deve sempre essere passato come puntatore
-ad una variabile (o struttura) precedentemente allocata. Le costanti che
-identificano le operazioni sono le seguenti:
-\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
+come \textit{value result argument}, con queste operazioni il terzo argomento
+deve sempre essere passato come puntatore ad una variabile (o struttura)
+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
\struct{timeval} con la marca temporale dell'ultimo pacchetto ricevuto sul
socket, questa operazione può essere utilizzata per effettuare delle
\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
- \textit{process group}.
+\item[\const{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
+ \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 \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.
+ 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: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
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{\textwidth}
+ \begin{minipage}[c]{0.80\textwidth}
\includestruct{listati/ifreq.h}
\end{minipage}
\caption{La struttura \structd{ifreq} utilizzata dalle \func{ioctl} per le
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
quelle che modificano le caratteristiche dell'interfaccia) sono privilegiate e
-richiedono i privilegi di amministratore o la \itindex{capabilities}
-\textit{capability} \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{2.7cm}\desclabelstyle{\nextlinelabel}}
+richiedono i privilegi di amministratore o la \textit{capability}
+\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
\var{ifr\_name} per restituire un risultato, tutte le altre lo utilizzano
per indicare l'interfaccia sulla quale operare. L'operazione richiede che si
\hline
\const{IFF\_UP} & L'interfaccia è attiva.\\
\const{IFF\_BROADCAST} & L'interfaccia ha impostato un indirizzo di
- \itindex{broadcast} \textit{broadcast} valido.\\
+ \textit{broadcast} valido.\\
\const{IFF\_DEBUG} & È attivo il flag interno di debug.\\
\const{IFF\_LOOPBACK} & L'interfaccia è una interfaccia di
\textit{loopback}.\\
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 \itindex{multicast}
- \textit{multicast}.\\
+ \const{IFF\_ALLMULTI} & Riceve tutti i pacchetti di \textit{multicast}.\\
\const{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
bilanciamento di carico.\\
\const{IFF\_MULTICAST} & L'interfaccia ha il supporto per il
- \textit{multicast} \itindex{multicast} attivo.\\
+ \textit{multicast} attivo.\\
\const{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
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.
+ hardware dell'interfaccia al valore specificato dal campo
+ \var{ifr\_hwaddr}. L'operazione è privilegiata.
\item[\const{SIOCGIFMAP}] legge alcuni parametri hardware (memoria, interrupt,
canali di DMA) del driver dell'interfaccia specificata, restituendo i
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{\textwidth}
+ \begin{minipage}[c]{0.80\textwidth}
\includestruct{listati/ifmap.h}
\end{minipage}
\caption{La struttura \structd{ifmap} utilizzata per leggere ed impostare i
struttura \struct{ifmap}, secondo la definizione di
fig.~\ref{fig:netdevice_ifmap_struct}.
-\item[\const{SIOCADDMULTI}] aggiunge un indirizzo di \itindex{multicast}
- \textit{multicast} ai filtri del livello di collegamento associati
- dell'interfaccia. Si deve usare un indirizzo hardware da specificare
- attraverso il campo \var{ifr\_hwaddr}, che conterrà l'opportuna struttura
- \struct{sockaddr}; l'operazione è privilegiata. Per una modalità alternativa
- per eseguire la stessa operazione si possono usare i \textit{packet socket},
- vedi sez.~\ref{sec:packet_socket}.
+\item[\const{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 è
+ privilegiata. Per una modalità alternativa per eseguire la stessa operazione
+ si possono usare i \textit{packet socket}, vedi
+ sez.~\ref{sec:packet_socket}.
-\item[\const{SIOCDELMULTI}] rimuove un indirizzo di \itindex{multicast}
- \textit{multicast} ai filtri del livello di collegamento dell'interfaccia,
- vuole un indirizzo hardware specificato come per \const{SIOCADDMULTI}. Anche
- questa operazione è privilegiata e può essere eseguita in forma alternativa
- con i \textit{packet socket}.
+\item[\const{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
trasmissione del dispositivo associato all'interfaccia specificata nel campo
\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
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{\textwidth}
+ \begin{minipage}[c]{0.80\textwidth}
\includestruct{listati/ifconf.h}
\end{minipage}
\caption{La struttura \structd{ifconf}.}
\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
relativa pagina di manuale, accessibile con \texttt{man 7 tcp}, e prevedono
come possibile valore per il secondo argomento della funzione le costanti
illustrate nell'elenco seguente; il terzo argomento della funzione, gestito
-come \itindex{value~result~argument} \textit{value result argument}, deve
-essere sempre il puntatore ad una variabile di tipo \ctyp{int}:
-\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
+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
presenti nel buffer di ricezione; il socket non deve essere in stato
\texttt{LISTEN}, altrimenti si avrà un errore di \errval{EINVAL}.
Le operazioni di controllo disponibili per i socket UDP, anch'esse illustrate
dalla relativa pagina di manuale accessibile con \texttt{man 7 udp}, sono
quelle indicate dalle costanti del seguente elenco; come per i socket TCP il
-terzo argomento viene gestito come \itindex{value~result~argument}
-\textit{value result argument} e deve essere un puntatore ad una variabile di
-tipo \ctyp{int}:
-\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
+terzo argomento viene gestito come \textit{value result argument} e deve
+essere un puntatore ad una variabile di tipo \ctyp{int}:
+\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
\item[\const{FIONREAD}] restituisce la dimensione in byte del primo pacchetto
in attesa di ricezione, o 0 qualora non ci sia nessun pacchetto.
\item[\const{TIOCOUTQ}] restituisce il numero di byte presenti nella coda di
\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
+\item[\sysctlrelfiled{net/core}{message\_cost},
+ \sysctlrelfiled{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[\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 quantum}) dello scheduler di processo dei pacchetti.
+\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
+\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
+\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
+\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
+\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 \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[\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
+\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,
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 per i socket \const{SOCK\_STREAM} la ricerca automatica della
- \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).
+\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 è
+ disabilitato (cioè la ricerca viene eseguita).
In genere si abilita questo parametro quando per qualche motivo il
- 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
+ procedimento del \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[\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
\itindex{netfilter} \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 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 la \itindex{advertised~window} \textit{advertised window}
- annunciata all'altro capo del socket.} e quale come buffer applicativo per
- isolare la rete dalle latenze dell'applicazione. Prende un valore intero
- che determina la suddetta frazione secondo la formula
+\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
+ la \textit{advertised window} annunciata all'altro capo del socket.} e
+ quale come buffer applicativo per isolare la rete dalle latenze
+ dell'applicazione. Prende un valore intero che determina la suddetta
+ frazione secondo la formula
$\texttt{buffer}/2^\texttt{tcp\_adv\_win\_scale}$ se positivo o con
$\texttt{buffer}-\texttt{buffer}/2^\texttt{tcp\_adv\_win\_scale}$ se
negativo. Il 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
% \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
+\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
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\_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
+\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
\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[\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:
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.
+ \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
+\item[\sysctlrelfiled{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
+\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
+\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 \textit{Network Address
\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\_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: