X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=sockctrl.tex;h=2d5a2c99c1e0017a7c08f943714540a04803994c;hb=ad4c9f4f0809a57fd1767c8ca3548766cfd5a91d;hp=25ba9cf8dbf6de86ee437f8018696a3069737608;hpb=8ced433bddd1ff509441df4b012c806633acabbf;p=gapil.git diff --git a/sockctrl.tex b/sockctrl.tex index 25ba9cf..2d5a2c9 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -1,6 +1,6 @@ %% sockctrl.tex %% -%% Copyright (C) 2004-2005 Simone Piccardi. Permission is granted to +%% Copyright (C) 2004-2006 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", @@ -2013,7 +2013,8 @@ tab.~\ref{tab:sock_opt_socklevel}. \const{SO\_KEEPALIVE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& controlla l'attività della connessione.\\ \const{SO\_OOBINLINE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - lascia in linea i dati \textit{out-of-band}.\\ + lascia in linea i dati \itindex{out-of-band} + \textit{out-of-band}.\\ \const{SO\_RCVLOWAT} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& basso livello sul buffer di ricezione.\\ \const{SO\_SNDLOWAT} &$\bullet$&$\bullet$& &\texttt{int}& @@ -2085,13 +2086,14 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: forniti in sez.~\ref{sec:sock_options_main}. \item[\const{SO\_OOBINLINE}] se questa opzione viene abilitata i dati - \textit{out-of-band} vengono inviati direttamente nel flusso di dati del - socket (e sono quindi letti con una normale \func{read}) invece che restare - disponibili solo per l'accesso con l'uso del flag \const{MSG\_OOB} di - \func{recvmsg}. L'argomento è trattato in dettaglio in + \itindex{out-of-band} \textit{out-of-band} vengono inviati direttamente nel + flusso di dati del socket (e sono quindi letti con una normale \func{read}) + invece che restare disponibili solo per l'accesso con l'uso del flag + \const{MSG\_OOB} di \func{recvmsg}. L'argomento è trattato in dettaglio in sez.~\ref{sec:TCP_urgent_data}. L'opzione funziona soltanto con socket che - supportino i dati \textit{out-of-band} (non ha senso per socket UDP ad - esempio), ed utilizza per \param{optval} un intero usato come valore logico. + supportino i dati \itindex{out-of-band} \textit{out-of-band} (non ha senso + per socket UDP ad esempio), ed utilizza per \param{optval} un intero usato + come valore logico. \item[\const{SO\_RCVLOWAT}] questa opzione imposta il valore che indica il numero minimo di byte che devono essere presenti nel buffer di ricezione @@ -2659,8 +2661,6 @@ specificato in \var{l\_linger}. - - \subsection{Le opzioni per il protocollo IPv4} \label{sec:sock_ipv4_options} @@ -2669,11 +2669,10 @@ socket che usano il protocollo IPv4.\footnote{come per le precedenti opzioni generiche una descrizione di esse è disponibile nella settima sezione delle pagine di manuale, nel caso specifico la documentazione si può consultare con \texttt{man 7 ip}.} Se si vuole operare su queste opzioni generiche il -livello da utilizzare è \const{SOL\_IP}; si è riportato un elenco di queste -opzioni in tab.~\ref{tab:sock_opt_iplevel}. Le costanti indicanti le opzioni e -tutte le altre costanti ad esse collegate sono definite in -\file{netinet/ip.h}, ed accessibili includendo detto file. - +livello da utilizzare è \const{SOL\_IP} (o l'equivalente \const{IPPROTO\_IP}); +si è riportato un elenco di queste opzioni in tab.~\ref{tab:sock_opt_iplevel}. +Le costanti indicanti le opzioni e tutte le altre costanti ad esse collegate +sono definite in \file{netinet/ip.h}, ed accessibili includendo detto file. \begin{table}[!htb] \centering @@ -2728,9 +2727,9 @@ tutte le altre costanti ad esse collegate sono definite in \label{tab:sock_opt_iplevel} \end{table} -Le descrizioni di tab.~\ref{tab:sock_opt_iplevel} sono estremamente succinte, -una maggiore quantità di dettagli su queste opzioni è fornito nel seguente -elenco: +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}} @@ -2988,89 +2987,320 @@ sez.~\ref{sec:net_sendmsg}). -\section{Altre funzioni di controllo} +\subsection{Le opzioni per i protocolli TCP e UDP} +\label{sec:sock_tcp_udp_options} + +In questa sezione tratteremo le varie opzioni disponibili per i socket che +usano i due principali protocolli di comunicazione del livello di trasporto; +UDP e TCP.\footnote{come per le precedenti, una descrizione di queste opzioni + è disponibile nella settima sezione delle pagine di manuale, che si può + consultare rispettivamente con \texttt{man 7 tcp} e \texttt{man 7 udp}; le + pagine di manuale però, alla stesura di questa sezione (Agosto 2006) sono + alquanto incomplete.} Dato che questi protocolli sono entrambi trasportati +su IP, oltre alle opzioni generiche di sez.~\ref{sec:sock_generic_options} +saranno comunque disponibili anche le precedenti opzioni di +sez.~\ref{sec:sock_ipv4_options}.\footnote{in realtà in + sez.~\ref{sec:sock_ipv4_options} si sono riportate le opzioni per IPv4, ma + quelle per TCP e UDP sono le stesse anche quando si usa IPv6.} + + +Il protocollo che supporta il maggior numero di opzioni è TCP; per poterle +utilizzare occorre specificare \const{SOL\_TCP} (o l'equivalente +\const{IPPROTO\_TCP}) come valore per l'argomento \param{level}. Si è +riportato un elenco di queste opzioni in tab.~\ref{tab:sock_opt_tcp}. Le +costanti indicanti le opzioni del protocollo TCP e tutte le altre costanti ad +esse collegate sono definite in \file{netinet/tcp.h}, ed accessibili +includendo detto file.\footnote{in realtà questo è il file usato dalle + librerie; la definizione delle opzioni effettivamente supportate da Linux si + trova nel file \texttt{linux/tcp.h}, dal quale si sono estratte le costanti + di tab.~\ref{tab:sock_opt_tcplevel}.} + +\begin{table}[!htb] + \centering + \footnotesize + \begin{tabular}[c]{|l|c|c|c|l|l|} + \hline + \textbf{Opzione}&\texttt{get}&\texttt{set}&\textbf{flag}&\textbf{Tipo}& + \textbf{Descrizione}\\ + \hline + \hline + \const{TCP\_NODELAY} &$\bullet$&$\bullet$&&\texttt{}& %??? + .\\ + \const{TCP\_MAXSEG} &$\bullet$&$\bullet$&&\texttt{}& %??? + .\\ + \const{TCP\_CORK} &$\bullet$&$\bullet$&&\texttt{}& %??? + .\\ + \const{TCP\_KEEPIDLE} &$\bullet$&$\bullet$&&\texttt{}& %??? + .\\ + \const{TCP\_KEEPINTVL} &$\bullet$&$\bullet$&&\texttt{}& %??? + .\\ + \const{TCP\_KEEPCNT} &$\bullet$&$\bullet$&&\texttt{}& %??? + .\\ + \const{TCP\_SYNCNT} &$\bullet$&$\bullet$&&\texttt{}& %??? + .\\ + \const{TCP\_LINGER2} &$\bullet$&$\bullet$&&\texttt{}& %??? + .\\ + \const{TCP\_DEFER\_ACCEPT}&$\bullet$&$\bullet$&&\texttt{}& %??? + .\\ + \const{TCP\_WINDOW\_CLAMP}&$\bullet$&$\bullet$&&\texttt{}& %??? + .\\ + \const{TCP\_INFO} &$\bullet$&$\bullet$&&\texttt{}& %??? + .\\ + \const{TCP\_QUICKACK} &$\bullet$&$\bullet$&&\texttt{}& %??? + .\\ + \const{TCP\_CONGESTION} &$\bullet$&$\bullet$&&\texttt{}& %??? + .\\ + \hline + \end{tabular} + \caption{Le opzioni per i socket TCP disponibili al livello + \const{SOL\_TCP}.} + \label{tab:sock_opt_tcplevel} +\end{table} + +Le descrizioni di tab.~\ref{tab:sock_opt_tcplevel} sono estremamente +sintetiche, una maggiore quantità di dettagli su queste opzioni è fornita nel +seguente elenco: +\begin{basedescript}{\desclabelwidth{3.0cm}\desclabelstyle{\nextlinelabel}} + +\item[\const{TCP\_NODELAY}] + +\item[\const{TCP\_MAXSEG}] + +\item[\const{TCP\_CORK}] + +\item[\const{TCP\_KEEPINTVL}] + +\item[\const{TCP\_KEEPCNT}] + +\item[\const{TCP\_SYNCNT}] + +\item[\const{TCP\_LINGER2}] + +\item[\const{TCP\_DEFER\_ACCEPT}] + +\item[\const{TCP\_WINDOW\_CLAMP}] + +\item[\const{TCP\_INFO}] + +\item[\const{TCP\_QUICKACK}] + +\item[\const{TCP\_CONGESTION}] Introdotta con il kernel 2.6.13. + +\end{basedescript} + + +Il protocollo UDP, anche per la sua maggiore semplicità, supporta un numero +ridotto di opzioni, riportate in tab.~\ref{tab:sock_opt_udp}; anche in questo +caso per poterle utilizzare occorrerà impostare l'opportuno valore per +l'argomento \param{level}, che è \const{SOL\_UDP} (o l'equivalente +\const{IPPROTO\_UDP}). Le costanti che identificano dette opzioni sono +definite in \file{netinet/udp.h}, ed accessibili includendo detto +file.\footnote{come per TCP, la definizione delle opzioni effettivamente + supportate dal kernel si trova in realtà nel file \texttt{linux/udp.h}, dal + quale si sono estratte le costanti di tab.~\ref{tab:sock_opt_udplevel}.} + +\begin{table}[!htb] + \centering + \footnotesize + \begin{tabular}[c]{|l|c|c|c|l|l|} + \hline + \textbf{Opzione}&\texttt{get}&\texttt{set}&\textbf{flag}&\textbf{Tipo}& + \textbf{Descrizione}\\ + \hline + \hline + \const{UDP\_CORK} &$\bullet$&$\bullet$&&\texttt{}& %??? + .\\ + \const{UDP\_ENCAP} &$\bullet$&$\bullet$&&\texttt{}& %??? + .\\ + \hline + \end{tabular} + \caption{Le opzioni per i socket UDP disponibili al livello + \const{SOL\_UDP}.} + \label{tab:sock_opt_udplevel} +\end{table} + +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}} + +\item[\const{UDP\_CORK}] Introdotta con il kernel 2.5.44 + +\item[\const{UDP\_ENCAP}] Introdotta con il kernel 2.5.67. + +\end{basedescript} + + + + +\section{La gestione attraverso le funzioni di controllo} \label{sec:sock_ctrl_func} -Benché la maggior parte delle caratteristiche dei socket sia gestita -attraverso le due funzioni \func{setsockopt} e \func{getsockopt}, alcune -funzionalità possono essere impostate attraverso quelle che sono le funzioni -classiche per il controllo delle proprietà dei file, cioè \func{fcntl} e -\func{ioctl}. +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. -\subsection{L'uso di \func{ioctl} per i socket} +\subsection{L'uso di \func{ioctl} e \func{fcntl} per i socket generici} \label{sec:sock_ioctl} -Abbiamo già trattato l'uso di \func{ioctl} in sez.~\ref{sec:file_ioctl}, dove -però ne abbiamo descritto le funzionalità nell'ambito della sua applicazione a -file descriptor associati a file normali; tratteremo qui invece il suo uso -specifico quando la si impiega su file descriptor associati a dei socket. - -Quanto utilizzata con socket generici i valori utilizzabili per il secondo -argomento della funzione (\param{request}, che indica il tipo di operazione -richiesta) sono quelli riportati nel seguente elenco, il terzo argomento della -funzione (quello usato per inviare o ricevere i dati) dipende dalla richiesta -effettuata, ed è anch'esso illustrato nell'elenco in corrispondenza alla -relativa richiesta: +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. + +Nell'elenco seguente si riportano i valori specifici che può assumere il +secondo argomento della funzione \func{ioctl} (\param{request}, che indica il +tipo di operazione da effettuare) quando essa viene applicata ad un socket +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}} -\item[\const{SIOCGSTAMP}] restituisce una struttura \struct{timeval} con la - marca temporale dell'ultimo pacchetto ricevuto sul socket, questa operazione - può essere utilizzata per effettuare delle misurazioni precise del tempo di - andata e ritorno\footnote{il cosiddetto \itindex{round~trip~time} - \textit{round trip time}.} dei pacchetti sulla rete. +\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 + misurazioni precise del tempo di andata e ritorno\footnote{il + \itindex{Round~Trip~Time} \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 \const{SIGIO} e \const{SIGURG} quando viene completata una operazione di I/O asincrono o - arrivano dei dati urgenti. Il terzo argomento deve essere un puntatore ad una - variabile di tipo \type{pid\_t}; un valore positivo indica direttamente il - \acr{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 + arrivano dei dati urgenti \itindex{out-of-band} (\texttt{out-of-band}). Il + terzo argomento deve essere un puntatore ad una variabile di tipo + \type{pid\_t}; un valore positivo indica direttamente il \acr{pid} del + 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 \const{SIGIO} e + \const{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. Questa significa (vedi sez.~\ref{sec:file_asyncronous_operation}) + socket. Questo significa (vedi sez.~\ref{sec:file_asyncronous_operation}) che verrà inviato il segnale di \const{SIGIO} (o quanto impostato con \const{F\_SETSIG}, vedi sez.~\ref{sec:file_fcntl}) in caso di eventi di I/O sul socket. +\end{basedescript} - -\item[\const{SIOCGPGRP}] . - +Nel caso dei socket generici anche \func{fcntl} prevede un paio di comandi +specifici; in questo caso il secondo argomento (\param{cmd}, che indica il +comando) può assumere i due valori \const{FIOGETOWN} e \const{FIOSETOWN}, +mentre il terzo argomento dovrà essere un puntatore ad una variabile di tipo +\type{pid\_t}. Questi due comandi sono una modalità alternativa di eseguire le +stesse operazioni (lettura o impostazione del processo o del gruppo di +processo che riceve i segnali) che si effettuano chiamando \func{ioctl} con +\const{SIOCGPGRP} e \const{SIOCSPGRP}. + + +\subsection{L'uso di \func{ioctl} per i socket TCP e UDP} +\label{sec:sock_ioctl_IP} + +Oltre alle caratteristiche che si possono impostare per i socket generici, la +funzione \func{ioctl} consente di effettuare alcune operazioni specifiche per +i socket UDP e TCP. Non esistono operazioni specifiche per i socket IP +generici, mentre per i pacchetti di altri protocolli trasportati su IP, +qualora li si gestisca attraverso dei socket, si dovrà fare riferimento +direttamente all'eventuale supporto presente per il tipo di socket usato (ad +esempio si possono ricevere pacchetti ICMP con socket di tipo \texttt{raw}, +nel qual caso si dovrà fare riferimento alle operazioni di quest'ultimo). + +Le operazioni di controllo disponibili per i socket TCP, come illustrate dalla +relativa pagina di manuale, accessibile con \texttt{man 7 tcp}, 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}} +\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}. +\item[\const{SIOCATMARK}] ritorna un intero non nullo, da intendere come + valore logico, se il flusso di dati letti sul socket è arrivato sulla + posizione (detta anche \textit{urgent mark}) in cui sono stati ricevuti + \itindex{out-of-band} dati urgenti (vedi sez.~\ref{sec:TCP_urgent_data}). + Una operazione di lettura da un socket non attraversa mai questa posizione, + per cui è possibile controllare se la si è raggiunta o meno con questa + operazione. + + Questo è utile quando si attiva l'opzione \const{SO\_OOBINLINE} (vedi + sez.~\ref{sec:sock_generic_options}) per ricevere i dati urgenti all'interno + del flusso dei dati ordinari del socket;\footnote{vedremo in + sez.~\ref{sec:TCP_urgent_data} che in genere i dati urgenti presenti su un + socket si leggono \textit{out-of-band} usando un opportuno flag per + \func{recvmsg}.} in tal caso quando \const{SIOCATMARK} restituisce un + valore non nullo si saprà che la successiva lettura dal socket restituirà i + dati urgenti e non il normale traffico; torneremo su questo in maggior + dettaglio in sez.~\ref{sec:TCP_urgent_data}. + +\item[\const{SIOCOUTQ}] restituisce la quantità di dati non ancora inviati + presenti nel buffer di spedizione; come per \const{SIOCINQ} il socket non + deve essere in stato \texttt{LISTEN}, altrimenti si avrà un errore di + \errval{EINVAL}. \end{basedescript} -\subsection{L'uso di \func{fcntl} per i socket} -\label{sec:sock_fcntl} - +Le operazioni di controllo disponibili per i socket UDP, come illustrate dalla +relativa pagina di manuale, accessibile con \texttt{man 7 udp}, sono quelle +indicate nelle 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}} +\item[\const{FIONREAD}] +\item[\const{TIOCOUTQ}] +\end{basedescript} -Come per \func{ioctl} abbiamo trattato l'uso di \func{fcntl} in -sez.~\ref{sec:file_fcntl}, dove ne abbiamo descritto le funzionalità -nell'ambito dell'applicazione su file normali; tratteremo qui il suo uso -specifico quando la si impiega su file descriptor associati a dei socket. -\subsection{L'uso di \func{sysctl} per le proprietà della rete} -\label{sec:sock_sysctl} +\section{La gestione con \func{sysctl} ed il filesystem \texttt{/proc}} +\label{sec:sock_sysctl_proc} -Come ultimo argomento di questa sezione tratteremo l'uso della funzione +Come ultimo argomento di questo capitolo tratteremo l'uso della funzione \func{sysctl} (che è stata introdotta nelle sue funzionalità generiche in sez.~\ref{sec:sys_sysctl}) per quanto riguarda le sue capacità di effettuare -impostazioni relative alle proprietà dei socket. La differenza nell'uso di -\func{sysctl} rispetto alle funzioni viste finora è che esse consentono di -controllare le proprietà di un singolo socket, mentre con \func{sysctl} si +impostazioni relative alle proprietà dei socket. Dato che le stesse +funzionalità sono controllabili direttamente attraverso il filesystem +\texttt{/proc}, le tratteremo attraverso i file presenti in quest'ultimo. + + +\subsection{L'uso di \func{sysctl} e \texttt{/proc} per le proprietà della + rete} +\label{sec:sock_sysctl} + +La differenza nell'uso di \func{sysctl} e del filesystem \texttt{/proc} +rispetto a quello delle funzioni \func{ioctl} e \func{fcntl} visto in +sez.~\ref{sec:sock_ctrl_func} o all'uso di \func{getsockopt} e +\func{setsockopt} è che queste funzioni consentono di controllare le proprietà +di un singolo socket, mentre con \func{sysctl} e con \texttt{/proc} si impostano proprietà (o valori di default) validi a livello dell'intero -sistema. - -Le opzioni disponibili per le proprietà della rete sono riportate nella -gerarchia dei valori impostabili con \func{sysctl}, 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}) relative ai vari protocolli e tipi di interfacce su cui è -possibile intervenire per effettuare impostazioni; un contenuto tipico di -questa directory è il seguente: +sistema, e cioè per tutti i socket. + +Le opzioni disponibili per le proprietà della rete, nella gerarchia dei valori +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}) +relative ai vari protocolli e tipi di interfacce su cui è possibile +intervenire per effettuare impostazioni; un contenuto tipico di questa +directory è il seguente: \begin{verbatim} /proc/sys/net/ |-- core @@ -3081,15 +3311,29 @@ questa directory |-- token-ring `-- unix \end{verbatim} -e sono presenti varie centinaia di diversi parametri; nel nostro caso ci -limiteremo a vedere quelli più significativi. +e sono presenti varie centinaia di parametri, molti dei quali non sono neanche +documentati; nel nostro caso ci limiteremo ad illustrare quelli più +significativi. -Nella directory \texttt{/proc/sys/net/core} sono disponibili i parametri -generici validi per tutti i socket, quelli descritti anche nella rispettiva -pagina di manuale.\footnote{quella accessibile con \texttt{man 7 socket}.} -I principali sono: +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 +\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 +corrispondono a nessun nodo di \func{sysctl}. -\begin{basedescript}{\desclabelwidth{3.2cm}\desclabelstyle{\nextlinelabel}} + + +\subsection{I valori di controllo per i socket generici} +\label{sec:sock_gen_sysctl} + +Nella directory \texttt{/proc/sys/net/core} sono presenti i file +corrispondenti ai parametri generici validi per tutti i socket. Quelli +descritti anche nella pagina di manuale, accessibile con \texttt{man 7 socket} +sono i seguenti: + +\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}} \item[\texttt{rmem\_default}] imposta la dimensione di default del buffer di lettura (cioè per i dati in ingresso) dei socket. \item[\texttt{rmem\_max}] imposta la dimensione massima che si può assegnare al @@ -3100,32 +3344,96 @@ I principali sono: \item[\texttt{wmem\_max}] imposta la dimensione massima che si può assegnare al buffer di uscita dei socket attraverso l'uso dell'opzione \const{SO\_SNDBUF}. -\item[\texttt{message\_cost}, \texttt{message\_burst}] impostano i valori - delle impostazioni del \itindex{bucket~filter} \textit{bucket filter} - (rispettivamente flusso a regime e dimensione di picchi di emissione) che - limita l'ammontare dei messaggi di avvertimento inviati dal kernel a causa - di eventi esterni sulla rete. -% TODO: spiegare il ucket filter e questa opzione +\item[\texttt{message\_cost}, \texttt{message\_burst}] contengono le + impostazioni del \itindex{bucket~filter} \textit{bucket filter} che + controlla l'emissione di messaggi di avviso da parte kernel per eventi + relativi a problemi sulla rete, imponendo un limite che consente di + prevenire eventuali attacchi di \itindex{Denial~of~Service~(DoS)} + \textit{Denial of Service} usando i log.\footnote{senza questo limite un + attaccante potrebbe inviare ad arte un traffico che generi + intenzionalmente messaggi di errore, per saturare il sistema dei log.} + + Il \itindex{bucket~filter} \textit{bucket filter} è un algoritmo generico + che permette di impostare dei limiti di flusso su una quantità\footnote{uno + analogo viene usato nel \index{netfilter} \textit{netfilter} per imporre + dei limiti sul flusso dei pacchetti.} senza dovere eseguire medie + temporali, che verrebbero a dipendere in misura non controllabile dalla + dimensione dell'intervallo su cui si media e dalla distribuzione degli + eventi;\footnote{in caso di un picco di flusso (il cosiddetto + \textit{burst}) il flusso medio verrebbe a dipendere in maniera esclusiva + dalla dimensione dell'intervallo di tempo su cui calcola la media.} in + questo caso si definisce la dimensione di un ``\textsl{bidone}'' (il + \textit{bucket}) e del flusso che da esso può uscire, la presenza di una + dimensione iniziale consente di assorbire eventuali picchi di emissione, + l'aver fissato un flusso di uscita garantisce che a regime questo sarà il + valore medio del flusso ottenibile dal \textit{bucket}. + + I due valori indicano rispettivamente il flusso a regime (non sarà inviato + più di un messaggio per il numero di secondi specificato da + \texttt{message\_cost}) e la dimensione iniziale per in caso di picco di + emissione (verranno accettati inizialmente fino ad un massimo di + \texttt{message\_cost/message\_burst} messaggi). + \item[\texttt{netdev\_max\_backlog}] numero massimo di pacchetti che possono essere contenuti nella coda di ingresso generale. + \item[\texttt{optmem\_max}] lunghezza massima dei dati ancillari e di controllo (vedi sez.~\ref{sec:net_ancillary_data}). \end{basedescript} -Nella directory \texttt{/proc/sys/net/ipv4} sono disponibili i parametri per i -socket IPv4, descritti anche nella rispettiva pagina di -manuale.\footnote{quella accessibile con \texttt{man 7 ip}.} I principali -sono: +Oltre a questi nella directory \texttt{/proc/sys/net/core} si trovano altri +file, la cui documentazione dovrebbe essere mantenuta nei sorgenti del kernel, +nel file \texttt{Documentation/networking/ip-sysctl.txt}; la maggior parte di +questi però non è documentato: +\begin{basedescript}{\desclabelwidth{3.0cm}\desclabelstyle{\nextlinelabel}} +\item[\texttt{dev\_weight}] blocco di lavoro (\textit{work quantum}) dello + scheduler di processo dei pacchetti. % TODO da documentare meglio + +\item[\texttt{lo\_cong}] valore per l'occupazione della coda di ricezione + sotto la quale si considera di avere una bassa congestione. + +\item[\texttt{mod\_cong}] valore per l'occupazione della coda di ricezione + sotto la quale si considera di avere una congestione moderata. + +\item[\texttt{no\_cong}] valore per l'occupazione della coda di ricezione + sotto la quale si si considera di non avere congestione. + +\item[\texttt{no\_cong\_thresh}] valore minimo (\textit{low water mark}) per + il riavvio dei dispositivi congestionati. + +%\item[\texttt{netdev\_fastroute}] è presente soltanto quando si è compilato il +% kernel con l'apposita opzione di ottimizzazione per l'uso come router (. + +\item[\texttt{somaxconn}] imposta la dimensione massima del \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. + +\end{basedescript} + + +\subsection{I valori di controllo per il protocollo IPv4} +\label{sec:sock_ipv4_sysctl} + +Nella directory \texttt{/proc/sys/net/ipv4} sono presenti i file che +corrispondono ai parametri dei socket che usano il protocollo IPv4, relativi +quindi sia alle caratteristiche di IP, che a quelle degli altri protocolli che +vengono usati all'interno di quest'ultimo (come ICMP, TCP e UDP) o a fianco +dello stesso (come ARP). + +I file che consentono di controllare le caratteristiche specifiche del +protocollo IP in quanto tale, descritti anche nella pagina di manuale +accessibile con \texttt{man 7 ip}, sono i seguenti: \begin{basedescript}{\desclabelwidth{3.2cm}\desclabelstyle{\nextlinelabel}} \item[\texttt{ip\_default\_ttl}] imposta il valore di default per il campo TTL (vedi sez.~\ref{sec:IP_header}) di tutti i pacchetti uscenti. Il valore può - essere modificato per il singolo socket con l'opzione - \const{IP\_TTL}. Prende un valore intero. + essere modificato per il singolo socket con l'opzione \const{IP\_TTL}. + Prende un valore intero. \item[\texttt{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). + ad un altra, e può essere impostato anche per la singola interfaccia. Prende + un valore logico (0 disabilita, diverso da zero abilita). \item[\texttt{ip\_dynaddr}] Abilita la riscrittura automatica degli indirizzi associati ad un socket quando una interfaccia cambia indirizzo. Viene usato @@ -3134,7 +3442,8 @@ sono: valore nullo disabilita la funzionalità, con 1 la si abilita, con 2 la si abilità in modalità \textsl{prolissa}. -\item[\texttt{ip\_autoconfig}] non documentato +\item[\texttt{ip\_autoconfig}] Specifica se l'indirizzo IP è stato configurato + automaticamente via DHCP, BOOTP o RARP. \item[\texttt{ip\_local\_port\_range}] imposta l'intervallo dei valori usati per l'assegnazione delle porte effimere, permette cioè di modificare i @@ -3166,12 +3475,22 @@ sono: di compilazione del kernel con l'opzione \texttt{CONFIG\_IP\_ALWAYS\_DEFRAG}.} -\item[\texttt{}] +\item[\texttt{ip\_nonlocal\_bind}] se abilitato (prende un intero come valore + logico) è possibile che una applicazione possa collegarsi (con \func{bind} + su un indirizzo non locale. Questo può risultare utile per applicazioni + particolari (come gli \textit{sniffer}) che hanno la necessità di ricevere + pacchetti anche non diretti agli indirizzi presenti sulla macchina, ad + esempio per intercettare il traffico per uno specifico indirizzo che si + vuole tenere sotto controllo. +% \item[\texttt{neigh/*}] La directory contiene i valori +% TODO trattare neigh/* nella parte su arp, da capire dove sarà. \end{basedescript} + + % LocalWords: socket sez dotted decimal resolver Domain Name Service cap DNS % LocalWords: client fig LDAP Lightweight Access Protocol NIS Information Sun % LocalWords: like netgroup Switch Solaris glibc libc uclib NSS tab shadow uid @@ -3225,9 +3544,14 @@ sono: % LocalWords: process SIGIO SIGURG KILL FIOASYNC SIOCGPGRP filesystem proc ttl % LocalWords: rmem wmem message cost burst bucket filter netdev backlog optmem % LocalWords: forward dynaddr dial autoconfig local masquerading ipfrag high -% LocalWords: thresh low always defrag CONFIG +% LocalWords: thresh low always defrag CONFIG SETSIG cmd FIOGETOWN FIOSETOWN %%% Local Variables: %%% mode: latex %%% TeX-master: "gapil" %%% End: +% LocalWords: quest'ultime neigh dev weight cong mod somaxconn Di SIOCINQ DoS +% LocalWords: Documentation SIOCATMARK SIOCOUTQ FIONREAD TIOCOUTQ Denial work +% LocalWords: netfilter scheduler mark ARP DHCP BOOTP RARP nonlocal sniffer +% LocalWords: linux NODELAY MAXSEG CORK KEEPIDLE KEEPINTVL KEEPCNT SYNCNT INFO +% LocalWords: DEFER ACCEPT WINDOW CLAMP QUICKACK CONGESTION ENCAP urgent