%% socket.tex
%%
-%% Copyright (C) 2000-2017 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2000-2019 Simone Piccardi. Permission is granted to
%% copy, distribute and/or modify this document under the terms of the GNU Free
%% Documentation License, Version 1.1 or any later version published by the
%% Free Software Foundation; with the Invariant Sections being "Un preambolo",
\index{socket!definizione|(}
-\subsection{Cosa sono \textit{socket}}
+\subsection{Cosa sono i \textit{socket}}
\label{sec:sock_socket_def}
I \textit{socket} (una traduzione letterale potrebbe essere \textsl{presa}, ma
associato ad una costante, che inizia invece per \texttt{AF\_} (da
\textit{address family}) che identifica il formato degli indirizzi usati in
quel dominio. Le pagine di manuale di Linux si riferiscono a questi indirizzi
-anche come \textit{name space}, (nome che invece il manuale delle \acr{glibc}
+anche come \textit{name space}, (nome che invece il manuale della \acr{glibc}
riserva a quello che noi abbiamo chiamato domini) dato che identificano il
formato degli indirizzi usati in quel dominio per identificare i capi della
comunicazione.
-\begin{table}[htb]
+\begin{table}[!htb]
\footnotesize
\centering
\begin{tabular}[c]{|l|l|l|l|}
\constd{AF\_ASH} &18& Ash & \\
\constd{AF\_ECONET} &19& Acorn Econet & \\
\constd{AF\_ATMSVC} &20& ATM SVCs & \\
+ \constd{AF\_RDS} &21& RDS Sockets & \\
\constd{AF\_SNA} &22& Linux SNA Project & \\
- \constd{AF\_IRDA} &23& IRDA socket (infrarossi) & \\
+ \constd{AF\_IRDA} &23& IRDA socket (infrarossi) & irda(7) \\
\constd{AF\_PPPOX} &24& PPPoX socket & \\
\constd{AF\_WANPIPE} &25& Wanpipe API socket & \\
\constd{AF\_LLC} &26& Linux LLC & \\
+ \constd{AF\_IB} &27& Native InfiniBand address & \\
+ \constd{AF\_MPLS} &28& MPSL & \\
\constd{AF\_CAN} &29& Controller Are Network & \\
+ \constd{AF\_TIPC} &30& TIPC sockets & \\
\constd{AF\_BLUETOOTH}&31& Bluetooth socket & \\
+ \constd{AF\_IUCV} &32& IUCV sockets & \\
+ \constd{AF\_RXRPC} &33& RxRPC sockets & \\
+ \constd{AF\_ISDN} &34& mISDN sockets & \\
+ \constd{AF\_PHONET} &35& Phonet sockets & \\
+ \constd{AF\_IEEE802154}&36& IEEE802154 sockets & \\
+ \constd{AF\_CAIF} &37& CAIF sockets & \\
+ \constd{AF\_ALG} &38& Algorithm sockets & \\
+ \constd{AF\_NFC} &39& NFC sockets & \\
+ \constd{AF\_VSOCK} &40& vSockets & \\
+ \constd{AF\_KCM} &41& Kernel Connection Multiplexor & \\
+ \constd{AF\_QIPCRTR} &42& Qualcomm IPC Router & \\
+ \constd{AF\_SMC} &43& smc sockets & \\
\hline
\end{tabular}
\caption{Famiglie di protocolli definiti in Linux.}
\label{tab:net_pf_names}
\end{table}
-% TODO aggiungere PF_CAN, vedi http://lwn.net/Articles/253425, dal 2.6.25
-
L'idea alla base della distinzione fra questi due insiemi di costanti era che
una famiglia di protocolli potesse supportare vari tipi di indirizzi, per cui
il prefisso \texttt{PF\_} si sarebbe dovuto usare nella creazione dei socket e
I domini (e i relativi nomi simbolici), così come i nomi delle famiglie di
indirizzi, sono definiti dall'\textit{header file} \headfiled{socket.h}. Un
-elenco delle famiglie di protocolli disponibili in Linux è riportato in
-tab.~\ref{tab:net_pf_names}. L'elenco indica tutti i protocolli definiti; fra
-questi però saranno utilizzabili solo quelli per i quali si è compilato il
-supporto nel kernel (o si sono caricati gli opportuni moduli), viene definita
-anche una costante \constd{PF\_MAX} che indica il valore massimo associabile
-ad un dominio.
+elenco, aggiornato alla versione 4.15, delle famiglie di protocolli
+disponibili in Linux è riportato in tab.~\ref{tab:net_pf_names}. L'elenco
+indica tutti i protocolli definiti; fra questi però saranno utilizzabili solo
+quelli per i quali si è compilato il supporto nel kernel (o si sono caricati
+gli opportuni moduli), viene definita anche una costante \constd{AF\_MAX} che
+indica il valore massimo associabile ad un dominio.
Si tenga presente che non tutte le famiglie di protocolli sono utilizzabili
dall'utente generico, ad esempio in generale tutti i socket di tipo
tre tipi, Linux supporta anche gli altri, come si può verificare nel file
\texttt{include/linux/net.h} dei sorgenti del kernel.}
-\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
+\begin{basedescript}{\desclabelwidth{2.0cm}\desclabelstyle{\nextlinelabel}}
\item[\constd{SOCK\_STREAM}] Provvede un canale di trasmissione dati
bidirezionale, sequenziale e affidabile. Opera su una connessione con un
altro socket. I dati vengono ricevuti e trasmessi come un flusso continuo di
non strettamente attinenti all'indicazione del tipo secondo i valori appena
illustrati. Essi infatti possono essere combinati con un OR aritmetico delle
ulteriori costanti:
-\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
+\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
\item[\constd{SOCK\_CLOEXEC}] imposta il flag di \textit{close-on-exec} sul
file descriptor del socket, ottenendo lo stesso effetto del flag
\const{O\_CLOEXEC} di \func{open} (vedi tab.~\ref{tab:open_operation_flag}),
tab.~\ref{tab:open_operation_flag}).
\end{basedescript}
-
Si tenga presente inoltre che non tutte le combinazioni fra una famiglia di
protocolli e un tipo di socket sono valide, in quanto non è detto che in una
famiglia esista un protocollo per ciascuno dei diversi stili di comunicazione
&\const{SOCK\_STREAM} &\const{SOCK\_DGRAM} &\const{SOCK\_RAW}&
\const{SOCK\_RDM}&\const{SOCK\_SEQPACKET} \\
\hline
- \const{PF\_UNIX} & si & si & -- & -- & si\footnotemark \\
+ \const{AF\_UNIX} & si & si & -- & -- & si\footnotemark \\
+ \hline
+ \const{AF\_LOCAL}&\multicolumn{5}{|c|}{sinonimo di \const{AF\_UNIX}}\\
\hline
- \const{PF\_LOCAL}&\multicolumn{5}{|c|}{sinonimo di \const{PF\_UNIX}}\\
+ \const{AF\_INET} & TCP & UDP & IPv4 & -- & -- \\
\hline
- \const{PF\_INET} & TCP & UDP & IPv4 & -- & -- \\
+ \const{AF\_INET6} & TCP & UDP & IPv6 & -- & -- \\
\hline
- \const{PF\_INET6} & TCP & UDP & IPv6 & -- & -- \\
+ \const{AF\_IPX} & -- & si & -- & -- & -- \\
\hline
- \const{PF\_IPX} & -- & -- & -- & -- & -- \\
+ \const{AF\_NETLINK} & -- & si & si & -- & -- \\
\hline
- \const{PF\_NETLINK} & -- & si & si & -- & -- \\
+ \const{AF\_X25} & -- & -- & -- & -- & si \\
\hline
- \const{PF\_X25} & -- & -- & -- & -- & si \\
+ \const{AF\_AX25} & -- & si & si & -- & si \\
\hline
- \const{PF\_AX25} & -- & -- & -- & -- & -- \\
+% \const{AF\_ATMPVC} & -- & -- & -- & -- & -- \\
+% \hline
+ \const{AF\_APPLETALK} & -- & si & si & -- & -- \\
\hline
- \const{PF\_ATMPVC} & -- & -- & -- & -- & -- \\
+ \const{AF\_PACKET} & -- & si & si & -- & -- \\
\hline
- \const{PF\_APPLETALK} & -- & si & si & -- & -- \\
+ \const{AF\_KEY} & -- & -- & si & -- & -- \\
\hline
- \const{PF\_PACKET} & -- & si & si & -- & -- \\
+ \const{AF\_IRDA} & si & si & si & -- & si \\
+ \hline
+ \const{AF\_NETROM} & -- & -- & -- & -- & si \\
+ \hline
+ \const{AF\_ROSE} & -- & -- & -- & -- & si \\
+ \hline
+ \const{AF\_RDS} & -- & -- & -- & -- & si \\
+ \hline
+ \const{AF\_ECONET} & -- & si & -- & -- & -- \\
\hline
\end{tabular}
\caption{Combinazioni valide di dominio e tipo di protocollo per la
non è richiesto dallo standard POSIX.1g, in Linux pertanto non esiste. Il
campo \type{sa\_family\_t} era storicamente un \ctyp{unsigned short}.
-\begin{figure}[!htb]
- \footnotesize \centering
- \begin{minipage}[c]{0.80\textwidth}
- \includestruct{listati/sockaddr.h}
- \end{minipage}
- \caption{La struttura generica degli indirizzi dei socket
- \structd{sockaddr}.}
- \label{fig:sock_sa_gen_struct}
-\end{figure}
-
Dal punto di vista del programmatore l'unico uso di questa struttura è quello
di fare da riferimento per il casting, per il kernel le cose sono un po'
diverse, in quanto esso usa il puntatore per recuperare il campo
\begin{figure}[!htb]
\footnotesize \centering
- \begin{minipage}[c]{0.90\textwidth}
+ \begin{minipage}[c]{0.95\textwidth}
\includestruct{listati/sockaddr_storage.h}
\end{minipage}
\caption{La struttura generica degli indirizzi dei socket
\subsection{La struttura degli indirizzi IPv4}
\label{sec:sock_sa_ipv4}
-I socket di tipo \const{PF\_INET} vengono usati per la comunicazione
+I socket di tipo \const{AF\_INET} vengono usati per la comunicazione
attraverso Internet; la struttura per gli indirizzi per un socket Internet (se
si usa IPv4) è definita come \struct{sockaddr\_in} nell'header file
\headfiled{netinet/in.h} ed ha la forma mostrata in
\subsection{La struttura degli indirizzi IPv6}
\label{sec:sock_sa_ipv6}
-Essendo IPv6 un'estensione di IPv4, i socket di tipo \const{PF\_INET6} sono
+Essendo IPv6 un'estensione di IPv4, i socket di tipo \const{AF\_INET6} sono
sostanzialmente identici ai precedenti; la parte in cui si trovano
praticamente tutte le differenze fra i due socket è quella della struttura
degli indirizzi; la sua definizione, presa da \headfile{netinet/in.h}, è
\subsection{La struttura degli indirizzi locali}
\label{sec:sock_sa_local}
-I socket di tipo \const{PF\_UNIX} o \const{PF\_LOCAL} vengono usati per una
+I socket di tipo \const{AF\_UNIX} o \const{AF\_LOCAL} vengono usati per una
comunicazione fra processi che stanno sulla stessa macchina (per questo
vengono chiamati \textit{local domain} o anche \textit{Unix domain}); essi
hanno la caratteristica ulteriore di poter essere creati anche in maniera
\subsection{La struttura degli indirizzi AppleTalk}
\label{sec:sock_sa_appletalk}
-I socket di tipo \const{PF\_APPLETALK} sono usati dalla libreria
+I socket di tipo \const{AF\_APPLETALK} sono usati dalla libreria
\file{netatalk} per implementare la comunicazione secondo il protocollo
AppleTalk, uno dei primi protocolli di rete usato nel mondo dei personal
computer, usato dalla Apple per connettere fra loro computer e stampanti. Il
\subsection{La struttura degli indirizzi dei \textit{packet socket}}
\label{sec:sock_sa_packet}
-I \textit{packet socket}, identificati dal dominio \const{PF\_PACKET}, sono
+I \textit{packet socket}, identificati dal dominio \const{AF\_PACKET}, sono
un'interfaccia specifica di Linux per inviare e ricevere pacchetti
direttamente su un'interfaccia di rete, senza passare per le funzioni di
gestione dei protocolli di livello superiore. In questo modo è possibile
-implementare dei protocolli in user space, agendo direttamente sul livello
-fisico. In genere comunque si preferisce usare la libreria
+implementare dei protocolli in \textit{user space}, agendo direttamente sul
+livello fisico. In genere comunque si preferisce usare la libreria
\file{pcap},\footnote{la libreria è mantenuta insieme al comando
\cmd{tcpdump}, informazioni e documentazione si possono trovare sul sito del
progetto \url{http://www.tcpdump.org/}.} che assicura la portabilità su
%% \subsection{La struttura degli indirizzi DECnet}
%% \label{sec:sock_sa_decnet}
-%% I socket di tipo \const{PF\_DECnet} usano il protocollo DECnet, usato dai VAX
+%% I socket di tipo \const{AF\_DECnet} usano il protocollo DECnet, usato dai VAX
%% Digital sotto VMS quando ancora il TCP/IP non era diventato lo standard di
%% fatto. Il protocollo è un protocollo chiuso, ed il suo uso attuale è limitato
%% alla comunicazione con macchine che stanno comunque scomparendo. Lo si riporta
%% solo come esempio
+% TODO aggiungere AF_CAN, vedi http://lwn.net/Articles/253425, dal 2.6.25 ?
+
% TODO: trattare i socket RDS, vedi documentazione del kernel, file
% Documentation/networking/rds.txt