Finalmente ho scritto qualcosa sui socket, ho aggiornato pure la parte
[gapil.git] / socket.tex
1 \chapter{Socket}
2 \label{cha:socket}
3
4 I \textit{socket} sono usati come meccanismo di comunicazione fra programmi
5 utilizzato in ambito unix (e non solo). La creazione di un socket restituisce
6 un file descriptor analogo a quello di una pipe ma a differenza di questa e
7 degli altri meccanismi esaminati nel capitolo \ref{cha:ipc} i socket non sono
8 limitati alla comunicazione fra processi che girano sulla stessa macchina ma
9 possono effettuare la comunicazione anche attraverso la rete.
10
11 I socket infatti sono la principale API (\textit{Application Program
12   Interface}) usata nella programmazione di rete. La loro origine risale al
13 1983, quando furono introdotti nel BSD 4.2; l'interfaccia è rimasta
14 sostanzialmente la stessa con piccole modifiche negli anni successivi. Benché
15 siano state sviluppate interfacce alternative, originate dai sistemi SYSV,
16 come la XTI (\textit{X/Open Transport Interface}) nessuna ha mai raggiunto la
17 diffusione e la popolarità di quella dei socket (e tantomeno usabilità e
18 flessibilità).
19
20
21 \section{Concetti base}
22 \label{sec:sock_gen}
23
24 Per capire il funzionamento dei socket occorre avere presente il funzionamento
25 dei protocolli di rete (vedi \ref{cha:network}), ma l'interfaccia è del tutto
26 generale e benché le problematiche (e quindi le modalità di risolvere i
27 problemi) siano diverse a seconda del tipo di protocollo di comunicazione
28 usato, le funzioni da usare restano le stesse.
29
30 Per questo motivo una semplice descrizione dell'interfaccia è assolutamente
31 inutile, in quanto il comportamento di quest'ultima e le problematiche da
32 affrontare cambiano radicalmente a seconda dello ``stile'' di comunicazione
33 usato.  La scelta di questo stile va infatti ad incidere sulla semantica che
34 verrà utilizzata a livello utente per gestire la comunicazione (su come
35 inviare e ricevere i dati) e sul comportamento effettivo delle funzioni
36 utilizzate.
37
38 La scelta di uno stile dipende sia dai meccanismi disponibili, sia dal tipo di
39 comunicazione che si vuole effettuare. Ad esempio alcuni stili di
40 comunicazione considerano i dati come una sequenza continua di bytes, altri
41 invece li raggruppano in blocchi (i pacchetti).
42
43 Un'altro esempio di stile concerne la possibilità che la comunicazione possa o
44 meno perdere dati, possa o meno non rispettare l'ordine in cui essi non sono
45 inviati, o inviare dei pacchetti più volte (come nel caso di TCP e UDP).
46
47 Un terzo esempio di stile di comunicazione concerne le modalità in cui essa
48 avviene, in certi casi essa può essere condotta con una connessione diretta
49 con un solo partner come per una telefonata; altri casi possono prevedere una
50 comunicazione come per lettera, in cui si scrive l'indirizzo su ogni
51 pacchetto, altri ancora una comunicazione \textit{broadcast} come per la
52 radio, in cui i pacchetti vengono emessi su appositi ``canali'' dove chiunque
53 si collega possa riceverli.
54
55 É chiaro che ciascuno di questi stili comporta una modalità diversa di gestire
56 la comunicazione, ad esempio se è inaffidabile occorrerà essere in grado di
57 gestire la perdita o il rimescolamento dei dati.
58
59 Dati i tanti e diversi protocolli di comunicazione disponibili, esistono vari
60 tipi di socket, che vengono classificati raggruppandoli in quelli che si
61 chiamano \textsl{domini} (\textit{domains}).  La scelta di un dominio equivale
62 in sostanza alla scelta di una famiglia di protocolli. Ciascun dominio ha un
63 suo nome simbolico che convenzionalmente inizia con \texttt{PF\_} (da
64 \textit{protocol family}, altro nome con cui si indicano i domini). 
65
66 A ciascun tipo di dominio corrisponde un analogo nome simbolico che inizia per
67 \texttt{AF\_} (da \textit{Address Family}, nome che useremo anche noi; le man
68 pages di linux si riferiscono a questi anche come \textit{name space}, nome
69 che però il manuale della glibc riserva ai domini) e che identifica il formato
70 degli indirizzi usati in quel dominio.
71
72 I domini (e i relativi nomi simbolici) sono definiti dall'header
73 \textit{socket.h}. In linux sono disponibili le famiglie di protocolli
74 riportate in \ntab.
75
76 \begin{table}[htb]
77   \centering
78   \begin{tabular}[c]{lll}
79        Nome               & Utilizzo                       & Man page   \\
80        PF\_UNIX,PF\_LOCAL & Local communication            & unix(7)    \\
81        PF\_INET           & IPv4 Internet protocols        & ip(7)      \\
82        PF\_INET6          & IPv6 Internet protocols        &            \\
83        PF\_IPX            & IPX - Novell protocols         &            \\
84        PF\_NETLINK        & Kernel user interface device   & netlink(7) \\
85        PF\_X25            & ITU-T X.25 / ISO-8208 protocol & x25(7)     \\
86        PF\_AX25           & Amateur radio AX.25 protocol   &            \\
87        PF\_ATMPVC         & Access to raw ATM PVCs         &            \\
88        PF\_APPLETALK      & Appletalk                      & ddp(7)     \\
89        PF\_PACKET         & Low level packet interface     & packet(7)  \\    
90   \end{tabular}
91   \caption{Famiglie di protocolli definiti in linux}
92   \label{tab:net_pf_names}
93 \end{table}
94
95
96 La scelta di un dominio non comporta però la scelta dello stile di
97 comunicazione, questo infatti viene a dipendere dal protocollo che si andrà ad
98 utilizzare fra quelli disponibili nella famiglia scelta. Le API permettono di
99 scegliere lo stile di comunicazione indicando il tipo di socket; linux e le
100 glibc mettono a disposizione i seguenti tipi di socket (che il manuale della
101 glibc chiama \textit{styles}) definiti come \texttt{int} in \texttt{socket.h}:
102
103 \begin{list}{}{}
104 \item \texttt{SOCK\_STREAM} Provvede un canale di trasmissione dati
105   bidirezionale, sequenziale e affidabile. Opera su una connessione con un
106   altro socket. I dati vengono ricevuti e trasmessi come un flusso continuo di
107   byte (da cui il nome \textit{stream}). Vedi \ref{sec:sock_stream}.
108 \item \texttt{SOCK\_DGRAM} Viene usato per mandare pacchetti di lunghezza
109   massima fissata (\textit{datagram}) indirizzati singolarmente, senza
110   connessione e in maniera non affidabile. È l'opposto del precedente. Vedi
111   \ref{sec:sock_dgram}.
112 \item \texttt{SOCK\_SEQPACKET} Provvede un canale di trasmissione di dati
113   bidirezionale, sequenziale e affidabile. Opera su una connessione con un
114   altro socket. I dati possono solo essere trasmessi e letti per pacchetti (di
115   dimensione massima fissata).
116 \item \texttt{SOCK\_RAW} Provvede l'accesso a basso livello ai protocolli di
117   rete e alle varie interfacce. I normali programmi di comunicazione non
118   devono usarlo.
119 \item \texttt{SOCK\_RDM} Provvede un canale di trasmissione di pacchetti
120   affidabile ma in cui non è garantito l'ordine di arrivo dei pacchetti.
121 \item \texttt{SOCK\_PACKET} Obsoleto, non deve essere usato.
122 \end{list}
123
124
125
126
127