X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=socket.tex;h=058c4e41240250fe8470e8a6083cb5276098e94b;hp=c026305177997400578027d4ed268c795c1de2f5;hb=ed54132fb0762894a86b100023f9d04fc4028975;hpb=b6c298c4db0c039a91f2497f170e7172fb34ad10 diff --git a/socket.tex b/socket.tex index c026305..058c4e4 100644 --- a/socket.tex +++ b/socket.tex @@ -249,7 +249,7 @@ tab.~\ref{tab:net_pf_names}.\footnote{l'elenco indica tutti i protocolli Si tenga presente che non tutte le famiglie di protocolli sono utilizzabili dall'utente generico, ad esempio in generale tutti i socket di tipo \const{SOCK\_RAW} possono essere creati solo da processi che hanno i privilegi -di amministratore (cioè con user-ID effettivo uguale a zero) o dotati della +di amministratore (cioè con \acr{uid} effettivo uguale a zero) o dotati della \itindex{capabilities} \textit{capability} \const{CAP\_NET\_RAW}. @@ -378,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 @@ -454,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 @@ -474,7 +474,7 @@ Il membro \var{sin\_family} deve essere sempre impostato a \const{AF\_INET}, altrimenti si avrà un errore di \errcode{EINVAL}; il membro \var{sin\_port} specifica il \textsl{numero di porta}. I numeri di porta sotto il 1024 sono chiamati \textsl{riservati} in quanto utilizzati da servizi standard e -soltanto processi con i privilegi di amministratore (con user-ID effettivo +soltanto processi con i privilegi di amministratore (con \acr{uid} effettivo uguale a zero) o con la \itindex{capabilities} \textit{capability} \const{CAP\_NET\_BIND\_SERVICE} possono usare la funzione \func{bind} (che vedremo in sez.~\ref{sec:TCP_func_bind}) su queste porte. @@ -488,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_endianness}), 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} @@ -505,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 @@ -546,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 @@ -589,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 @@ -603,7 +604,7 @@ inferiori a 129 sono usati per le \textsl{porte riservate}, e possono essere usati solo da processi con i privilegi di amministratore o con la \itindex{capabilities} \textit{capability} \const{CAP\_NET\_BIND\_SERVICE}. L'indirizzo remoto è specificato nella struttura \var{sat\_addr}, e deve -essere in \textit{network order} (vedi sez.~\ref{sec:sock_endianess}); esso è +essere in \textit{network order} (vedi sez.~\ref{sec:sock_endianness}); esso è composto da un parte di rete data dal campo \var{s\_net}, che può assumere il valore \const{AT\_ANYNET}, che indica una rete generica e vale anche per indicare la rete su cui si è, il singolo nodo è indicato da \var{s\_node}, e @@ -654,7 +655,7 @@ simboliche definite nel file \file{linux/if\_ether.h}. Se si usa il valore speciale \const{ETH\_P\_ALL} passeranno sul \textit{packet socket} tutti i pacchetti, qualunque sia il loro protocollo di collegamento. Ovviamente l'uso di questi socket è una operazione privilegiata e può essere effettuati solo da -un processo con i privilegi di amministratore (user-ID effettivo nullo) o con +un processo con i privilegi di amministratore (\acr{uid} effettivo nullo) o con la \itindex{capabilities} \textit{capability} \const{CAP\_NET\_RAW}. Una volta aperto un \textit{packet socket}, tutti i pacchetti del protocollo @@ -664,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 @@ -742,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_endianness} il problema connesso +\itindex{endianness} all'\textit{endianness} è 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} @@ -1040,9 +944,9 @@ sez.~\ref{sec:IP_ipv6_notation} per IPv6. % LocalWords: pathname AppleTalk netatalk personal Apple ATPROTO atalk sat if % LocalWords: ANYNET node ANYNODE ATADDR BCAST pcap IEEE linux ether ETH ALL % LocalWords: sll ifindex ethernet halen MAC hatype ARP arp pkttype HOST recv -% LocalWords: OTHERHOST OUTGOING recvfrom recvmsg endianess little endtest Mac +% LocalWords: OTHERHOST OUTGOING recvfrom recvmsg endianness little endtest Mac % LocalWords: Intel Digital Motorola IBM VME PowerPC l'Intel xABCD ptr htonl -% LocalWords: all'endianess htons ntohl ntohs long hostlong hostshort netlong +% LocalWords: htons ntohl ntohs long hostlong hostshort netlong % LocalWords: sort netshort host inet aton ntoa dotted decimal const char src % LocalWords: strptr struct dest addrptr INADDR NULL pton ntop presentation af % LocalWords: numeric EAFNOSUPPORT size ENOSPC ENOAFSUPPORT ADDRSTRLEN ROUTE