X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=sockctrl.tex;h=4b24620b5b7e135c117a6900e37bcd973e2a9de8;hp=dc300a8fccc6a2c46276485afa94d3b2e94bd108;hb=5d621249af8897e27fc0a842a33e7a7ef3b9c2ca;hpb=dd095412c46c4439e91efa378926f48248561ca7 diff --git a/sockctrl.tex b/sockctrl.tex index dc300a8..4b24620 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -1,6 +1,6 @@ %% 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", @@ -233,7 +233,7 @@ ed i nomi devono essere risolti da destra verso sinistra.\footnote{per chi si 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 @@ -781,25 +781,25 @@ ci sono precauzioni particolari da prendere.\footnote{volendo essere pignoli 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} @@ -837,8 +837,8 @@ 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 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 @@ -1103,7 +1103,7 @@ 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. +quindi la funzione non è \index{funzioni!rientranti} rientrante. \begin{figure}[!htb] \footnotesize \centering @@ -1224,7 +1224,7 @@ nuova. 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 @@ -1265,11 +1265,11 @@ 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 è -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 @@ -2328,6 +2328,16 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: % 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} @@ -2586,7 +2596,7 @@ 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: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, @@ -2754,6 +2764,8 @@ sono definite in \file{netinet/ip.h}, ed accessibili includendo detto file. 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}& @@ -2870,12 +2882,13 @@ sez.~\ref{sec:net_sendmsg}). 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 @@ -2887,12 +2900,32 @@ sez.~\ref{sec:net_sendmsg}). 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 @@ -3136,7 +3169,7 @@ quantit \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. @@ -3164,7 +3197,7 @@ quantit \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 @@ -3300,7 +3333,7 @@ quantit \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. @@ -3370,7 +3403,7 @@ quantit \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 @@ -3420,28 +3453,28 @@ quantit 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} @@ -3967,7 +4000,7 @@ Le opzioni disponibili per le propriet 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: @@ -3987,7 +4020,7 @@ significativi. 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 @@ -4395,7 +4428,7 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: \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. @@ -4659,10 +4692,10 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: % 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