Inizio della revisione del formato per la suddivisione in due parti,
[gapil.git] / socket.tex
index efca2ca21b1d4b5d58f2924b9998e9b65a06d6ab..0066ed314a02af2fa4e1e7ad393fbfcedb7df84d 100644 (file)
@@ -149,6 +149,10 @@ come vedremo in sez.~\ref{sec:sock_type}, lo stile di comunicazione) e
 implicitamente dal tipo di socket, per cui di norma questo valore viene messo
 a zero (con l'eccezione dei \textit{raw socket}).
 
+% TODO: l'ultimo argomento viene usato anche dai nuovi ping socket introdotti
+% con il kernel 3.0, vedi anche http://lwn.net/Articles/420799/ e
+% http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=c319b4d76b9e583a5d88d6bf190e079c4e43213d 
+
 Si noti che la creazione del socket si limita ad allocare le opportune
 strutture nel kernel (sostanzialmente una voce nella \itindex{file~table}
 \textit{file table}) e non comporta nulla riguardo all'indicazione degli
@@ -374,7 +378,7 @@ una struttura generica per gli indirizzi dei socket, \struct{sockaddr}, che si
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{15cm}
+  \begin{minipage}[c]{\textwidth}
     \includestruct{listati/sockaddr.h}
   \end{minipage} 
   \caption{La struttura generica degli indirizzi dei socket
@@ -450,7 +454,7 @@ fig.~\ref{fig:sock_sa_ipv4_struct}, conforme allo standard POSIX.1g.
 
 \begin{figure}[!htb]
   \footnotesize\centering
-  \begin{minipage}[c]{15cm}
+  \begin{minipage}[c]{\textwidth}
     \includestruct{listati/sockaddr_in.h}
   \end{minipage} 
   \caption{La struttura \structd{sockaddr\_in} degli indirizzi dei socket
@@ -484,10 +488,11 @@ tab.~\ref{tab:TCP_ipv4_addr}, che rincontreremo più avanti.
 
 Infine occorre sottolineare che sia gli indirizzi che i numeri di porta devono
 essere specificati in quello che viene chiamato \textit{network order}, cioè
-con i bit ordinati in formato \textit{big endian}, questo comporta la
-necessità di usare apposite funzioni di conversione per mantenere la
-portabilità del codice (vedi sez.~\ref{sec:sock_addr_func} per i dettagli del
-problema e le relative soluzioni).
+con i bit ordinati in formato \textit{big endian} (vedi
+sez.~\ref{sec:sock_endianess}), questo comporta la necessità di usare apposite
+funzioni di conversione per mantenere la portabilità del codice (vedi
+sez.~\ref{sec:sock_addr_func} per i dettagli del problema e le relative
+soluzioni).
 
 
 \subsection{La struttura degli indirizzi IPv6}
@@ -501,7 +506,7 @@ in fig.~\ref{fig:sock_sa_ipv6_struct}.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{15cm}
+  \begin{minipage}[c]{\textwidth}
     \includestruct{listati/sockaddr_in6.h}
   \end{minipage} 
   \caption{La struttura \structd{sockaddr\_in6} degli indirizzi dei socket
@@ -542,7 +547,7 @@ fig.~\ref{fig:sock_sa_local_struct}.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{15cm}
+  \begin{minipage}[c]{\textwidth}
     \includestruct{listati/sockaddr_un.h}
   \end{minipage} 
   \caption{La struttura \structd{sockaddr\_un} degli indirizzi dei socket
@@ -585,7 +590,7 @@ il file \file{netatalk/at.h}.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{15cm}
+  \begin{minipage}[c]{\textwidth}
     \includestruct{listati/sockaddr_atalk.h}
   \end{minipage} 
   \caption{La struttura \structd{sockaddr\_atalk} degli indirizzi dei socket
@@ -660,7 +665,7 @@ occorre usare la funzione \func{bind} per agganciare il socket a quest'ultima.
 
 \begin{figure}[!htb]
   \footnotesize \centering
-  \begin{minipage}[c]{15cm}
+  \begin{minipage}[c]{\textwidth}
     \includestruct{listati/sockaddr_ll.h}
   \end{minipage} 
   \caption{La struttura \structd{sockaddr\_ll} degli indirizzi dei
@@ -738,120 +743,23 @@ lunghezza effettiva del pacchetto così come arrivato sulla linea.
 
 In questa sezione tratteremo delle varie funzioni usate per manipolare gli
 indirizzi, limitandoci però agli indirizzi internet.  Come accennato gli
-indirizzi e i numeri di porta usati nella rete devono essere forniti in
-formato opportuno (il \textit{network order}). Per capire cosa significa tutto
-ciò occorre introdurre un concetto generale che tornerà utile anche in
-seguito.
-
-
-\subsection{La \textit{endianess}}
-\label{sec:sock_endianess}
-
-\itindbeg{endianess}
-La rappresentazione di un numero binario in un computer può essere fatta in
-due modi, chiamati rispettivamente \textit{big endian} e \textit{little
-  endian} a seconda di come i singoli bit vengono aggregati per formare le
-variabili intere (ed in genere in diretta corrispondenza a come sono poi in
-realtà cablati sui bus interni del computer).
-
-\begin{figure}[htb]
-  \centering
-  \includegraphics[height=3cm]{img/endianess}
-  \caption{Schema della disposizione dei dati in memoria a seconda della
-    \textit{endianess}.}
-  \label{fig:sock_endianess}
-\end{figure}
-
-Per capire meglio il problema si consideri un intero a 32 bit scritto in una
-locazione di memoria posta ad un certo indirizzo. Come illustrato in
-fig.~\ref{fig:sock_endianess} i singoli bit possono essere disposti in memoria
-in due modi: a partire dal più significativo o a partire dal meno
-significativo.  Così nel primo caso si troverà il byte che contiene i bit più
-significativi all'indirizzo menzionato e il byte con i bit meno significativi
-nell'indirizzo successivo; questo ordinamento è detto \textit{big endian},
-dato che si trova per prima la parte più grande. Il caso opposto, in cui si
-parte dal bit meno significativo è detto per lo stesso motivo \textit{little
-  endian}.
-
-Si può allora verificare quale tipo di \textit{endianess} usa il proprio
-computer con un programma elementare che si limita ad assegnare un valore ad
-una variabile per poi ristamparne il contenuto leggendolo un byte alla volta.
-Il codice di detto programma, \file{endtest.c}, è nei sorgenti allegati,
-allora se lo eseguiamo su un PC otterremo:
-\begin{verbatim}
-[piccardi@gont sources]$ ./endtest
-Using value ABCDEF01
-val[0]= 1
-val[1]=EF
-val[2]=CD
-val[3]=AB
-\end{verbatim}%$
-mentre su di un Mac avremo:
-\begin{verbatim}
-piccardi@anarres:~/gapil/sources$ ./endtest
-Using value ABCDEF01
-val[0]=AB
-val[1]=CD
-val[2]=EF
-val[3]= 1
-\end{verbatim}%$
-
-
-La \textit{endianess} di un computer dipende essenzialmente dalla architettura
-hardware usata; Intel e Digital usano il \textit{little endian}, Motorola,
-IBM, Sun (sostanzialmente tutti gli altri) usano il \textit{big endian}. Il
-formato dei dati contenuti nelle intestazioni dei protocolli di rete è
-anch'esso \textit{big endian}; altri esempi di uso di questi due diversi
-formati sono quello del bus PCI, che è \textit{little endian}, o quello del
-bus VME che è \textit{big endian}.
-
-Esistono poi anche dei processori che possono scegliere il tipo di formato
-all'avvio e alcuni che, come il PowerPC o l'Intel i860, possono pure passare
-da un tipo di ordinamento all'altro con una specifica istruzione. In ogni caso
-in Linux l'ordinamento è definito dall'architettura e dopo l'avvio del sistema
-resta sempre lo stesso, anche quando il processore permetterebbe di eseguire
-questi cambiamenti.
-
-\begin{figure}[htb]
-  \footnotesize \centering
-  \begin{minipage}[c]{15cm}
-    \includecodesample{listati/endian.c}
-  \end{minipage} 
-  \normalsize
-  \caption{La funzione \func{endian}, usata per controllare il tipo di
-    architettura della macchina.}
-  \label{fig:sock_endian_code}
-\end{figure}
-
-Per controllare quale tipo di ordinamento si ha sul proprio computer si è
-scritta una piccola funzione di controllo, il cui codice è riportato
-fig.~\ref{fig:sock_endian_code}, che restituisce un valore nullo (falso) se
-l'architettura è \textit{big endian} ed uno non nullo (vero) se l'architettura
-è \textit{little endian}.
-
-Come si vede la funzione è molto semplice, e si limita, una volta assegnato
-(\texttt{\small 9}) un valore di test pari a \texttt{0xABCD} ad una variabile
-di tipo \ctyp{short} (cioè a 16 bit), a ricostruirne una copia byte a byte.
-Per questo prima (\texttt{\small 10}) si definisce il puntatore \var{ptr} per
-accedere al contenuto della prima variabile, ed infine calcola (\texttt{\small
-  11}) il valore della seconda assumendo che il primo byte sia quello meno
-significativo (cioè, per quanto visto in fig.~\ref{fig:sock_endianess}, che sia
-\textit{little endian}). Infine la funzione restituisce (\texttt{\small 12})
-il valore del confronto delle due variabili. 
-\itindend{endianess}
-
+indirizzi e i numeri di porta usati nella rete devono essere forniti nel
+cosiddetto \textit{network order}, che corrisponde al formato \textit{big
+  endian}, anche quando la proprio macchina non usa questo formati, cosa che
+può comportare la necessità di eseguire delle conversioni.
 
 
 \subsection{Le funzioni per il riordinamento}
 \label{sec:sock_func_ord}
 
-Il problema connesso \itindex{endianess} all'endianess è che quando si passano
-dei dati da un tipo di architettura all'altra i dati vengono interpretati in
-maniera diversa, e ad esempio nel caso dell'intero a 16 bit ci si ritroverà
-con i due byte in cui è suddiviso scambiati di posto.  Per questo motivo si
-usano delle funzioni di conversione che servono a tener conto automaticamente
-della possibile differenza fra l'ordinamento usato sul computer e quello che
-viene usato nelle trasmissione sulla rete; queste funzioni sono \funcd{htonl},
+Come già visto in sez.~\ref{sec:sock_endianess} il problema connesso
+\itindex{endianess} all'\textit{endianess} è che quando si passano dei dati da
+un tipo di architettura all'altra i dati vengono interpretati in maniera
+diversa, e ad esempio nel caso dell'intero a 16 bit ci si ritroverà con i due
+byte in cui è suddiviso scambiati di posto.  Per questo motivo si usano delle
+funzioni di conversione che servono a tener conto automaticamente della
+possibile differenza fra l'ordinamento usato sul computer e quello che viene
+usato nelle trasmissione sulla rete; queste funzioni sono \funcd{htonl},
 \funcd{htons}, \funcd{ntohl} e \funcd{ntohs} ed i rispettivi prototipi sono:
 \begin{functions}
   \headdecl{netinet/in.h}