X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=sockctrl.tex;h=2d5a2c99c1e0017a7c08f943714540a04803994c;hb=ad4c9f4f0809a57fd1767c8ca3548766cfd5a91d;hp=cd79adece594245c60cde02eaaf8461fd1bb06ce;hpb=c1d39844362623e9806b0842f30447eb2cd1c90b;p=gapil.git diff --git a/sockctrl.tex b/sockctrl.tex index cd79ade..2d5a2c9 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -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,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} @@ -3032,11 +3177,12 @@ identificano le operazioni sono le seguenti: \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 @@ -3087,9 +3233,27 @@ essere sempre il puntatore ad una variabile di tipo \ctyp{int}: 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 è arrivato sulla posizione in cui sono - stati ricevuti dati urgenti. -\item[\const{SIOCOUTQ}] + 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} @@ -3389,3 +3553,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