Varie correzioni, completata revisione capitolo sull'I/O su file
[gapil.git] / socket.tex
index 2d31d6c73b17d2dc57d880df48a8e7a83fed49b1..b01ff3aa67a6f224db9e52899f7397e46daa406e 100644 (file)
@@ -1,6 +1,6 @@
 %% 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",
@@ -33,7 +33,7 @@ creati.
 
 \index{socket!definizione|(}
 
-\subsection{Cosa sono \textit{socket}}
+\subsection{Cosa sono \textit{socket}}
 \label{sec:sock_socket_def}
 
 I \textit{socket} (una traduzione letterale potrebbe essere \textsl{presa}, ma
@@ -186,12 +186,12 @@ A ciascun tipo di dominio corrisponde un analogo nome simbolico, anch'esso
 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|}
@@ -199,44 +199,58 @@ comunicazione.
        \textbf{Nome}&\textbf{Valore}&\textbf{Utilizzo}&\textbf{Man page} \\
        \hline
        \hline
-       \constd{PF\_UNSPEC}   & 0& Non specificato               &            \\
-       \constd{PF\_LOCAL}    & 1& Local communication           & unix(7)    \\
-       \constd{PF\_UNIX}, \constd{PF\_FILE}&1&Sinonimi di \const{PF\_LOCAL}& \\
-       \constd{PF\_INET}     & 2& IPv4 Internet protocols       & ip(7)      \\
-       \constd{PF\_AX25}     & 3& Amateur radio AX.25 protocol  &            \\
-       \constd{PF\_IPX}      & 4& IPX - Novell protocols        &            \\
-       \constd{PF\_APPLETALK}& 5& Appletalk                     & ddp(7)     \\
-       \constd{PF\_NETROM}   & 6& Amateur radio NetROM          &            \\
-       \constd{PF\_BRIDGE}   & 7& Multiprotocol bridge          &            \\
-       \constd{PF\_ATMPVC}   & 8& Access to raw ATM PVCs        &            \\
-       \constd{PF\_X25}      & 9& ITU-T X.25 / ISO-8208 protocol& x25(7)     \\
-       \constd{PF\_INET6}    &10& IPv6 Internet protocols       & ipv6(7)    \\
-       \constd{PF\_ROSE}     &11& Amateur Radio X.25 PLP        &            \\
-       \constd{PF\_DECnet}   &12& Reserved for DECnet project   &            \\
-       \constd{PF\_NETBEUI}  &13& Reserved for 802.2LLC project &            \\
-       \constd{PF\_SECURITY} &14& Security callback pseudo AF   &            \\
-       \constd{PF\_KEY}      &15& PF\_KEY key management API    &            \\
-       \constd{PF\_NETLINK}  &16& Kernel user interface device  & netlink(7) \\
-       \constd{PF\_ROUTE}    &16& Sinonimo di \const{PF\_NETLINK} emula BSD.&\\
-       \constd{PF\_PACKET}   &17& Low level packet interface    & packet(7)  \\
-       \constd{PF\_ASH}      &18& Ash                           &    \\
-       \constd{PF\_ECONET}   &19& Acorn Econet                  &    \\
-       \constd{PF\_ATMSVC}   &20& ATM SVCs                      &    \\
-       \constd{PF\_SNA}      &22& Linux SNA Project             &    \\
-       \constd{PF\_IRDA}     &23& IRDA socket (infrarossi)      &    \\
-       \constd{PF\_PPPOX}    &24& PPPoX socket                  &    \\
-       \constd{PF\_WANPIPE}  &25& Wanpipe API socket            &    \\
-       \constd{PF\_LLC}      &26& Linux LLC                     &    \\
-       \constd{PF\_CAN}      &29& Controller Are Network        &    \\
-       \constd{PF\_BLUETOOTH}&31& Bluetooth socket              &    \\
+       \constd{AF\_UNSPEC}   & 0& Non specificato               &            \\
+       \constd{AF\_LOCAL}    & 1& Local communication           & unix(7)    \\
+       \constd{AF\_UNIX}, \constd{AF\_FILE}&1&Sinonimi di \const{AF\_LOCAL}& \\
+       \constd{AF\_INET}     & 2& IPv4 Internet protocols       & ip(7)      \\
+       \constd{AF\_AX25}     & 3& Amateur radio AX.25 protocol  &            \\
+       \constd{AF\_IPX}      & 4& IPX - Novell protocols        &            \\
+       \constd{AF\_APPLETALK}& 5& Appletalk                     & ddp(7)     \\
+       \constd{AF\_NETROM}   & 6& Amateur radio NetROM          &            \\
+       \constd{AF\_BRIDGE}   & 7& Multiprotocol bridge          &            \\
+       \constd{AF\_ATMPVC}   & 8& Access to raw ATM PVCs        &            \\
+       \constd{AF\_X25}      & 9& ITU-T X.25 / ISO-8208 protocol& x25(7)     \\
+       \constd{AF\_INET6}    &10& IPv6 Internet protocols       & ipv6(7)    \\
+       \constd{AF\_ROSE}     &11& Amateur Radio X.25 PLP        &            \\
+       \constd{AF\_DECnet}   &12& Reserved for DECnet project   &            \\
+       \constd{AF\_NETBEUI}  &13& Reserved for 802.2LLC project &            \\
+       \constd{AF\_SECURITY} &14& Security callback pseudo AF   &            \\
+       \constd{AF\_KEY}      &15& AF\_KEY key management API    &            \\
+       \constd{AF\_NETLINK}  &16& Kernel user interface device  & netlink(7) \\
+       \constd{AF\_ROUTE}    &16& Sinonimo di \const{AF\_NETLINK} emula BSD.&\\
+       \constd{AF\_PACKET}   &17& Low level packet interface    & packet(7)  \\
+       \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)      & 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
@@ -252,12 +266,12 @@ seguendo la convenzione usata nelle pagine di manuale.
 
 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
@@ -280,7 +294,7 @@ seguenti costanti:\footnote{le pagine di manuale POSIX riportano solo i primi
   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
@@ -311,7 +325,7 @@ impostare dei flag relativi alle caratteristiche generali del \textit{socket}
 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}),
@@ -324,7 +338,6 @@ ulteriori costanti:
   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
@@ -342,27 +355,39 @@ appena elencati.
     &\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 
@@ -469,16 +494,6 @@ aggiuntivo \code{uint8\_t sin\_len} (come riportato da R. Stevens in
 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
@@ -497,7 +512,7 @@ sufficiente.
 
 \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
@@ -520,7 +535,7 @@ maniera generica tipi di indirizzi diversi (ad esempio IPv4 ed IPv6).
 \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
@@ -573,7 +588,7 @@ soluzioni).
 \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}, è
@@ -623,7 +638,7 @@ dimensioni di quest'ultima (per questo se necessario è opportuno usare
 \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
@@ -667,7 +682,7 @@ la struttura restituita è di dimensione \code{sizeof(sa\_family\_t)}, quindi
 \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
@@ -716,12 +731,12 @@ rete.
 \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
@@ -827,13 +842,15 @@ lunghezza effettiva del pacchetto così come arrivato sulla linea.
 %% \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