Le classi usate per il dispiegamento delle reti su quella che comunemente
viene chiamata \textit{Internet} sono le prime tre; la classe D è destinata al
-(non molto usato) \textit{multicast} mentre la classe E è riservata per usi
-sperimentali e non viene impiegata.
+(non molto usato) \itindex{multicast} \textit{multicast} mentre la classe E è
+riservata per usi sperimentali e non viene impiegata.
Come si può notare però la suddivisione riportata in
tab.~\ref{tab:IP_ipv4class} è largamente inefficiente in quanto se ad un
supportare una gerarchia con più livelli di indirizzamento, un numero di
nodi indirizzabili molto maggiore e una autoconfigurazione degli indirizzi
\item l'introduzione un nuovo tipo di indirizzamento, l'\textit{anycast} che
- si aggiungono agli usuali \textit{unycast} e \textit{multicast}
+ si aggiungono agli usuali \textit{unicast} e \itindex{multicast}
+ \textit{multicast}
\item la semplificazione del formato dell'intestazione, eliminando o rendendo
opzionali alcuni dei campi di IPv4, per eliminare la necessità di
riprocessamento della stessa da parte dei router e contenere l'aumento di
quello di IPv6 sono le seguenti:
\begin{itemize}
-\item il broadcasting non è previsto in IPv6, le applicazioni che lo usano
- dovono essere reimplementate usando il multicasting (vedi
+\item il \itindex{broadcast} \textit{broadcasting} non è previsto in IPv6, le
+ applicazioni che lo usano dovono essere reimplementate usando il
+ \itindex{multicast} \textit{multicasting} (vedi
sez.~\ref{sec:IP_ipv6_multicast}), che da opzionale diventa obbligatorio.
\item è stato introdotto un nuovo tipo di indirizzi, gli \textit{anycast}.
\item i router non possono più frammentare i pacchetti lungo il cammino, la
unicast site-local & \texttt{1111 1110 11} & 1/1024 \\
\hline
\hline
- multicast & \texttt{1111 1111} & 1/256 \\
+ \textit{multicast} & \texttt{1111 1111} & 1/256 \\
\hline
\end{tabular}
\caption{Classificazione degli indirizzi IPv6 a seconda dei bit più
\label{sec:IP_ipv6_addr_arch}
Come per IPv4 gli indirizzi sono identificatori per una singola (indirizzi
-\textit{unicast}) o per un insieme (indirizzi \textit{multicast} e
-\textit{anycast}) di interfacce di rete.
+\textit{unicast}) o per un insieme (indirizzi \itindex{multicast}
+\textit{multicast} e \textit{anycast}) di interfacce di rete.
Gli indirizzi sono sempre assegnati all'interfaccia, non al nodo che la
ospita; dato che ogni interfaccia appartiene ad un nodo quest'ultimo può
interfacce. A una interfaccia possono essere associati anche più indirizzi.
IPv6 presenta tre tipi diversi di indirizzi: due di questi, gli indirizzi
-\textit{unicast} e \textit{multicast} hanno le stesse caratteristiche che in
-IPv4, un terzo tipo, gli indirizzi \textit{anycast} è completamente nuovo.
-In IPv6 non esistono più gli indirizzi \textit{broadcast}, la funzione di
-questi ultimi deve essere reimplementata con gli indirizzi \textit{multicast}.
+\textit{unicast} e \itindex{multicast} \textit{multicast} hanno le stesse
+caratteristiche che in IPv4, un terzo tipo, gli indirizzi \textit{anycast} è
+completamente nuovo. In IPv6 non esistono più gli indirizzi
+\itindex{broadcast} \textit{broadcast}, la funzione di questi ultimi deve
+essere reimplementata con gli indirizzi \itindex{multicast}
+\textit{multicast}.
Gli indirizzi \textit{unicast} identificano una singola interfaccia: i
pacchetti mandati ad un tale indirizzo verranno inviati a quella interfaccia,
gli indirizzi \textit{anycast} identificano un gruppo di interfacce tale che
un pacchetto mandato a uno di questi indirizzi viene inviato alla più vicina
(nel senso di distanza di routing) delle interfacce del gruppo, gli indirizzi
-\textit{multicast} identificano un gruppo di interfacce tale che un pacchetto
-mandato a uno di questi indirizzi viene inviato a tutte le interfacce del
-gruppo.
+\itindex{multicast} \textit{multicast} identificano un gruppo di interfacce
+tale che un pacchetto mandato a uno di questi indirizzi viene inviato a tutte
+le interfacce del gruppo.
In IPv6 non ci sono più le classi ma i bit più significativi indicano il tipo
di indirizzo; in tab.~\ref{tab:IP_ipv6addr} sono riportati i valori di detti
costituiscono quello che viene chiamato il \textit{format prefix} ed è sulla
base di questo che i vari tipi di indirizzi vengono identificati. Come si
vede questa architettura di allocazione supporta l'allocazione di indirizzi
-per i provider, per uso locale e per il multicast; inoltre è stato riservato
-lo spazio per indirizzi NSAP, IPX e per le connessioni; gran parte dello
-spazio (più del 70\%) è riservato per usi futuri.
+per i provider, per uso locale e per il \itindex{multicast}
+\textit{multicast}; inoltre è stato riservato lo spazio per indirizzi NSAP,
+IPX e per le connessioni; gran parte dello spazio (più del 70\%) è riservato
+per usi futuri.
Si noti infine che gli indirizzi \textit{anycast} non sono riportati in
tab.~\ref{tab:IP_ipv6addr} in quanto allocati al di fuori dello spazio di
\subsection{Multicasting}
\label{sec:IP_ipv6_multicast}
+\itindbeg{multicast}
+
Gli indirizzi \textit{multicast} sono usati per inviare un pacchetto a un
-gruppo di interfacce; l'indirizzo identifica uno specifico gruppo di multicast
-e il pacchetto viene inviato a tutte le interfacce di detto gruppo.
-Un'interfaccia può appartenere ad un numero qualunque numero di gruppi di
-multicast. Il formato degli indirizzi \textit{multicast} è riportato in
-tab.~\ref{tab:IP_ipv6_multicast}:
+gruppo di interfacce; l'indirizzo identifica uno specifico gruppo di
+\textit{multicast} e il pacchetto viene inviato a tutte le interfacce di detto
+gruppo. Un'interfaccia può appartenere ad un numero qualunque numero di
+gruppi di \textit{multicast}. Il formato degli indirizzi \textit{multicast} è
+riportato in tab.~\ref{tab:IP_ipv6_multicast}:
\begin{table}[htb]
\centering
7 & non assegnato & F & riservato \\
\hline
\end{tabular}
-\caption{Possibili valori del campo \textsl{scop} di un indirizzo multicast.}
+\caption{Possibili valori del campo \textsl{scop} di un indirizzo
+ \textit{multicast}.}
\label{tab:IP_ipv6_multiscope}
\end{table}
-Infine l'ultimo campo identifica il gruppo di multicast, sia permanente che
-transitorio, all'interno del raggio di validità del medesimo. Alcuni
-indirizzi multicast, riportati in tab.~\ref{tab:multiadd} sono già riservati
-per il funzionamento della rete.
+Infine l'ultimo campo identifica il gruppo di \textit{multicast}, sia
+permanente che transitorio, all'interno del raggio di validità del medesimo.
+Alcuni indirizzi \textit{multicast}, riportati in tab.~\ref{tab:multiadd} sono
+già riservati per il funzionamento della rete.
\begin{table}[!htb]
\centering
\href{http://www.ietf.org/rfc/rfc1970.txt}{RFC~1970} \\
\hline
\end{tabular}
-\caption{Gruppi multicast predefiniti.}
+\caption{Gruppi di \textit{multicast} predefiniti.}
\label{tab:multiadd}
\end{table}
L'utilizzo del campo di \textit{scope} e di questi indirizzi predefiniti serve
-a recuperare le funzionalità del broadcasting (ad esempio inviando un
-pacchetto all'indirizzo \texttt{FF02:0:0:0:0:0:0:1} si raggiungono tutti i
-nodi locali).
+a recuperare le funzionalità del \itindex{broadcast} \textit{broadcasting} (ad
+esempio inviando un pacchetto all'indirizzo \texttt{FF02:0:0:0:0:0:0:1} si
+raggiungono tutti i nodi locali).
+\itindend{multicast}
\subsection{Indirizzi \textit{anycast}}
\label{sec:IP_anycast}
I pacchetti autenticati e crittografati portano un indice dei parametri di
sicurezza (SPI, \textit{Security Parameter Index}) che viene negoziato prima
di ogni comunicazione ed è definito dalla stazione sorgente. Nel caso di
-multicast dovrà essere lo stesso per tutte le stazioni del gruppo.
+\textit{multicast} dovrà essere lo stesso per tutte le stazioni del gruppo.
\subsection{Autenticazione}
\label{sec:auth}
indirizzo globale.
La procedura di configurazione è la seguente: all'avvio tutti i nodi IPv6
-iniziano si devono aggregare al gruppo multicast \textit{all-nodes}
-programmando la propria interfaccia per ricevere i messaggi dall'indirizzo
-multicast \texttt{FF02::1} (vedi sez.~\ref{sec:IP_ipv6_multicast}); a questo
-punto devono inviare un messaggio ICMP \textit{Router solicitation} a tutti i
-router locali usando l'indirizzo multicast \texttt{FF02::2} usando come
-sorgente il proprio indirizzo link-local.
+iniziano si devono aggregare al gruppo di \itindex{multicast}
+\textit{multicast} \textit{all-nodes} programmando la propria interfaccia per
+ricevere i messaggi dall'indirizzo \textit{multicast} \texttt{FF02::1} (vedi
+sez.~\ref{sec:IP_ipv6_multicast}); a questo punto devono inviare un messaggio
+ICMP \textit{Router solicitation} a tutti i router locali usando l'indirizzo
+\itindex{multicast} \textit{multicast} \texttt{FF02::2} usando come sorgente
+il proprio indirizzo link-local.
Il router risponderà con un messaggio ICMP \textit{Router Advertisement} che
fornisce il prefisso e la validità nel tempo del medesimo, questo tipo di
introdurre in una rete una stazione autoconfigurante per ottenere un accesso
legale.
-Per questi motivi è previsto anche un protocollo stateful basato su un
-server che offra una versione IPv6 del DHCP; un apposito gruppo di multicast
-\texttt{FF02::1:0} è stato riservato per questi server; in questo caso il
-nodo interrogherà il server su questo indirizzo di multicast con l'indirizzo
-link-local e riceverà un indirizzo unicast globale.
+Per questi motivi è previsto anche un protocollo stateful basato su un server
+che offra una versione IPv6 del DHCP; un apposito gruppo di \textit{multicast}
+\texttt{FF02::1:0} è stato riservato per questi server; in questo caso il nodo
+interrogherà il server su questo indirizzo di \textit{multicast} con
+l'indirizzo link-local e riceverà un indirizzo unicast globale.
\const{SO\_DONTROUTE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
non invia attraverso un gateway.\\
\const{SO\_BROADCAST}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- attiva o disattiva il \textit{broadcast}.\\
+ attiva o disattiva il \itindex{broadcast}
+ \textit{broadcast}.\\
\const{SO\_SNDBUF} &$\bullet$&$\bullet$& &\texttt{int}&
imposta dimensione del buffer di trasmissione.\\
\const{SO\_RCVBUF} &$\bullet$&$\bullet$& &\texttt{int}&
processo remoto connesso al socket; l'opzione è disponibile solo per socket
unix-domain e può essere usata solo con \func{getsockopt}. Utilizza per
\param{optval} una apposita struttura \struct{ucred} (vedi
- sez.~\ref{sec:unix_socket_xxx}).
+ sez.~\ref{sec:unix_socket}).
\item[\const{SO\_BINDTODEVICE}] questa opzione permette di \textsl{legare} il
socket ad una particolare interfaccia, in modo che esso possa ricevere ed
da uno zero e di lunghezza massima pari a \const{IFNAMSIZ}; l'opzione è
effettiva solo per alcuni tipi di socket, ed in particolare per quelli della
famiglia \const{AF\_INET}; non è invece supportata per i \textit{packet
- socket} (vedi sez.~\ref{cha:advanced_socket_xxx}).
+ socket} (vedi sez.~\ref{sec:socket_raw}).
\item[\const{SO\_DEBUG}] questa opzione abilita il debugging delle operazioni
dei socket; l'opzione utilizza per \param{optval} un intero usato come
di routing del kernel. Prende per \param{optval} un intero usato come valore
logico.
-\item[\const{SO\_BROADCAST}] questa opzione abilita il \textit{broadcast};
- quanto abilitata i socket di tipo \const{SOCK\_DGRAM} riceveranno i
- pacchetti inviati all'indirizzo di broadcast, e potranno scrivere pacchetti
- su tale indirizzo. Prende per \param{optval} un intero usato come valore
- logico. L'opzione non ha effetti su un socket di tipo \const{SOCK\_STREAM}.
+\item[\const{SO\_BROADCAST}] questa opzione abilita il \itindex{broadcast}
+ \textit{broadcast}; quanto abilitata i socket di tipo \const{SOCK\_DGRAM}
+ riceveranno i pacchetti inviati all'indirizzo di \textit{broadcast}, e
+ potranno scrivere pacchetti su tale indirizzo. Prende per \param{optval} un
+ intero usato come valore logico. L'opzione non ha effetti su un socket di
+ tipo \const{SOCK\_STREAM}.
\item[\const{SO\_SNDBUF}] questa opzione imposta la dimenzione del buffer di
uscita del socket. Prende per \param{optval} un intero indicante il numero
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 \textit{completely duplicate binding}, quando cioè si vuole
-eseguire \func{bind} su un indirizzo ed una porta che sono già
-\textsl{legati} ad un 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
-pacchetti provenienti dal traffico in multicast possano essere
-ricevuti da più applicazioni\footnote{l'esempio classico di traffico
- in multicast è quello di uno streaming di dati (audio, video, ecc.),
- l'uso del multicast consente in tal caso di trasmettere un solo
- pacchetto, che potrà essere ricevuto da tutti i possibili
- destinatari (invece di inviarne un duplicato a ciascuno); in questo
- caso è perfettamente logico aspettarsi che sulla stessa macchina più
- utenti possano lanciare un programma che permetta loro di ricevere
- gli stessi dati.} o da diverse istanze della stessa applicazione.
+Infine il quarto caso è quello in cui si vuole effettivamente ottenere un
+\textit{completely duplicate binding}, quando cioè si vuole eseguire
+\func{bind} su un indirizzo ed una porta che sono già \textsl{legati} ad un
+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
+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,
+ video, ecc.), l'uso del \textit{multicast} consente in tal caso di
+ trasmettere un solo pacchetto, che potrà essere ricevuto da tutti i
+ possibili destinatari (invece di inviarne un duplicato a ciascuno); in
+ questo caso è perfettamente logico aspettarsi che sulla stessa macchina più
+ utenti possano lanciare un programma che permetta loro di ricevere gli
+ stessi dati.} o da diverse istanze della stessa applicazione.
\itindex{multicast}
In questo caso utilizzando \const{SO\_REUSEADDR} si consente ad una
-applicazione eseguire \func{bind} sulla stessa porta ed indirizzo
-usata da un'altra, così che anche essa possa ricevere gli stessi
-pacchetti (chiaramente la cosa non ha alcun senso per i socket TCP, ed
-infatti in questo tipo di applicazione è normale l'uso del protovollo
-UDP). La regola è che quando si hanno più applicazioni che hanno
-eseguito \func{bind} sulla stessa porta, di tutti pacchetti destinati
-ad un indirizzo di broadcast o di \itindex{multicast}
-\texttt{multicast} viene inviata una copia a ciascuna applicazione.
-Non è definito invece cosa accade qualora il pacchetto sia destinato
-ad un indirizzo normale (unicast).
+applicazione eseguire \func{bind} sulla stessa porta ed indirizzo usata da
+un'altra, così che anche essa possa ricevere gli stessi pacchetti (chiaramente
+la cosa non ha alcun senso per i socket TCP, ed infatti in questo tipo di
+applicazione è normale l'uso del protovollo UDP). La regola è che quando si
+hanno più applicazioni che hanno eseguito \func{bind} sulla stessa porta, di
+tutti pacchetti destinati ad un indirizzo di \itindex{broadcast}
+\textit{broadcast} o di \itindex{multicast} \textit{multicast} viene inviata
+una copia a ciascuna applicazione. Non è definito invece cosa accade qualora
+il pacchetto sia destinato ad un indirizzo normale (unicast).
Essendo questo un caso particolare in alcuni sistemi (come BSD) è stata
introdotta una opzione ulteriore, \const{SO\_REUSEPORT} che richiede che detta
\textbf{Descrizione}\\
\hline
\hline
- \const{IP\_OPTIONS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ \const{IP\_OPTIONS} &$\bullet$&$\bullet$&&\texttt{void *}& %???
Imposta o riceve le opzioni di IP.\\
\const{IP\_PKTINFO} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
Passa un messaggio di informazione.\\
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}&
+ \const{IP\_TOS} &$\bullet$&$\bullet$& &\texttt{int}&
Imposta il valore del campo TOS.\\
- \const{IP\_TTL} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ \const{IP\_TTL} &$\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}&
+ \const{IP\_MTU\_DISCOVER} &$\bullet$&$\bullet$& &\texttt{int}&
Imposta il Path MTU Discovery.\\
- \const{IP\_MTU} &$\bullet$& &$\bullet$&\texttt{int}&
+ \const{IP\_MTU} &$\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\_TTL} &$\bullet$&$\bullet$& &\texttt{int}&
+ Imposta il TTL per i pacchetti \itindex{multicast} \textit{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.\\
+ Controlla il reinvio a se stessi dei dati di \itindex{multicast}
+ \textit{multicast}.\\
+ \const{IP\_ADD\_MEMBERSHIP} & &$\bullet$& &\struct{ip\_mreqn}&
+ Si unisce a un gruppo di \itindex{multicast} \textit{multicast}.\\
+ \const{IP\_DROP\_MEMBERSHIP}& &$\bullet$& &\struct{ip\_mreqn}&
+ Si sgancia da un gruppo di \textit{multicast}.\\
+ \const{IP\_MULTICAST\_IF} & &$\bullet$& &\struct{ip\_mreqn}&
+ Imposta l'interfaccia locale di un socket \itindex{multicast}
+ \textit{multicast}.\\
\hline
\end{tabular}
\caption{Le opzioni disponibili al livello \const{SOL\_IP}.}
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}.
+ torneremo in parte sull'argomento in sez.~\ref{sec:sock_IP_options}.
\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
+ sez.~\ref{sec:net_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
ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di
\struct{pktinfo}).
+L'opzione prende per \param{optval} un intero usato come valore logico, che
+specifica soltanto se insieme al pacchetto deve anche essere inviato o
+ricevuto il messaggio \const{IP\_PKTINFO} (vedi
+sez.~\ref{sec:net_ancillary_data}); il messaggio stesso dovrà poi essere
+letto o scritto direttamente con \func{recvmsg} e \func{sendmsg} (vedi
+sez.~\ref{sec:net_sendmsg}).
+
\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.
+ insieme ai pacchetti un messaggio ancillare (vedi
+ sez.~\ref{sec:net_ancillary_data}) 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}.
+ insieme ai pacchetti un messaggio ancillare (vedi
+ sez.~\ref{sec:net_ancillary_data}) 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
+ insieme ai pacchetti un messaggio ancillare (vedi
+ sez.~\ref{sec:net_ancillary_data}) 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
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
+ 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
definiscono alcuni valori standardizzati per il \textit{Type of Service},
riportate in tab.~\ref{tab:IP_TOS_values}, il valore di default usato da
Linux è \const{IPTOS\_LOWDELAY}, ma esso può essere modificato con le
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
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}
-
+ sull'argomento in sez.~\ref{sec:socket_raw}
\item[\const{IP\_RECVERR}] Questa è una opzione introdotta con i kernel della
serie 2.2.x, ed è specifica di Linux. Essa permette di usufruire di un
meccanismo affidabile per ottenere un maggior numero di informazioni in caso
di errori. Se l'opzione è abilitata tutti gli errori generati su un socket
vengono memorizzati su una coda, dalla quale poi possono essere letti con
- \func{recvmsg} (torneremo su questo in sez.~\ref{sec:TCP_ancillary_data}).
- L'opzione richiede per \param{optval} un intero usato come valore logico;
- l'opzione non è applicabile a socket di tipo \const{SOCK\_STREAM}.
-
-\item[\const{IP\_MTU\_DISCOVER}] Questa è una opzione introdotta con i
- kernel della serie 2.2.x, ed è specifica di Linux. L'opzione
- permette di scrivere o leggere le impostazioni usate nella
- determinazione della \textit{Maximum Tranfer Unit} (vedi
- sez.~\ref{sec:net_lim_dim}) per il socket. Il valore di default è
- determinato dal parametro \texttt{ip\_no\_pmtu\_disc} di
- \func{sysctl} per i socket di tipo \const{SOCK\_STREAM}, mentre è
- diabilitato per tutti gli altri.
-
-\item[\const{IP\_MTU}] Permette di leggere il valore della \textit{Maximum
- Tranfer Unit} di percorso 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.
+ \func{recvmsg} (vedi sez.~\ref{sec:net_sendmsg}) come messaggi ancillari
+ (torneremo su questo in sez.~\ref{sec:net_ancillary_data}) di tipo
+ \const{IP\_RECVERR}. L'opzione richiede per \param{optval} un intero usato
+ come valore logico e non è applicabile a socket di tipo
+ \const{SOCK\_STREAM}.
+
+\itindbeg{Maximum~Transfer~Unit}
+\item[\const{IP\_MTU\_DISCOVER}] Questa è una opzione introdotta con i kernel
+ della serie 2.2.x, ed è specifica di Linux. L'opzione permette di scrivere
+ o leggere le impostazioni della modalità usata per la determinazione della
+ \textit{Path Maximum Transfer Unit} (vedi sez.~\ref{sec:net_lim_dim}) del
+ socket. L'opzione prende per \param{optval} un valore intero che indica la
+ modalità usata, da specificare con una delle costanti riportate in
+ tab.~\ref{tab:sock_ip_mtu_discover}.
+
+ \begin{table}[!htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|r|p{7cm}|}
+ \hline
+ \multicolumn{2}{|c|}{\textbf{Valore}}&\textbf{Significato} \\
+ \hline
+ \hline
+ \const{IP\_PMTUDISC\_DONT}&0& Non effettua la ricerca dalla \textit{Path
+ MTU}.\\
+ \const{IP\_PMTUDISC\_WANT}&1& Utilizza il valore impostato per la rotta
+ utilizzata dai pacchetti (dal comando
+ \texttt{route}).\\
+ \const{IP\_PMTUDISC\_DO} &2& Esegue la procedura di determinazione
+ della \textit{Path MTU} come richiesto
+ dall'\href{http://www.ietf.org/rfc/rfc1191.txt}{RFC~1191}.\\
+ \hline
+ \end{tabular}
+ \caption{Valori possibili per l'argomento \param{optval} di
+ \const{IP\_MTU\_DISCOVER}.}
+ \label{tab:sock_ip_mtu_discover}
+ \end{table}
+
+ Il valore di default applicato ai socket di tipo \const{SOCK\_STREAM} è
+ determinato dal parametro \texttt{ip\_no\_pmtu\_disc} (vedi
+ sez.~\ref{sec:sock_sysctl}), mentre per tutti gli altri socket di default la
+ ricerca è disabilitata ed è responsabilità del programma creare pacchetti di
+ dimensioni appropriate e ritrasmettere eventuali pacchetti persi. Se
+ l'opzione viene abilitata, il kernel si incaricherà di tenere traccia
+ automaticamente della \textit{Path MTU} verso ciascuna destinazione, e
+ rifiuterà immediatamente la trasmissione di pacchetti di dimensioni maggiori
+ della MTU con un errore di \errval{EMSGSIZE}.\footnote{in caso contrario la
+ trasmissione del pacchetto sarebbe effettuata, ottenendo o un fallimento
+ successivo della trasmissione, o la frammentazione dello stesso.}
+
+\item[\const{IP\_MTU}] Permette di leggere il valore della \textit{Path MTU}
+ di percorso del socket. L'opzione richiede per \param{optval} un intero che
+ conterrà il valore della \textit{Path MTU} in byte. Questa è una opzione
+ introdotta con i kernel della serie 2.2.x, ed è specifica di Linux.
+
+ È tramite questa opzione che un programma può leggere, quando si è avuto un
+ errore di \errval{EMSGSIZE}, il valore della MTU corrente del socket. Si
+ tenga presente che per poter usare questa opzione, oltre ad avere abilitato
+ la scoperta della \textit{Path MTU}, occorre che il socket sia stato
+ esplicitamente connesso con \func{connect}.
+
+ Ad esempio con i socket UDP si potrà ottenere una stima iniziale della
+ \textit{Path MTU} eseguendo prima una \func{connect} verso la destinazione,
+ e poi usando \func{getsockopt} con questa opzione. Si può anche avviare
+ esplicitamente il procedimento di scoperta inviando un pacchetto di grosse
+ dimensioni (che verrà scartato) e ripetendo l'invio coi dati aggiornati. Si
+ tenga infine conto che durante il procedimento i pacchetti iniziali possono
+ essere perduti, ed è compito dell'applicazione gestirne una eventuale
+ ritrasmissione.
+
+\itindend{Maximum~Transfer~Unit}
\item[\const{IP\_ROUTER\_ALERT}] Questa è una opzione introdotta con i
kernel della serie 2.2.x, ed è specifica di Linux. Prende per
\param{optval} un intero usato come valore logico. Se abilitata
passa tutti i pacchetti con l'opzione \textit{IP Router Alert} (vedi
- sez.\ref{sec:IP_options}) che devono essere inoltrati al socket
+ sez.~\ref{sec:IP_options}) che devono essere inoltrati al socket
corrente. Può essere usata soltanto per socket di tipo raw.
+\itindbeg{multicast}
\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 \itindex{multicast}
- \texttt{multicast} vengano ricevuti anche sulla stessa macchina da
- cui li si stanno inviando. Prende per \param{optval} un intero
- usato come valore logico.
+ valore del campo TTL per i pacchetti \textit{multicast} 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 \textit{multicast} vengano ricevuti
+ anche sulla stessa macchina da cui li si stanno inviando. Prende per
+ \param{optval} un intero usato come valore logico.
In generale se si vuole che eventuali client possano ricevere i dati che si
inviano occorre che questa funzionalità sia abilitata (come avviene di
disponibili in locale l'uso di questa opzione permette di disabilitare
questo tipo di traffico.
-\item[\const{IP\_ADD\_MEMBERSHIP}] L'opzione consente di unirsi ad
- gruppo di \itindex{multicast} \texttt{multicast}, e può essere usata
- solo con \func{setsockopt}. L'argomento \param{optval} in questo
- caso deve essere una struttura di tipo \struct{ip\_mreqn},
- illustrata in fig.~\ref{fig:ip_mreqn_struct}, che permette di
- indicare, con il campo \var{imr\_multiaddr} l'indirizzo del gruppo
- di multicast a cui ci si vuole unire, con il campo
- \var{imr\_address} l'indirizzo dell'interfaccia locale con cui
- unirsi al gruppo di multicast e con \var{imr\_ifindex} l'indice
- dell'interfaccia da utilizzare (un valore nullo indica una
- interfaccia qualunque).
+\item[\const{IP\_ADD\_MEMBERSHIP}] L'opzione consente di unirsi ad gruppo di
+ \textit{multicast}, e può essere usata solo con \func{setsockopt}.
+ L'argomento \param{optval} in questo caso deve essere una struttura di tipo
+ \struct{ip\_mreqn}, illustrata in fig.~\ref{fig:ip_mreqn_struct}, che
+ permette di indicare, con il campo \var{imr\_multiaddr} l'indirizzo del
+ gruppo di \textit{multicast} a cui ci si vuole unire, con il campo
+ \var{imr\_address} l'indirizzo dell'interfaccia locale con cui unirsi al
+ gruppo di \textit{multicast} e con \var{imr\_ifindex} l'indice
+ dell'interfaccia da utilizzare (un valore nullo indica una interfaccia
+ qualunque).
Per compatibilità è possibile utilizzare anche un argomento di tipo
\struct{ip\_mreq}, una precedente versione di \struct{ip\_mreqn}, che
\begin{minipage}[c]{15cm}
\includestruct{listati/ip_mreqn.h}
\end{minipage}
- \caption{La struttura \structd{ip\_mreqn} utilizzata dalle opzioni dei socket
- per le operazioni concernenti l'appartenenza ai gruppi di multicast.}
+ \caption{La struttura \structd{ip\_mreqn} utilizzata dalle opzioni dei
+ socket per le operazioni concernenti l'appartenenza ai gruppi di
+ \textit{multicast}.}
\label{fig:ip_mreqn_struct}
\end{figure}
+\item[\const{IP\_DROP\_MEMBERSHIP}] Lascia un gruppo di \textit{multicast},
+ prende per \param{optval} la stessa struttura \struct{ip\_mreqn} (o
+ \struct{ip\_mreq}) usata anche per \const{IP\_ADD\_MEMBERSHIP}.
-\item[\const{IP\_DROP\_MEMBERSHIP}] Lascia un gruppo di
- \itindex{multicast} \texttt{multicast}, prende per \param{optval} la
- stessa struttura \struct{ip\_mreqn} (o \struct{ip\_mreq}) usata
- anche per \const{IP\_ADD\_MEMBERSHIP}.
-
-\item[\const{IP\_MULTICAST\_IF}] Imposta l'interfaccia locale per
- i'utilizzo del multicast, ed utilizza come \param{optval} le stesse
- strutture \struct{ip\_mreqn} o \struct{ip\_mreq} delle due
- precedenti opzioni.
-
+\item[\const{IP\_MULTICAST\_IF}] Imposta l'interfaccia locale per i'utilizzo
+ del \textit{multicast}, ed utilizza come \param{optval} le stesse strutture
+ \struct{ip\_mreqn} o \struct{ip\_mreq} delle due precedenti opzioni.
+\itindend{multicast}
\end{basedescript}
-
-
\section{Altre funzioni di controllo}
\label{sec:sock_ctrl_func}
\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:TCP_ancillary_data}).
+ controllo (vedi sez.~\ref{sec:net_ancillary_data}).
\end{basedescript}
Nella directory \texttt{/proc/sys/net/ipv4} sono disponibili i parametri per i