From: Simone Piccardi Date: Sun, 5 Jun 2005 16:59:09 +0000 (+0000) Subject: Materiale sulle opzioni dei socket IP, con aggiunte di un po' di riferimenti X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=f9c6b7cb541bb01ec0130e120eb75eaa83a24299 Materiale sulle opzioni dei socket IP, con aggiunte di un po' di riferimenti e placeholder in altre sezioni. --- diff --git a/listati/pktinfo.h b/listati/pktinfo.h new file mode 100644 index 0000000..8862d62 --- /dev/null +++ b/listati/pktinfo.h @@ -0,0 +1,6 @@ +struct in_pktinfo { + unsigned int ipi_ifindex; /* Interface index */ + struct in_addr ipi_spec_dst; /* Local address */ + struct in_addr ipi_addr; /* Header Destination address */ +}; + diff --git a/netlayer.tex b/netlayer.tex index 75815b1..8926bfc 100644 --- a/netlayer.tex +++ b/netlayer.tex @@ -203,6 +203,40 @@ indirizzi di rete da inserire nelle tabelle di instradamento dei router. +\subsection{L'intestazione di IP} +\label{sec:IP_header} + + +Il campo TOS definisce il cosiddetto \textit{Type of Service}; questo permette +di definire il tipo di traffico contenuto nei pacchetti, e può essere +utilizzato dai router per dare diverse priorità in base al valore assunto da +questo campo. + +\begin{table}[!htb] + \centering + \footnotesize + \begin{tabular}[c]{|l|l|} + \hline + \textbf{Costante} & \textbf{Significato} \\ + \hline + \hline + \const{IPTOS\_LOWDELAY} & minimizza i ritardi per il traffico + interattivo. \\ + \const{IPTOS\_THROUGHPUT} & ottimizza la trasmissione per il massimo + flusso di dati.\\ + \const{IPTOS\_RELIABILITY}& ottimizza per l'affidabilità della + trasmissione. \\ + \const{IPTOS\_MINCOST} & usato per dati di riempimento, dove non + interessa se c'è una bassa velocità di + trasmissione.\\ + \hline + \end{tabular} + \caption{Le costanti che definiscono alcuni valori standard per il campo TOS + da usare come argomento \param{optval} per l'opzione \const{IP\_TOS}.} + \label{tab:IP_TOS_values} +\end{table} + + \subsection{Le opzioni di IP} \label{sec:IP_options} @@ -210,6 +244,8 @@ indirizzi di rete da inserire nelle tabelle di instradamento dei router. + + \section{Il protocollo IPv6} \label{sec:ipv6_protocol} diff --git a/othersock.tex b/othersock.tex index 4be71fb..7231bf2 100644 --- a/othersock.tex +++ b/othersock.tex @@ -747,13 +747,19 @@ l'interfaccia di programmazione che serve ad utilizzarli resta sempre quella dei socket. +\section{I socket \textit{raw}} +\label{sec:socket_raw} + +Tratteremo in questa sezione i cosiddetti \textit{raw socket}, con i quali si +possono \textsl{forgiare} direttamente i pacchetti a tutti i livelli dello +stack dei protocolli. + \section{Altri socket} \label{sec:socket_other} Tratteremo in questa sezione gli altri tipi particolari di socket supportati -da Linux, come i \textit{raw socket}, con i quali si possono \textsl{forgiare} -direttamente i pacchetti a tutti i livelli dello stack dei protocolli, o i +da Linux, come quelli relativi a particolare protocolli di trasmissione ed i socket \textit{netlink} che definiscono una interfaccia di comunicazione con il kernel. diff --git a/sockadv.tex b/sockadv.tex index 3224929..2abcb65 100644 --- a/sockadv.tex +++ b/sockadv.tex @@ -26,6 +26,12 @@ controllare le funzionalit disponibili con i vari tipi di socket. +\subsection{I messaggi ancillari} +\label{sec:TCP_ancillary_data} + + + + \subsection{I dati \textit{out-of-band}} \label{sec:TCP_urgent_data} diff --git a/sockctrl.tex b/sockctrl.tex index 87dca61..fe1a12c 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -2262,9 +2262,9 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: per primi, in modalità che dipendono dalla disciplina di gestione della coda. Nel caso di protocollo IP questa opzione permette anche di impostare i valori del campo \textit{type of service} (noto come TOS, vedi - sez.~\ref{sec:IP_xxx}) per i pacchetti uscenti. Per impostare una priorità - al di fuori dell'intervallo di valori fra 0 e 6 sono richiesti i privilegi - di amministratore con la capability \const{CAP\_NET\_ADMIN}. + sez.~\ref{sec:IP_header}) per i pacchetti uscenti. Per impostare una + priorità al di fuori dell'intervallo di valori fra 0 e 6 sono richiesti i + privilegi di amministratore con la capability \const{CAP\_NET\_ADMIN}. \item[\const{SO\_ERROR}] questa opzione riceve un errore presente sul socket; può essere utilizzata soltanto con \func{getsockopt} e prende per @@ -2515,7 +2515,7 @@ il sistema non supporta l'opzione \const{IP\_RECVDSTADDR};\footnote{nel caso sviluppo del kernel 2.1.x, ma è in seguito stata soppiantata dall'uso di \const{IP\_PKTINFO} (vedi sez.~\ref{sec:sock_ipv4_options}).} in tale modo si può sapere a quale socket corrisponde un certo indirizzo. Non ha senso -fare questa operazionie per socket TCP dato che su di essi si può sempre +fare questa operazione per un socket TCP dato che su di essi si può sempre invocare \func{getsockname} una volta che si è completata la connessione. Infine il quarto caso è quello in cui si vuole effettivamente ottenere un @@ -2666,7 +2666,9 @@ socket che usano il protocollo IPv4.\footnote{come per le precedenti opzioni 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}. +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] @@ -2678,46 +2680,42 @@ opzioni in tab.~\ref{tab:sock_opt_iplevel}. \textbf{Descrizione}\\ \hline \hline - \const{IP\_OPTIONS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Imposta o riceve le opzioni di IP.\\ - \const{IP\_PKTINFO}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Passa un messaggio di informazione.\\ - \const{IP\_RECVTOS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Passa un messaggio col campo TOS.\\ - \const{IP\_RECVTTL}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Passa un messaggio col campo TTL.\\ - \const{IP\_RECVOPTS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Passa un messaggio con le opzioni IP.\\ - \const{IP\_RETOPTS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Passa un messaggio con le opzioni IP non - trattate.\\ - \const{IP\_TOS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Imposta il valore del campo TOS.\\ - \const{IP\_TTL}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Imposta il valore del campo TTL.\\ - \const{IP\_HDRINCL}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Passa l'intestazione di IP nei dati.\\ - \const{IP\_RECVERR}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Abilita la gestione degli errori.\\ - \const{IP\_MTU\_DISCOVER}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Imposta il Path MTU Discovery.\\ - \const{IP\_MTU}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Legge il valore attuale della MTU.\\ - \const{IP\_ROUTER\_ALERT}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Imposta l'opzione \textit{IP router alert} sui - pacchetti.\\ - \const{IP\_MULTICAST\_TTL}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Imposta il TTL per i pacchetti multicast.\\ - \const{IP\_MULTICAST\_LOOP}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Controlla il reinvio a se - stessi dei dati di multicast.\\ - \const{IP\_ADD\_MEMBERSHIP}& &$\bullet$&$\bullet$&\texttt{int}& - Si unisce a un gruppo di multicast.\\ + \const{IP\_OPTIONS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Imposta o riceve le opzioni di IP.\\ + \const{IP\_PKTINFO} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Passa un messaggio di informazione.\\ + \const{IP\_RECVTOS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Passa un messaggio col campo TOS.\\ + \const{IP\_RECVTTL} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Passa un messaggio col campo TTL.\\ + \const{IP\_RECVOPTS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Passa un messaggio con le opzioni IP.\\ + \const{IP\_RETOPTS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Passa un messaggio con le opzioni IP non trattate.\\ + \const{IP\_TOS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Imposta il valore del campo TOS.\\ + \const{IP\_TTL} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Imposta il valore del campo TTL.\\ + \const{IP\_HDRINCL} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Passa l'intestazione di IP nei dati.\\ + \const{IP\_RECVERR} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Abilita la gestione degli errori.\\ + \const{IP\_MTU\_DISCOVER} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Imposta il Path MTU Discovery.\\ + \const{IP\_MTU} &$\bullet$& &$\bullet$&\texttt{int}& + Legge il valore attuale della MTU.\\ + \const{IP\_ROUTER\_ALERT} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Imposta l'opzione \textit{IP router alert} sui pacchetti.\\ + \const{IP\_MULTICAST\_TTL} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Imposta il TTL per i pacchetti multicast.\\ + \const{IP\_MULTICAST\_LOOP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Controlla il reinvio a se stessi dei dati di multicast.\\ + \const{IP\_ADD\_MEMBERSHIP} & &$\bullet$&$\bullet$&\texttt{int}& + Si unisce a un gruppo di multicast.\\ \const{IP\_DROP\_MEMBERSHIP}& &$\bullet$&$\bullet$&\texttt{int}& - Si sgancia da un gruppo di multicast.\\ - \const{IP\_MULTICAST\_IF}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Imposta l'interfaccia locale di un socket - multicast.\\ + Si sgancia da un gruppo di multicast.\\ + \const{IP\_MULTICAST\_IF} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Imposta l'interfaccia locale di un socket multicast.\\ \hline \end{tabular} \caption{Le opzioni disponibili al livello \const{SOL\_IP}.} @@ -2734,40 +2732,121 @@ elenco: opzioni del protocollo IP (si veda sez.~\ref{sec:IP_options}). L'opzione prende come valore dell'argomento \param{optval} un puntatore ad un buffer dove sono mantenute le opzioni, mentre \param{optlen} indica la dimensione - di quest'ultimo. Quando la si usa con \func{setsockopt} - -\item[\const{IP\_PKTINFO}] - -\item[\const{IP\_RECVTOS}] - -\item[\const{IP\_RECVTTL}] - -\item[\const{IP\_RECVOPTS}] - -\item[\const{IP\_RETOPTS}] - - -\item[\const{IP\_TOS}] - - -\item[\const{IP\_TTL}] - - -\item[\const{IP\_HDRINCL}] - - -\item[\const{IP\_RECVERR}] - -\item[\const{IP\_MTU\_DISCOVER}] - -\item[\const{IP\_MTU}] - -\item[\const{IP\_ROUTER\_ALERT}] - -\item[\const{IP\_MULTICAST\_TTL}] + di quest'ultimo. Quando la si usa con \func{getsockopt} vengono lette le + opzioni IP utilizzate per la spedizione, quando la si usa con + \func{setsockopt} vengono impostate le opzioni specificate. L'uso di questa + opzione richiede una profonda conoscenza del funzionamento del protocollo, + torneremo in parte sull'argomento in sez.~\ref{sec:sock_advanced_xxx}. + + +\item[\const{IP\_PKTINFO}] Quando abilitata l'opzione permette di ricevere + insieme ai pacchetti un messaggio ancillare (vedi + sez.~\ref{sec:TCP_ancillary_data}) di tipo \const{IP\_PKTINFO} contenente + una struttura \struct{pktinfo} (vedi fig.~\ref{fig:sock_pktinfo_struct}) che + mantiene una serie di informazioni riguardo i pacchetti in arrivo. In + particolare è possibile conoscere l'interfaccia su cui è stato ricevuto un + pacchetto (nel campo \var{ipi\_ifindex}), l'indirizzo locale da esso + utilizzato (nel campo \var{ipi\_spec\_dst}) e l'indirizzo remoto dello + stesso (nel campo \var{ipi\_addr}). +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \includestruct{listati/pktinfo.h} + \end{minipage} + \caption{La struttura \structd{pktinfo} usata dall'opzione + \const{IP\_PKTINFO} per ricavare informazioni sui pacchetti di un socket + di tipo \const{SOCK\_DGRAM}.} + \label{fig:sock_pktinfo_struct} +\end{figure} +L'opzione è utilizzabile solo per socket di tipo \const{SOCK\_DGRAM}. Questa è +una opzione introdotta con i kernel della serie 2.2.x, ed è specifica di +Linux;\footnote{non dovrebbe pertanto essere utilizzata se si ha a cuore la + portabilità.} essa permette di sostituire le opzioni \const{IP\_RECVDSTADDR} +e \const{IP\_RECVIF} presenti in altri Unix (la relativa informazione è quella +ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di +\struct{pktinfo}). + + +\item[\const{IP\_RECVTOS}] Quando abilitata l'opzione permette di ricevere + insieme ai pacchetti un messaggio ancillare di tipo \const{IP\_TOS}, che + contiene un byte con il valore del campo \textit{Type of Service} + dell'intestazione IP del pacchetto stesso (vedi sez.~\ref{sec:IP_header}). + Prende per \param{optval} un intero usato come valore logico. + +\item[\const{IP\_RECVTTL}] Quando abilitata l'opzione permette di ricevere + insieme ai pacchetti un messaggio ancillare di tipo \const{IP\_RECVTTL}, + contenente un byte con il valore del campo \textit{Time to Live} + dell'intestazione IP (vedi sez.~\ref{sec:IP_header}). L'opzione richiede + per \param{optval} un intero usato come valore logico. L'opzione non è + supportata per socket di tipo \const{SOCK\_STREAM}. + +\item[\const{IP\_RECVOPTS}] Quando abilitata l'opzione permette di ricevere + insieme ai pacchetti un messaggio ancillare di tipo \const{IP\_OPTIONS}, + contenente le opzioni IP del protocollo (vedi sez.~\ref{sec:IP_options}). Le + intestazioni di instradamento e le altre opzioni sono già riempite con i + dati locali. L'opzione richiede per \param{optval} un intero usato come + valore logico. L'opzione non è supportata per socket di tipo + \const{SOCK\_STREAM}. + +\item[\const{IP\_RETOPTS}] Identica alla precedente \const{IP\_RECVOPTS}, ma + in questo caso restituisce i dati grezzi delle opzioni, senza che siano + riempiti i capi di instradamento e le marche temporali. L'opzione richiede + per \param{optval} un intero usato come valore logico. L'opzione non è + 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. Il campo TOS è di 8 bit e l'opzione richiede per \param{optval} + un intero che ne contiene il valore. Sono definite anche alcune costanti che + definiscono alcuni valori standardizzati per il \textit{Type of Service}, + riportate in tab.~\ref{tab:IP_TOS_values}. Si ricordi che la priorità dei + pacchetti può essere impostata anche in maniera indipendente 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}). + Il campo TTL è di 8 bit e l'opzione richiede che \param{optval} sia un + intero, che ne conterrà il valore. + + +\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 + impostati con \const{IP\_OPTIONS}, \const{IP\_TOS} o \const{IP\_TTL} sono + ignorati. In ogni caso prima della spedizione alcuni campi + dell'instestazione vengono comunque modificati dal kernel, torneremo + sull'argomento in sez.~\ref{sec:socket_raw_xxx} + + +\item[\const{IP\_RECVERR}] Questa è una opzione introdotta con i kernel della + serie 2.2.x, ed è specifica di Linux. + +\item[\const{IP\_MTU\_DISCOVER}] Questa è una opzione introdotta con i kernel + della serie 2.2.x, ed è specifica di Linux. + +\item[\const{IP\_MTU}] Permette di leggere il valore della \textit{Maximum + Tranfer Unit} di percorso (vedi sez.~\ref{sec:net_lim_dim}) del socket. + L'opzione richiede per \param{optval} un intero che conterrà il valore della + MTU in byte. Questa è una opzione introdotta con i kernel della serie + 2.2.x, ed è specifica di Linux. + +\item[\const{IP\_ROUTER\_ALERT}] Questa è una opzione introdotta con i kernel + della serie 2.2.x, ed è specifica di Linux. + +\item[\const{IP\_MULTICAST\_TTL}] L'opzione permette di impostare o leggere il + valore del campo TTL per i pacchetti in uscita associati al socket. È + importante che questo valore sia il più basso possibile, ed il default è 1, + che significa che i pacchetti non potranno uscire dalla rete locale. Questa + opzione consente ai programmi che lo richiedono di superare questo limite. + L'opzione richiede per \param{optval} un intero che conterrà il valore del + TTL. \item[\const{IP\_MULTICAST\_LOOP}] L'opzione consente di decidere se i dati che si inviano su un socket usato con il multicast vengano ricevuti anche @@ -2777,14 +2856,14 @@ elenco: In generale se si vuole che eventuali client possano ricevere i dati che si inviano occorre che questa funzionalità sia abilitata (come avviene di default). Qualora però non si voglia generare traffico per dati che già sono - disponibili l'uso di questa opzione permette di disabilitare questo tipo di - traffico. + disponibili in locale l'uso di questa opzione permette di disabilitare + questo tipo di traffico. \item[\const{IP\_ADD\_MEMBERSHIP}] \item[\const{IP\_DROP\_MEMBERSHIP}] -\item[\const{IP\_MULTICAST\_IF}] +\item[\const{IP\_MULTICAST\_IF}] \end{basedescript}