%% sockctrl.tex
%%
-%% Copyright (C) 2004-2007 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2004-2010 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",
funziona con il criterio della \textsl{delegazione}, un server responsabile
per un dominio di primo livello può delegare la risoluzione degli indirizzi
per un suo dominio di secondo livello ad un altro server, il quale a sua volta
-potrà delegare la risoluzione di un eventuale sottodominio di terzo livello ad
+potrà delegare la risoluzione di un eventuale sotto-dominio di terzo livello ad
un altro server ancora.
In realtà un server DNS è in grado di fare altro rispetto alla risoluzione di
Le funzioni illustrate finora hanno un difetto: utilizzando una area di
memoria interna per allocare i contenuti della struttura \struct{hostent} non
-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 sottostrutture con altri puntatori) e copiare anche i
- dati da questi referenziati.}
+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.}
Per ovviare a questi problemi nelle \acr{glibc} sono definite anche delle
-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:
+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:
\begin{functions}
\headdecl{netdb.h}
\headdecl{sys/socket.h}
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 rientrante la funzione non può la variabile globale \var{h\_errno}. In
-questo caso il codice di errore, oltre ai valori di
+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
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
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.
+quindi la funzione non è \index{funzioni!rientranti} rientrante.
\begin{figure}[!htb]
\footnotesize \centering
La prima funzione di questa interfaccia è \funcd{getaddrinfo},\footnote{la
funzione è definita, insieme a \func{getnameinfo} che vedremo più avanti,
- nell'\href{http://www.ietf.org/rfc/rfc2553.txt} {RFC~2553}.} che combina le
+ nell'\href{http://www.ietf.org/rfc/rfc2553.txt}{RFC~2553}.} che combina le
funzionalità delle precedenti \func{getipnodebyname}, \func{getipnodebyaddr},
\func{getservbyname} e \func{getservbyport}, consentendo di ottenere
contemporaneamente sia la risoluzione di un indirizzo simbolico che del nome
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 è
-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.
+\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.
\begin{figure}[!htb]
\footnotesize \centering
% riferimenti http://www.rcpt.to/lsfcc/lsf.html
% Documentation/networking/filter.txt
+% TODO documentare SO_MARK, introdotta nel 2.6.25, richiede CAP_NET_ADMIN
+%A userspace program may wish to set the mark for each packets its send
+%without using the netfilter MARK target. Changing the mark can be used
+%for mark based routing without netfilter or for packet filtering.
+
+
+% TODO documentare SO_TIMESTAMP e le altre opzioni di timestamping dei
+% pacchetti, introdotte nel 2.6.30, vedi nei sorgenti del kernel:
+% Documentation/networking/timestamping.txt
+
\end{basedescript}
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:multicast_xxx}), allora ha senso che su una macchina i
+(vedi sez.~\ref{sec:xxx_multicast}), allora ha senso che su una macchina i
pacchetti provenienti dal traffico in \itindex{multicast} \textit{multicast}
possano essere ricevuti da più applicazioni\footnote{l'esempio classico di
traffico in \textit{multicast} è quello di uno streaming di dati (audio,
Imposta il valore del campo TOS.\\
\const{IP\_TTL} &$\bullet$&$\bullet$& &\texttt{int}&
Imposta il valore del campo TTL.\\
+ \const{IP\_MINTTL} &$\bullet$&$\bullet$& &\texttt{int}&
+ Imposta il valore minimo del TTL per i pacchetti accettati.\\
\const{IP\_HDRINCL} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
Passa l'intestazione di IP nei dati.\\
\const{IP\_RECVERR} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
supportata per socket di tipo \const{SOCK\_STREAM}.
\item[\const{IP\_TOS}] L'opzione consente di leggere o impostare il campo
- \textit{Type of Service} dell'intestazione IP (vedi
- sez.~\ref{sec:IP_header}) che permette di indicare le priorità dei
- pacchetti. 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}.
+ \textit{Type of Service} dell'intestazione IP (per una trattazione più
+ dettagliata, che riporta anche i valori possibili e le relative costanti di
+ definizione si veda sez.~\ref{sec:IP_header}) che permette di indicare le
+ 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}.
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
dal protocollo utilizzando l'opzione \const{SO\_PRIORITY} illustrata in
sez.~\ref{sec:sock_generic_options}.
-\item[\const{IP\_TTL}] L'opzione consente di leggere o impostare il campo
- \textit{Time to Live} dell'intestazione IP (vedi sez.~\ref{sec:IP_header})
- per tutti i pacchetti associati al socket. Il campo TTL è di 8 bit e
+\item[\const{IP\_TTL}] L'opzione consente di leggere o impostare per tutti i
+ pacchetti associati al socket il campo \textit{Time to Live}
+ dell'intestazione IP che indica il numero massimo di \textit{hop} (passaggi
+ da un router ad un altro) restanti al paccheto (per una trattazione più
+ estesa si veda sez.~\ref{sec:IP_header}). Il campo TTL è di 8 bit e
l'opzione richiede che \param{optval} sia un intero, che ne conterrà il
valore.
+\item[\const{IP\_MINTTL}] L'opzione, introdotta con il kernel 2.6.34, imposta
+ un valore minimo per il campo \textit{Time to Live} dei pacchetti associati
+ al socket su cui è attivata, che se non rispettato ne causa lo scarto
+ automatico. L'opzione è nata per implementare
+ l'\href{http://www.ietf.org/rfc/rfc5082.txt}{RFC~5082} che la prevede come
+ forma di protezione per i router che usano il protocollo BGP poiché questi,
+ essendo in genere adiacenti, possono, impostando un valore di 255, scartare
+ automaticamente tutti gli eventuali pacchetti falsi creati da un attacco a
+ questo protocollo, senza doversi curare di verificarne la
+ validità.\footnote{l'attacco viene in genere portato per causare un
+ \textit{Denial of Service} aumentando il consumo di CPU del router nella
+ verifica dell'autenticità di un gran numero di pacchetti di pacchetti
+ falsi; questi, arrivando da sorgenti diverse da un router adiacente, non
+ potrebbero più avere un TTL di 255 anche qualora questo fosse stato il
+ valore di partenza, e l'impostazione dell'opzione consente di scartarli
+ senza carico aggiuntivo sulla CPU (che altrimenti dovrebbe calcolare una
+ checksum).}
+
\item[\const{IP\_HDRINCL}] Se abilitata l'utente deve fornire lui stesso
l'intestazione IP in cima ai propri dati. L'opzione è valida soltanto per
socket di tipo \const{SOCK\_RAW}, e quando utilizzata eventuali valori
\index{algoritmo~di~Nagle} l'\textsl{algoritmo di Nagle}.} Questo
meccanismo è controllato da un apposito algoritmo (detto
\index{algoritmo~di~Nagle} \textsl{algoritmo di Nagle}, vedi
- sez.~\ref{sez:tcp_protocol_xxx}). Il comportamento normale del protocollo
+ sez.~\ref{sec:tcp_protocol_xxx}). Il comportamento normale del protocollo
prevede che i dati siano accumulati fintanto che non si raggiunge una
quantità considerata adeguata per eseguire la trasmissione di un singolo
segmento.
\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{sez:tcp_protocol_xxx}) dei
+ 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
\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{sez:tcp_protocol_xxx}). Il kernel impone comunque una dimensione
+ 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.
\item[\const{TCP\_CONGESTION}] questa opzione permette di impostare quale
algoritmo per il controllo della congestione\footnote{il controllo della
congestione è un meccanismo previsto dal protocollo TCP (vedi
- sez.~\ref{sez:tcp_protocol_xxx}) per evitare di trasmettere inutilmente
+ sez.~\ref{sec:tcp_protocol_xxx}) per evitare di trasmettere inutilmente
dati quando una connessione è congestionata; un buon algoritmo è
fondamentale per il funzionamento del protocollo, dato che i pacchetti
persi andrebbero ritrasmessi, per cui inviare un pacchetto su una linea
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}
- {\texttt{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}}.\\
+ {\textsf{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}
- {\texttt{http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/index.htm}}.\\
+ {\textsf{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}
- {\texttt{http://www.icir.org/floyd/hstcp.html}}.\\
+ {\textsf{http://www.icir.org/floyd/hstcp.html}}.\\
\texttt{htcp} &\texttt{TCP\_CONG\_HTCP} &
\href{http://www.hamilton.ie/net/htcp/}
- {\texttt{http://www.hamilton.ie/net/htcp/}}.\\
+ {\textsf{http://www.hamilton.ie/net/htcp/}}.\\
\texttt{hybla} &\texttt{TCP\_CONG\_HYBLA} &
\href{http://www.danielinux.net/projects.html}
- {\texttt{http://www.danielinux.net/projects.html}}.\\
+ {\textsf{http://www.danielinux.net/projects.html}}.\\
\texttt{scalable}&\texttt{TCP\_CONG\_SCALABLE}&
\href{http://www.deneholme.net/tom/scalable/}
- {\texttt{http://www.deneholme.net/tom/scalable/}}.\\
+ {\textsf{http://www.deneholme.net/tom/scalable/}}.\\
\texttt{vegas} &\texttt{TCP\_CONG\_VEGAS} &
\href{http://www.cs.arizona.edu/protocols/}
- {\texttt{http://www.cs.arizona.edu/protocols/}}.\\
+ {\textsf{http://www.cs.arizona.edu/protocols/}}.\\
\texttt{westwood}&\texttt{TCP\_CONG\_WESTWOOD}&
\href{http://www.cs.ucla.edu/NRL/hpi/tcpw/}
- {\texttt{http://www.cs.ucla.edu/NRL/hpi/tcpw/}}.\\
+ {\textsf{http://www.cs.ucla.edu/NRL/hpi/tcpw/}}.\\
% \texttt{}&\texttt{}& .\\
\hline
\end{tabular}
impostabili con \func{sysctl}, sono riportate sotto il nodo \texttt{net}, o,
se acceduti tramite l'interfaccia del filesystem \texttt{/proc}, sotto
\texttt{/proc/sys/net}. In genere sotto questa directory compaiono le
-sottodirectory (corrispondenti ad altrettanti sottonodi per \func{sysctl})
+sottodirectory (corrispondenti ad altrettanti sotto-nodi per \func{sysctl})
relative ai vari protocolli e tipi di interfacce su cui è possibile
intervenire per effettuare impostazioni; un contenuto tipico di questa
directory è il seguente:
Si tenga presente infine che se è sempre possibile utilizzare il filesystem
\texttt{/proc} come sostituto di \func{sysctl}, dato che i valori di nodi e
-sottonodi di quest'ultima sono mappati come file e directory sotto
+sotto-nodi di quest'ultima sono mappati come file e directory sotto
\texttt{/proc/sys/}, non è vero il contrario, ed in particolare Linux consente
di impostare alcuni parametri o leggere lo stato della rete a livello di
sistema sotto \texttt{/proc/net}, dove sono presenti dei file che non
\item[\procrelfile{/proc/sys/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{sez:tcp_protocol_xxx}) viene usata
+ \textit{slow start} (si veda sez.~\ref{sec:tcp_protocol_xxx}) viene usata
questa metrica di riconoscimento dei riordinamenti per evitare inutili
ritrasmissioni provocate dal riordinamento. Prende un valore intero che di
default che è 3, e che non è opportuno modificare.
% LocalWords: rename ifconf syndrome dell'ACK FTP ACCEPTFILTER advanced reno
% LocalWords: congestion control Networking cubic CUBIC highspeed HSTCP htcp
% LocalWords: HTCP hybla HYBLA scalable SCALABLE ifc req iflist access ntoa Kb
-% LocalWords: hop Selective acknowledgement Explicit RTO stack firewall
-% LocalWords: Notification wireless denial pressure ATTACH DETACH
-% LocalWords: libpcap discovery point l'overhaed min PAGE flood
-% LocalWords: selective COOKIES NAT
+% LocalWords: hop Selective acknowledgement Explicit RTO stack firewall passwd
+% LocalWords: Notification wireless denial pressure ATTACH DETACH publickey
+% LocalWords: libpcap discovery point l'overhaed min PAGE flood NFS blast
+% LocalWords: selective COOKIES NAT Translation
%%% Local Variables:
%%% mode: latex