From 22e01eeebd2d386a8a992cba0fdaf2d73f5ff217 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sun, 26 Mar 2006 13:56:09 +0000 Subject: [PATCH] Risistemazione della sezione sulle opzioni dei socket IP. Corretta la tabella, documentata la prte sul Path MTP discovery, aggiunti vari indici. --- ipc.tex | 2 +- netlayer.tex | 98 +++++++++------- network.tex | 37 +++--- othersock.tex | 9 +- prochand.tex | 8 +- sockadv.tex | 25 +++- sockctrl.tex | 315 ++++++++++++++++++++++++++++++-------------------- socket.tex | 34 +++--- tcpsock.tex | 8 +- 9 files changed, 324 insertions(+), 212 deletions(-) diff --git a/ipc.tex b/ipc.tex index 91df500..3baa2b8 100644 --- a/ipc.tex +++ b/ipc.tex @@ -774,7 +774,7 @@ socket\index{socket} locali in generale) permette di trasmettere attraverso le linea non solo dei dati, ma anche dei file descriptor: si può cioè passare da un processo ad un altro un file descriptor, con una sorta di duplicazione dello stesso non all'interno di uno stesso processo, ma fra processi distinti -(torneremo su questa funzionalità in sez.~\ref{sec:xxx_fd_passing}). +(torneremo su questa funzionalità in sez.~\ref{sec:sock_fd_passing}). \section{Il sistema di comunicazione fra processi di System V} diff --git a/netlayer.tex b/netlayer.tex index 2b264d1..597738b 100644 --- a/netlayer.tex +++ b/netlayer.tex @@ -150,8 +150,8 @@ di reti di dimensioni diverse. 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 @@ -319,7 +319,8 @@ grandi linee nei seguenti punti: 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 @@ -525,8 +526,9 @@ ulteriori caratteristiche che diversificano il comportamento di IPv4 da 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 @@ -615,7 +617,7 @@ pu 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ù @@ -628,8 +630,8 @@ pu \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ò @@ -637,19 +639,21 @@ essere identificato attraverso uno qualunque degli indirizzi unicast delle sue 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 @@ -657,9 +661,10 @@ bit e il tipo di indirizzo che loro corrispondente. I bit pi 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 @@ -949,12 +954,14 @@ l'accettazione di una connessione da qualunque host. \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 @@ -1009,14 +1016,15 @@ Il prefisso di formato per tutti gli indirizzi \textit{multicast} 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 @@ -1042,15 +1050,16 @@ per il funzionamento della rete. \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} @@ -1302,7 +1311,7 @@ il nome di associazione di sicurezza. 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} @@ -1439,12 +1448,13 @@ semplicemente il prefisso a quello assegnato dal provider per ottenere un 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 @@ -1465,11 +1475,11 @@ della singola stazione; il secondo problema 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. diff --git a/network.tex b/network.tex index ceb7f55..495e02f 100644 --- a/network.tex +++ b/network.tex @@ -463,9 +463,9 @@ seguenti: implementato direttamente sopra IP. \item[\textsl{ARP}] \textit{Address Resolution Protocol}. È il protocollo che mappa un indirizzo IP in un indirizzo hardware sulla rete locale. È usato in - reti di tipo broadcast come Ethernet, Token Ring o FDDI che hanno associato - un indirizzo fisico (il \textit{MAC address}) alla interfaccia, ma non serve - in connessioni punto-punto. + reti di tipo \itindex{broadcast} \textit{broadcast} come Ethernet, Token + Ring o FDDI che hanno associato un indirizzo fisico (il \textit{MAC + address}) alla interfaccia, ma non serve in connessioni punto-punto. \item[\textsl{RARP}] \textit{Reverse Address Resolution Protocol}. È il protocollo che esegue l'operazione inversa rispetto ad ARP (da cui il nome) mappando un indirizzo hardware in un indirizzo IP. Viene usato a volte per @@ -552,7 +552,8 @@ grandi linee nei seguenti punti: 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 aggiunge agli usuali \textit{unycast} e \textit{multicast}. + si aggiunge agli usuali \textit{unicast} e \itindex{multicast} + \textit{multicast}. \item la semplificazione del formato dell'intestazione (\textit{header}) dei pacchetti, eliminando o rendendo opzionali alcuni dei campi di IPv4, per eliminare la necessità di riprocessamento della stessa da parte dei router e @@ -617,7 +618,7 @@ grande pregio della velocit presta bene per le applicazioni in cui la connessione non è necessaria, e costituirebbe solo un peso in termini di prestazioni, mentre una perdita di pacchetti può essere tollerata, ad esempio le applicazioni di streaming e -quelle che usano il \texttt{multicast}.\itindex{multicast} +quelle che usano il \textit{multicast}. \itindex{multicast} \subsection{Transport Control Protocol (TCP)} \label{sec:net_tcp} @@ -689,10 +690,11 @@ effettuato per entrambe le direzioni di comunicazione. \label{sec:net_lim_dim} Un aspetto di cui bisogna tenere conto nella programmazione di rete, e che -ritornerà anche più avanti, è che ci sono una serie di limiti a cui la -trasmissione dei dati attraverso i vari livelli del protocollo deve -sottostare, limiti che è opportuno tenere presente perché in certi casi si -possono avere delle conseguenze sul comportamento delle applicazioni. +ritornerà in seguito, quando tratteremo gli aspetti più avanzti, è che ci sono +una serie di limiti a cui la trasmissione dei dati attraverso i vari livelli +del protocollo deve sottostare; limiti che è opportuno tenere presente perché +in certi casi si possono avere delle conseguenze sul comportamento delle +applicazioni. Un elenco di questi limiti, insieme ad un breve accenno alle loro origini ed alle eventuali implicazioni che possono avere, è il seguente: @@ -706,12 +708,14 @@ alle eventuali implicazioni che possono avere, dell'header è fissa e di 40 byte e non è compresa nel valore indicato dal suddetto campo. Inoltre IPv6 ha la possibilità di estendere la dimensione di un pacchetto usando la \textit{jumbo payload option}. -\item Molte reti fisiche hanno un MTU (\textit{maximum transfer unit}) che - dipende dal protocollo specifico usato al livello di connessione fisica. Il - più comune è quello di ethernet che è pari a 1500 byte, una serie di altri - valori possibili sono riportati in tab.~\ref{tab:net_mtu_values}. +\item Molte reti fisiche hanno una MTU \itindex{Maximum~Transfer~Unit} + (\textit{Maximum Transfer Unit}) che dipende dal protocollo specifico usato + al livello di connessione fisica. Il più comune è quello di ethernet che è + pari a 1500 byte, una serie di altri valori possibili sono riportati in + tab.~\ref{tab:net_mtu_values}. \end{itemize} +\itindbeg{Maximum~Transfer~Unit} Quando un pacchetto IP viene inviato su una interfaccia di rete e le sue dimensioni eccedono la MTU viene eseguita la cosiddetta \textit{frammentazione}, i pacchetti cioè vengono suddivisi\footnote{questo @@ -735,8 +739,8 @@ piccoli che possono essere trasmessi attraverso l'interfaccia. X.25 & 576 \\ \hline \end{tabular} - \caption{Valori della MTU (\textit{maximum transfer unit}) per una serie di - reti diverse.} + \caption{Valori della MTU (\textit{Maximum Transfer Unit}) per una serie di + diverse tecnologie di rete.} \label{tab:net_mtu_values} \end{table} @@ -777,6 +781,9 @@ Il TCP usa sempre questo meccanismo, che per le implementazioni di IPv4 opzionale, mentre diventa obbligatorio per IPv6. Per IPv6 infatti, non potendo i router frammentare i pacchetti, è necessario, per poter comunicare, conoscere da subito il \textit{path MTU}. +\itindend{Maximum~Transfer~Unit} + + Infine TCP definisce una MSS \textit{Maximum Segment Size} che annuncia all'altro capo della connessione la dimensione massima dimensione del segmento diff --git a/othersock.tex b/othersock.tex index 3aa2bb9..f905efb 100644 --- a/othersock.tex +++ b/othersock.tex @@ -212,7 +212,7 @@ come maschera binaria che permette di impostare una serie di modalit funzionamento della comunicazione attraverso il socket (come \const{MSG\_NOSIGNAL} che impedisce l'invio del segnale \const{SIGPIPE} quando si è già chiuso il capo locale della connessione). Torneremo con maggiori -dettagli sul significato di questo argomento in sez.~\ref{sec:xxx_sendmsg}, +dettagli sul significato di questo argomento in sez.~\ref{sec:net_sendmsg}, dove tratteremo le funzioni avanzate dei socket, per il momento ci si può limitare ad usare sempre un valore nullo. @@ -748,6 +748,13 @@ l'interfaccia di programmazione che serve ad utilizzarli resta sempre quella dei socket. + +\subsection{Il passaggio di file descriptor} +\label{sec:sock_fd_passing} + + + + \section{I socket \textit{raw}} \label{sec:socket_raw} diff --git a/prochand.tex b/prochand.tex index 099b1ff..6a4b923 100644 --- a/prochand.tex +++ b/prochand.tex @@ -1983,7 +1983,7 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.13, e trasmettere un valore arbitrario dell'\textsl{uid} nel passaggio delle credenziali coi socket unix domain (vedi - sez.~\ref{sec:unix_socket_xxx}).\\ + sez.~\ref{sec:unix_socket}).\\ % % Linux specific capabilities % @@ -2000,11 +2000,13 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.13, e su porte riservate (vedi sez.~\ref{sec:TCP_func_bind}).\\ \const{CAP\_NET\_BROADCAST}& la capacità di consentire l'uso di socket in - broadcast e multicast.\\ + \itindex{broadcast} \textit{broadcast} e + \itindex{multicast} \textit{multicast}.\\ \const{CAP\_NET\_ADMIN} & la capacità di eseguire alcune operazioni privilegiate sulla rete (impostare le opzioni privilegiate dei socket, abilitare il - multicasting, impostare interfacce di rete e + \itindex{multicast} \textit{multicasting}, + impostare interfacce di rete e tabella di instradamento).\\ \const{CAP\_NET\_RAW} & la capacità di usare socket \texttt{RAW} e \texttt{PACKET} (quelli che permettono di creare diff --git a/sockadv.tex b/sockadv.tex index b6ee0ca..c955454 100644 --- a/sockadv.tex +++ b/sockadv.tex @@ -26,8 +26,19 @@ controllare le funzionalit disponibili con i vari tipi di socket. + + +\subsection{La fuzioni \func{sendmsg} e \func{recvmsg}} +\label{sec:net_sendmsg} + + +Finora abbiamo trattato delle funzioni che permettono di inviare dati sul +socket in forma semplificata. Se infatti si devono semplicemente ... + + + \subsection{I messaggi ancillari} -\label{sec:TCP_ancillary_data} +\label{sec:net_ancillary_data} @@ -54,6 +65,18 @@ fig.~\ref{fig:sock_extended_err_struct}. +\subsection{La gestione delle opzioni IP} +\label{sec:sock_IP_options} + + +Abbiamo visto in sez.~\ref{sec:sock_ipv4_options} come di possa usare +\func{setsockopt} con l'opzione \const{IP\_OPTIONS} per impostare le opzioni +IP associate per i pacchetti associati ad un socket. + + + + + diff --git a/sockctrl.tex b/sockctrl.tex index 5c2e185..65c0535 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -2041,7 +2041,8 @@ tab.~\ref{tab:sock_opt_socklevel}. \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}& @@ -2167,7 +2168,7 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: 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 @@ -2180,7 +2181,7 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: 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 @@ -2227,11 +2228,12 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: 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 @@ -2520,37 +2522,35 @@ si pu 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 @@ -2684,7 +2684,7 @@ tutte le altre costanti ad esse collegate sono definite in \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.\\ @@ -2696,30 +2696,32 @@ tutte le altre costanti ad esse collegate sono definite in 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}.} @@ -2740,12 +2742,12 @@ elenco: 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 @@ -2773,23 +2775,33 @@ e \const{IP\_RECVIF} presenti in altri Unix (la relativa informazione 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 @@ -2801,12 +2813,16 @@ ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di 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 @@ -2815,67 +2831,117 @@ ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di 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 @@ -2883,17 +2949,16 @@ ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} 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 @@ -2904,29 +2969,25 @@ ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di \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} @@ -3043,7 +3104,7 @@ I principali sono: \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 diff --git a/socket.tex b/socket.tex index d7c461c..a0eb579 100644 --- a/socket.tex +++ b/socket.tex @@ -91,9 +91,9 @@ Un terzo esempio di stile di comunicazione concerne le modalit avviene, in certi casi essa può essere condotta con una connessione diretta con un solo corrispondente, come per una telefonata; altri casi possono prevedere una comunicazione come per lettera, in cui si scrive l'indirizzo su -ogni pacchetto, altri ancora una comunicazione \textit{broadcast} come per la -radio, in cui i pacchetti vengono emessi su appositi ``\textsl{canali}'' dove -chiunque si collega possa riceverli. +ogni pacchetto, altri ancora una comunicazione \itindex{broadcast} +\textit{broadcast} come per la radio, in cui i pacchetti vengono emessi su +appositi ``\textsl{canali}'' dove chiunque si collega possa riceverli. É chiaro che ciascuno di questi stili comporta una modalità diversa di gestire la comunicazione, ad esempio se è inaffidabile occorrerà essere in grado di @@ -506,11 +506,11 @@ il loro uso Il campo \var{sin6\_addr} contiene l'indirizzo a 128 bit usato da IPv6, espresso da un vettore di 16 byte. Infine il campo \var{sin6\_scope\_id} è un campo introdotto in Linux con il kernel 2.4, per gestire alcune operazioni -riguardanti il multicasting. Si noti infine che \struct{sockaddr\_in6} ha una -dimensione maggiore della struttura \struct{sockaddr} generica di -fig.~\ref{fig:sock_sa_gen_struct}, quindi occorre stare attenti a non avere -fatto assunzioni riguardo alla possibilità di contenere i dati nelle -dimensioni di quest'ultima. +riguardanti il \itindex{multicast} \textit{multicasting}. Si noti infine che +\struct{sockaddr\_in6} ha una dimensione maggiore della struttura +\struct{sockaddr} generica di fig.~\ref{fig:sock_sa_gen_struct}, quindi +occorre stare attenti a non avere fatto assunzioni riguardo alla possibilità +di contenere i dati nelle dimensioni di quest'ultima. \subsection{La struttura degli indirizzi locali} @@ -687,17 +687,17 @@ Il campo \var{sll\_hatype} indica il tipo ARP, come definito in pacchetto; entrambi vengono impostati alla ricezione di un pacchetto ed han senso solo in questo caso. In particolare \var{sll\_pkttype} può assumere i seguenti valori: \var{PACKET\_HOST} per un pacchetto indirizzato alla macchina -ricevente, \var{PACKET\_BROADCAST} per un pacchetto di broadcast, -\var{PACKET\_MULTICAST} per un pacchetto inviato ad un indirizzo fisico di -multicast, \var{PACKET\_OTHERHOST} per un pacchetto inviato ad un'altra -stazione (e ricevuto su un'interfaccia in modo promiscuo), -\var{PACKET\_OUTGOING} per un pacchetto originato dalla propria macchina che -torna indietro sul socket. +ricevente, \var{PACKET\_BROADCAST} per un pacchetto di \itindex{broadcast} +\textit{broadcast}, \var{PACKET\_MULTICAST} per un pacchetto inviato ad un +indirizzo fisico di \itindex{multicast} \textit{multicast}, +\var{PACKET\_OTHERHOST} per un pacchetto inviato ad un'altra stazione (e +ricevuto su un'interfaccia in modo promiscuo), \var{PACKET\_OUTGOING} per un +pacchetto originato dalla propria macchina che torna indietro sul socket. Si tenga presente infine che in fase di ricezione, anche se si richiede il -troncamento del pacchetto, le funzioni \func{recvmsg}, \func{recv} e -\func{recvfrom} restituiranno comunque la lunghezza effettiva del pacchetto -così come arrivato sulla linea. +troncamento del pacchetto, le funzioni \func{recv}, \func{recvfrom} e +\func{recvmsg} (vedi sez.~\ref{sec:net_sendmsg}) restituiranno comunque la +lunghezza effettiva del pacchetto così come arrivato sulla linea. %% \subsection{La struttura degli indirizzi DECnet} diff --git a/tcpsock.tex b/tcpsock.tex index 66d677f..4898087 100644 --- a/tcpsock.tex +++ b/tcpsock.tex @@ -731,7 +731,8 @@ buona norma usare sempre la funzione \func{htonl}. \hline \hline \const{INADDR\_ANY} & Indirizzo generico (\texttt{0.0.0.0})\\ - \const{INADDR\_BROADCAST}& Indirizzo di \textit{broadcast}.\\ + \const{INADDR\_BROADCAST}& Indirizzo di \itindex{broadcast} + \textit{broadcast}.\\ \const{INADDR\_LOOPBACK} & Indirizzo di \textit{loopback} (\texttt{127.0.0.1}).\\ \const{INADDR\_NONE} & Indirizzo errato.\\ @@ -793,8 +794,9 @@ connessione con un server TCP,\footnote{di nuovo la funzione \item[\errcode{EAFNOSUPPORT}] l'indirizzo non ha una famiglia di indirizzi corretta nel relativo campo. \item[\errcode{EACCES}, \errcode{EPERM}] si è tentato di eseguire una - connessione ad un indirizzo broadcast senza che il socket fosse stato - abilitato per il broadcast. + connessione ad un indirizzo \itindex{broadcast} \textit{broadcast} senza + che il socket fosse stato abilitato per il \itindex{broadcast} + \textit{broadcast}. \end{errlist} altri errori possibili sono: \errval{EFAULT}, \errval{EBADF}, \errval{ENOTSOCK}, \errval{EISCONN} e \errval{EADDRINUSE}.} -- 2.30.2