X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=socket.tex;h=32f1c0f5a6adea4e730445b41ac35aafd0e773f3;hp=9fac73dffedf011d8c07c6d0721b2bcd4aace550;hb=66765a9be9a61085dd00abd92d99a24b23dc844b;hpb=8f0266fc964bcdf2aa8d7791a24f05a0eda77556 diff --git a/socket.tex b/socket.tex index 9fac73d..32f1c0f 100644 --- a/socket.tex +++ b/socket.tex @@ -117,7 +117,7 @@ altro nome con cui si indicano i domini. A ciascun tipo di dominio corrisponde un analogo nome simbolico che inizia per \texttt{AF\_} da \textit{address family}, e che identifica il formato degli -indirizzi usati in quel dominio; le man pages di linux si riferiscono a questi +indirizzi usati in quel dominio; le man pages di Linux si riferiscono a questi anche come \textit{name space}, (nome che però il manuale della glibc riserva ai domini) e che identifica il formato degli indirizzi usati in quel dominio. @@ -130,7 +130,7 @@ supportino diverse strutture di indirizzi, per cui nella pratica questi due nomi sono equivalenti e corrispondono agli stessi valori. I domini (e i relativi nomi simbolici), così come i nomi delle famiglie di -indirizzi sono definiti dall'header \textit{socket.h}. In linux le famiglie di +indirizzi sono definiti dall'header \textit{socket.h}. In Linux le famiglie di protocolli disponibili sono riportate in \ntab. \begin{table}[htb] @@ -150,13 +150,13 @@ protocolli disponibili sono riportate in \ntab. PF\_APPLETALK & Appletalk & ddp(7) \\ PF\_PACKET & Low level packet interface & packet(7) \\ \end{tabular} - \caption{Famiglie di protocolli definiti in linux} + \caption{Famiglie di protocolli definiti in Linux} \label{tab:net_pf_names} \end{table} Non tutte le famiglie di protocolli sono accessibili dall'utente generico, ad esempio in generale tutti i socket di tipo \texttt{SOCK\_RAW} possono essere -creati solo da processi che hanno i provilegi di root (cioè effective uid +creati solo da processi che hanno i privilegi di root (cioè effective uid uguale a zero) o la capability \texttt{CAP\_NET\_RAW}. @@ -166,7 +166,7 @@ uguale a zero) o la capability \texttt{CAP\_NET\_RAW}. La scelta di un dominio non comporta però la scelta dello stile di comunicazione, questo infatti viene a dipendere dal protocollo che si andrà ad utilizzare fra quelli disponibili nella famiglia scelta. Le API permettono di -scegliere lo stile di comunicazione indicando il tipo di socket; linux e le +scegliere lo stile di comunicazione indicando il tipo di socket; Linux e le glibc mettono a disposizione i seguenti tipi di socket (che il manuale della glibc chiama \textit{styles}) definiti come \texttt{int} in \texttt{socket.h}: @@ -284,7 +284,7 @@ invocano dette funzioni passando l'indirizzo di un protocollo specifico occorrerà eseguire un casting del relativo puntatore. I tipi di dati che compongono la struttura sono stabiliti dallo standard -Posix.1g, riassunti in \ntab\ con i rispettivi file di include in cui sono +POSIX.1g, riassunti in \ntab\ con i rispettivi file di include in cui sono definiti; la struttura è invece definita nell'include file \texttt{sys/socket.h} @@ -314,14 +314,14 @@ definiti; la struttura \hline \end{tabular} \caption{Tipi di dati usati nelle strutture degli indirizzi, secondo quanto - stabilito dallo standard Posix.1g} + stabilito dallo standard POSIX.1g} \label{tab:sock_data_types} \end{table} In alcuni sistemi la struttura è leggermente diversa e prevede un primo membro aggiuntivo \texttt{uint8\_t sin\_len} (come riportato da R. Stevens nei suoi libri). Questo campo non verrebbe usato direttamente dal programmatore e non è -richiesto dallo standard Posix.1g, in linux pertanto non sussiste. Il campo +richiesto dallo standard POSIX.1g, in Linux pertanto non sussiste. Il campo \texttt{sa\_family\_t} era storicamente un \texttt{unsigned short}. Dal punto di vista del programmatore l'unico uso di questa struttura è quello @@ -340,7 +340,7 @@ I socket di tipo \texttt{PF\_INET} vengono usati per la comunicazione attraverso internet; la struttura per gli indirizzi per un socket internet (IPv4) è definita come \texttt{sockaddr\_in} nell'header file \texttt{netinet/in.h} e secondo le man page ha la forma mostrata in \nfig, -conforme allo standard Posix.1g. +conforme allo standard POSIX.1g. \begin{figure}[!htbp] @@ -377,7 +377,7 @@ usare la funzione \texttt{bind} su queste porte. Il membro \texttt{sin\_addr} contiene l'indirizzo internet dell'altro capo della comunicazione, e viene acceduto sia come struttura (un resto di una -implementazione precedente in cui questa era una union usata per accedere alle +implementazione precedente in cui questa era una \texttt{union} usata per accedere alle diverse classi di indirizzi) che come intero. Infine è da sottolineare che sia gli indirizzi che i numeri di porta devono @@ -417,7 +417,7 @@ struct in6_addr { Il campo \texttt{sin6\_family} deve essere sempre settato ad \texttt{AF\_INET6}, il campo \texttt{sin6\_port} è analogo a quello di IPv4 e -segue le stesse regole; il campo \texttt{sin6\_flowinfo} è a dua volta diviso +segue le stesse regole; il campo \texttt{sin6\_flowinfo} è a sua volta diviso in tre parti di cui i 24 bit inferiori indicano l'etichetta di flusso, i successivi 4 bit la priorità e gli ultimi 4 sono riservati; questi valori fanno riferimento ad alcuni campi specifici dell'header dei pacchetti IPv6 @@ -498,7 +498,7 @@ utile anche in seguito. \subsection{La \textit{endianess}} \label{sec:sock_endianess} -La rappresentazione di un numbero binario in un computer può essere fatta in +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 (in diretta corrispondenza a come sono poi in realtà cablati @@ -515,14 +515,16 @@ numero. Il caso opposto, in cui si parte dal bit meno significativo per lo stesso motivo \textit{big endian}. La \textit{endianess} di un computer dipende essenzialmente dalla architettura -hardware usata; intel e digital usano il little endian, motorola, ibm, sun +hardware usata; Intel e Digital usano il little endian, Motorola, IBM, Sun (sostanzialmente tutti gli altri) usano il big endian. Il formato della rete è -anch'esso big endian. Esistono poi anche dei processori che possono scegliere -il tipo di formato all'avvio e alcuni, come il PowerPC o l'intel i860, possono -pure passare da un tipo all'altro con una specifica istruzione; in ogni caso -in linux l'ordinamanento è definito dall'archiettura e anche se questi -cambiamenti sono possibili anche dopo che il sistema è avviato, non vengono -mai eseguiti. +anch'esso big endian, quello del bus PCI è little endian, quello del bus VME è +big endian. + +Esistono poi anche dei processori che possono scegliere il tipo di formato +all'avvio e alcuni, 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 anche se questi cambiamenti +sono possibili anche dopo che il sistema è avviato, non vengono mai eseguiti. \subsection{Le funzioni per il riordinamento} \label{sec:sock_func_ord} @@ -531,7 +533,7 @@ Il problema connesso all'endianess 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 bytes in cui è suddiviso scambiati di posto, e ne sarà quindi invertito l'ordine di lettura -per cui, per riavere il valore originale dovrenno essere rovesciati. +per cui, per riavere il valore originale dovranno essere rovesciati. Per questo motivo si usano le seguenti funzioni di conversione che servono a tener conto automaticamente della possibile differenza fra l'ordinamento usato @@ -543,7 +545,7 @@ funzioni sono: quello della rete. \end{prototype} \begin{prototype}{netinet/in.h} -{unsigned sort int htons(unsigned short int hostshort)} +{unsigned short int htons(unsigned short int hostshort)} Converte l'intero a 16 bit \texttt{hostshort} dal formato della macchina a quello della rete. \end{prototype} @@ -575,7 +577,7 @@ codice su tutte le architetture. Un secondo insieme di funzioni di manipolazione serve per passare dal formato binario usato nelle strutture degli indirizzi alla rappresentazione dei numeri -IP che si usa normalente. +IP che si usa normalmente. Le prime tre funzioni di manipolazione riguardano la conversione degli indirizzi IPv4 da una stringa in cui il numero di IP è espresso secondo la