X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=sockctrl.tex;h=5730bda7bba3ac62a862171d9dcecdbc30b2b00a;hb=cba678a2d4cdb82e16477812b1bef3e89cc1a7dd;hp=7b044082e144d7f69649a792d9dfc8952662f631;hpb=95c8a10330d9001419045dddb1fe5a6f821ce919;p=gapil.git diff --git a/sockctrl.tex b/sockctrl.tex index 7b04408..5730bda 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -2661,8 +2661,6 @@ specificato in \var{l\_linger}. - - \subsection{Le opzioni per il protocollo IPv4} \label{sec:sock_ipv4_options} @@ -2671,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 @@ -2730,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}} @@ -2990,6 +2987,152 @@ sez.~\ref{sec:net_sendmsg}). +\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} @@ -3067,21 +3210,81 @@ processo che riceve i segnali) che si effettuano chiamando \func{ioctl} con \const{SIOCGPGRP} e \const{SIOCSPGRP}. +\subsection{L'uso di \func{ioctl} per l'accesso ai dispositivi di rete} +\label{sec:sock_ioctl_netdevice} + +Benché non strettamente attinenti alla gestione dei socket, vale la pena di +trattare qui l'interfaccia di accesso a basso livello ai dispositivi di rete +che viene appunto fornita attraverso la funzione \texttt{ioctl}. Questa non è +attinente a carattestiche specifiche di un qualche protocollo, ma si applica a +tutti i socket, indipendentemente dal tipo o famiglia dello stesso, e permette +di impostare e rilevare le funzionalità delle interfacce di rete. + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \includestruct{listati/ifreq.h} + \end{minipage} + \caption{La struttura \structd{ifreq} utilizzata dalle \func{ioctl} per le + operazioni di controllo sui dispositivi di rete.} + \label{fig:iface_ifreq_struct} +\end{figure} + +Tutte le operazioni di questo tipo utilizzano come terzo argomento di +\func{ioctl} il puntatore ad una struttura \struct{ifreq}, la cui definizione +è illustrata in fig.~\ref{fig:iface_ifreq_struct}. La struttura utililzza il +primo campo, \var{ifr\_name} per mantenere il nome dell'interfaccia su cui si +vuole operare (ad esempio \texttt{eth0}, \texttt{ppp0}, ecc.), restituisce i +valori nel secondo campo, che è definito appunto come una \ctyp{union}. Le +costanti che identificano le operazioni disponibili sono le seguenti: +\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}} +\item[\const{SIOCGIFNAME}] . +\item[\const{SIOCGIFINDEX}] . +\item[\const{SIOCGIFFLAGS}] . +\item[\const{SIOCSIFFLAGS}] . +\item[\const{SIOCGIFMETRIC}] . +\item[\const{SIOCSIFMETRIC}] . +\item[\const{SIOCGIFMTU}] . +\item[\const{SIOCSIFMTU}] . +\item[\const{SIOCGIFHWADDR}] . +\item[\const{SIOCSIFHWADDR}] . +\item[\const{SIOCSIFHWBROADCAST}] . +\item[\const{SIOCGIFMAP}] . +\item[\const{SIOCSIFMAP}] . +\item[\const{SIOCADDMULTI}] . +\item[\const{SIOCDELMULTI}] . +\item[\const{SIOCGIFTXQLEN}] . +\item[\const{SIOCSIFTXQLEN}] . +\item[\const{SIOCSIFNAME}] . +\item[\const{SIOCGIFCONF}] . +\end{basedescript} + + + \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 +Non esistono operazioni specifiche per i socket IP in quanto tali,\footnote{a + parte forse \const{SIOCGIFCONF}, che però resta attinente alle proprietà + delle interfacce di rete, per cui l'abbiamo trattata in + sez.~\ref{sec:sock_ioctl_netdevice} insieme alle altre che comunque si + applicano anche ai socket IP.} 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. + +Tuttavia la gran parte dei socket utilizzati nella programmazione di rete +utilizza proprio il protocollo IP, e quello che succede è che in realtà 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 +i socket che usano questo protocollo, ma queste vendono eseguite, invece che a +livello di IP, al successivo livello di trasporto, vale a dire in maniera +specifica per i socket TCP e UDP. + +Le operazioni di controllo disponibili per i socket TCP sono illustrate dalla +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}: @@ -3113,16 +3316,17 @@ essere sempre il puntatore ad una variabile di tipo \ctyp{int}: \errval{EINVAL}. \end{basedescript} - -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}: +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}} -\item[\const{FIONREAD}] -\item[\const{TIOCOUTQ}] +\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 + invio locale; questa opzione è supportata soltanto a partire dal kernel 2.4 \end{basedescript} @@ -3410,3 +3614,5 @@ accessibile con \texttt{man 7 ip}, sono i seguenti: % 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