Materiale sulle opzioni dei socket e qualche riferimento alla futura
authorSimone Piccardi <piccardi@gnulinux.it>
Wed, 6 Sep 2006 15:56:19 +0000 (15:56 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Wed, 6 Sep 2006 15:56:19 +0000 (15:56 +0000)
sezione sul protocollo TCP delle appendici.

network.tex
sockadv.tex
sockctrl.tex
tcpsock.tex
trasplayer.tex

index 15459e0073ceb56bbf195a5ddffc4db4b07cedb1..c96d96b402fa9b0d26fc1c870f5ffa5186b66fb8 100644 (file)
@@ -782,13 +782,12 @@ potendo i router frammentare i pacchetti, 
 conoscere da subito il \textit{path MTU}.
 \itindend{Maximum~Transfer~Unit}
 
-
-
-Infine TCP definisce una MSS \textit{Maximum Segment Size} che annuncia
-all'altro capo della connessione la dimensione massima dimensione del segmento
-di dati che può essere ricevuto, così da evitare la frammentazione. Di norma
-viene impostato alla dimensione della MTU dell'interfaccia meno la lunghezza
-delle intestazioni di IP e TCP, in Linux il default, mantenuto nella costante
+Infine TCP definisce una \itindex{Maximum~Segment~Size} \textit{Maximum
+  Segment Size} (da qui in avanti abbreviata in MSS) che annuncia all'altro
+capo della connessione la dimensione massima dimensione del segmento di dati
+che può essere ricevuto, così da evitare la frammentazione. Di norma viene
+impostato alla dimensione della MTU dell'interfaccia meno la lunghezza delle
+intestazioni di IP e TCP, in Linux il default, mantenuto nella costante
 \const{TCP\_MSS} è 512.
 
 
index f50177191246d037f9904369071bdc6cfa9f4ca1..0f0aa32a0d7fc073dc5a234d00e9d0c66b4f25b7 100644 (file)
@@ -68,7 +68,7 @@ Una caratteristica particolare dei socket TCP 
 all'altro capo della comunicazione una sorta di messaggio privilegiato, che si
 richide che sia trattato il prima possibile. Si fa riferimento a questa
 funzionalità come all'invio dei cosiddetti \textsl{dati urgenti} (o
-\textit{udernt data}); tavolta essi chiamati anche dati \textit{out-of-band}
+\textit{urgent data}); tavolta essi chiamati anche dati \textit{out-of-band}
 poiché, come vedremo più anvati, possono essere letti anche al di fuori del
 flusso di dati normale.
 
index 8bc4d038ee9e228a5076463d2193a225a1c1b3cc..ae340ef9484a64a5239109c8c813af2cdc09ee12 100644 (file)
@@ -2688,42 +2688,42 @@ sono definite in \file{netinet/ip.h}, ed accessibili includendo detto file.
     \hline
     \hline
     \const{IP\_OPTIONS}         &$\bullet$&$\bullet$&&\texttt{void *}& %??? 
-      Imposta o riceve le opzioni di IP.\\
+      imposta o riceve le opzioni di IP.\\
     \const{IP\_PKTINFO}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Passa un messaggio di informazione.\\
+      passa un messaggio di informazione.\\
     \const{IP\_RECVTOS}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Passa un messaggio col campo TOS.\\
+      passa un messaggio col campo TOS.\\
     \const{IP\_RECVTTL}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Passa un messaggio col campo TTL.\\
+      passa un messaggio col campo TTL.\\
     \const{IP\_RECVOPTS}        &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Passa un messaggio con le opzioni IP.\\
+      passa un messaggio con le opzioni IP.\\
     \const{IP\_RETOPTS}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Passa un messaggio con le opzioni IP non trattate.\\
+      passa un messaggio con le opzioni IP non trattate.\\
     \const{IP\_TOS}             &$\bullet$&$\bullet$&         &\texttt{int}& 
-      Imposta il valore del campo TOS.\\
+      imposta il valore del campo TOS.\\
     \const{IP\_TTL}             &$\bullet$&$\bullet$&         &\texttt{int}& 
-      Imposta il valore del campo TTL.\\
+      imposta il valore del campo TTL.\\
     \const{IP\_HDRINCL}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Passa l'intestazione di IP nei dati.\\
+      passa l'intestazione di IP nei dati.\\
     \const{IP\_RECVERR}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Abilita la gestione degli errori.\\
+      abilita la gestione degli errori.\\
     \const{IP\_MTU\_DISCOVER}   &$\bullet$&$\bullet$&         &\texttt{int}& 
-      Imposta il Path MTU Discovery.\\
+      imposta il Path MTU Discovery.\\
     \const{IP\_MTU}             &$\bullet$&         &         &\texttt{int}& 
-      Legge il valore attuale della MTU.\\
+      legge il valore attuale della MTU.\\
     \const{IP\_ROUTER\_ALERT}   &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Imposta l'opzione \textit{IP router alert} sui pacchetti.\\
+      imposta l'opzione \textit{IP router alert} sui pacchetti.\\
     \const{IP\_MULTICAST\_TTL}  &$\bullet$&$\bullet$&         &\texttt{int}& 
-      Imposta il TTL per i pacchetti \itindex{multicast} \textit{multicast}.\\
+      imposta il TTL per i pacchetti \itindex{multicast} \textit{multicast}.\\
     \const{IP\_MULTICAST\_LOOP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Controlla il reinvio a se stessi dei dati di \itindex{multicast} 
+      controlla il reinvio a se stessi dei dati di \itindex{multicast} 
       \textit{multicast}.\\ 
     \const{IP\_ADD\_MEMBERSHIP} &         &$\bullet$&   &\struct{ip\_mreqn}& 
-      Si unisce a un gruppo di \itindex{multicast} \textit{multicast}.\\
+      si unisce a un gruppo di \itindex{multicast} \textit{multicast}.\\
     \const{IP\_DROP\_MEMBERSHIP}&         &$\bullet$&   &\struct{ip\_mreqn}& 
-      Si sgancia da un gruppo di \textit{multicast}.\\
+      si sgancia da un gruppo di \textit{multicast}.\\
     \const{IP\_MULTICAST\_IF}   &         &$\bullet$&   &\struct{ip\_mreqn}& 
-      Imposta l'interfaccia locale di un socket \itindex{multicast} 
+      imposta l'interfaccia locale di un socket \itindex{multicast} 
       \textit{multicast}.\\ 
    \hline
   \end{tabular}
@@ -3000,60 +3000,64 @@ UDP e TCP.\footnote{come per le precedenti, una descrizione di queste opzioni
   è disponibile nella settima sezione delle pagine di manuale, che si può
   consultare rispettivamente con \texttt{man 7 tcp} e \texttt{man 7 udp}; le
   pagine di manuale però, alla stesura di questa sezione (Agosto 2006) sono
-  alquanto incomplete.}  Dato che questi protocolli sono entrambi trasportati
-su IP, oltre alle opzioni generiche di sez.~\ref{sec:sock_generic_options}
-saranno comunque disponibili anche le precedenti opzioni di
-sez.~\ref{sec:sock_ipv4_options}.\footnote{in realtà in
-  sez.~\ref{sec:sock_ipv4_options} si sono riportate le opzioni per IPv4, ma
-  quelle per TCP e UDP sono le stesse anche quando si usa IPv6.}
+  alquanto incomplete.}  Dato che questi due protocolli sono entrambi
+trasportati su IP,\footnote{qui si sottintende IPv4, ma le opzioni per TCP e
+  UDP sono le stesse anche quando si usa IPv6.} oltre alle opzioni generiche
+di sez.~\ref{sec:sock_generic_options} saranno comunque disponibili anche le
+precedenti opzioni di sez.~\ref{sec:sock_ipv4_options}.\footnote{in realtà in
+  sez.~\ref{sec:sock_ipv4_options} si sono riportate le opzioni per IPv4, al
+  solito qualora si stesse utilizzando IPv6 si potrebbero utilizzare le
+  opzioni di quest'ultimo.}
 
 
 Il protocollo che supporta il maggior numero di opzioni è TCP; per poterle
 utilizzare occorre specificare \const{SOL\_TCP} (o l'equivalente
-\const{IPPROTO\_TCP}) come valore per l'argomento \param{level}. Si è
-riportato un elenco di queste opzioni in tab.~\ref{tab:sock_opt_tcp}.  Le
-costanti indicanti le opzioni del protocollo TCP e tutte le altre costanti ad
-esse collegate sono definite in \file{netinet/tcp.h}, ed accessibili
-includendo detto file.\footnote{in realtà questo è il file usato dalle
-  librerie; la definizione delle opzioni effettivamente supportate da Linux si
-  trova nel file \texttt{linux/tcp.h}, dal quale si sono estratte le costanti
-  di tab.~\ref{tab:sock_opt_tcplevel}.}
+\const{IPPROTO\_TCP}) come valore per l'argomento \param{level}. Si sono
+riportate le varie opzioni disponibili in tab.~\ref{tab:sock_opt_tcp} dove
+sono elencate le rispettive costanti da utilizzare come valore per l'argomento
+\param{optname}. Dette costanti e tutte le altre costanti e strutture
+collegate all'uso delle opzioni TCP sono definite in \file{netinet/tcp.h}, ed
+accessibili includendo detto file.\footnote{in realtà questo è il file usato
+  dalle librerie; la definizione delle opzioni effettivamente supportate da
+  Linux si trova nel file \texttt{linux/tcp.h}, dal quale si sono estratte le
+  costanti di tab.~\ref{tab:sock_opt_tcplevel}.}
 
 \begin{table}[!htb]
   \centering
   \footnotesize
-  \begin{tabular}[c]{|l|c|c|c|l|l|}
+  \begin{tabular}[c]{|l|c|c|c|l|p{7cm}|}
     \hline
     \textbf{Opzione}&\texttt{get}&\texttt{set}&\textbf{flag}&\textbf{Tipo}&
                     \textbf{Descrizione}\\
     \hline
     \hline
-    \const{TCP\_NODELAY}      &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_MAXSEG}       &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_CORK}         &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_KEEPIDLE}     &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_KEEPINTVL}    &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_KEEPCNT}      &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_SYNCNT}       &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_LINGER2}      &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_DEFER\_ACCEPT}&$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_WINDOW\_CLAMP}&$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_INFO}         &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_QUICKACK}     &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{TCP\_CONGESTION}   &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
+    \const{TCP\_NODELAY}      &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+      spedisce tutti i pacchetti il prima possibile.\\
+    \const{TCP\_MAXSEG}       &$\bullet$&$\bullet$&         &\texttt{int}&
+      valore della \itindex{Maximum~Segment~Size} MSS per i pacchetti in
+      uscita.\\  
+    \const{TCP\_CORK}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+      non invia frame parziali.\\
+    \const{TCP\_KEEPIDLE}     &$\bullet$&$\bullet$&         &\texttt{int}& 
+      tempo in secondi prima di inviare un \textit{keepalive}.\\
+    \const{TCP\_KEEPINTVL}    &$\bullet$&$\bullet$&         &\texttt{int}&
+      tempo in secondi prima fra \textit{keepalive} successivi.\\
+    \const{TCP\_KEEPCNT}      &$\bullet$&$\bullet$&         &\texttt{int}& 
+      numero massimo di \textit{keepalive} inviati.\\
+    \const{TCP\_SYNCNT}       &$\bullet$&$\bullet$&         &\texttt{int}& 
+      numero massimo di ritrasmissioni del pacchetto SYN.\\
+    \const{TCP\_LINGER2}      &$\bullet$&$\bullet$&         &\texttt{int}&
+      tempo di vita in stato \texttt{FIN\_WAIT2}.\\
+    \const{TCP\_DEFER\_ACCEPT}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+      ritorna da \func{accept} solo in presenza di dati.\\
+    \const{TCP\_WINDOW\_CLAMP}&$\bullet$&$\bullet$&         &\texttt{int}&
+      valore della \textit{advertised window}.\\
+    \const{TCP\_INFO}         &$\bullet$&?        &       &\struct{tcp\_info}& 
+      raccoglie informazioni sul socket.\\
+    \const{TCP\_QUICKACK}     &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+      abilita la modalità \textit{quickack}.\\
+    \const{TCP\_CONGESTION}   &$\bullet$&$\bullet$&?        &\texttt{?}& %??? 
+      non ancora documentata.\\
    \hline
   \end{tabular}
   \caption{Le opzioni per i socket TCP disponibili al livello
@@ -3061,16 +3065,37 @@ includendo detto file.\footnote{in realt
   \label{tab:sock_opt_tcplevel}
 \end{table}
 
-Le descrizioni di tab.~\ref{tab:sock_opt_tcplevel} sono estremamente
-sintetiche, una maggiore quantità di dettagli su queste opzioni è fornita nel
-seguente elenco:
+Le descrizioni riportata in tab.~\ref{tab:sock_opt_tcplevel} sono estremamente
+sintetiche, una maggiore quantità di dettagli e la spiegazione delle singole
+opzioni è fornita nel seguente elenco:
 \begin{basedescript}{\desclabelwidth{3.0cm}\desclabelstyle{\nextlinelabel}}
 
-\item[\const{TCP\_NODELAY}] 
-
-\item[\const{TCP\_MAXSEG}] 
-
-\item[\const{TCP\_CORK}] 
+\item[\const{TCP\_NODELAY}] il protocollo TCP prevede, per evitare la
+  trasmissione di tanti pacchetti piccoli, che comporta un utilizzo non
+  ottimale della banda disponibile, un meccanismo di bufferizzazione dei
+  pacchetti uscenti controllato da un apposito algoritmo (detto
+  \textsl{algoritmo di Nagle}, vedi sez.\ref{sez:tcp_protocol_xxx}).
+  Il comportamento normale prevede invece che i pacchetti siano accumulati
+  fintanto che non si raggiunge una quantità di dati considerata adeguata per
+  eseguire la trasmissione. 
+
+  Impostando questa opzione si disabilita questo meccanismo ed i pacchetti
+  vengono inviati immediatamente qualunque sia la loro dimensione; l'opzione
+  viene sovrascritta dall'eventuale impostazione \const{TCP\_CORK} (che blocca
+  l'invio immediato), tuttavia quando la si abilita viene sempre forzato lo
+  scaricamento della coda di invio (con conseguente trasmissione di tutti i
+  pacchetti pendenti), anche qualora si fosse già abilitata \const{TCP\_CORK}.
+
+\item[\const{TCP\_MAXSEG}] permette di leggere e modificare il valore della
+  \itindex{Maximum~Segment~Size} MSS dei pacchetti uscenti, e se l'opzione è
+  impostata prima di stabilire la connessione, cambia anche il valore della
+  MSS annunciata all'altro capo della connessione. Se si specificano valori
+  maggiori della MTU questi verranno ignorati, inoltre TCP imporrà anche i
+  suoi limiti massimo e minimo per questo valore.
+
+\item[\const{TCP\_CORK}] quando questa opzione viene abilitata non vengono
+  inviati pacchetti di dati fintanto che essa non venga disabilitata; a quel
+  punto tutti i pacchetti rimasti in coda saranno inviati. 
 
 \item[\const{TCP\_KEEPINTVL}] 
 
@@ -3112,10 +3137,10 @@ file.\footnote{come per TCP, la definizione delle opzioni effettivamente
                     \textbf{Descrizione}\\
     \hline
     \hline
-    \const{UDP\_CORK}  &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
-    \const{UDP\_ENCAP} &$\bullet$&$\bullet$&&\texttt{}& %??? 
-      .\\
+    \const{UDP\_CORK}  &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& %??? 
+      accumula tutti i dati su un unico pacchetto.\\
+    \const{UDP\_ENCAP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& %??? 
+      non documentata.\\
    \hline
   \end{tabular}
   \caption{Le opzioni per i socket UDP disponibili al livello
index d3d1f559c4ffa3fd66f861fb83d2a993e4bb2ae0..355593755aec47bc9f7e4c3acbcdbe0d72bee29e 100644 (file)
@@ -131,11 +131,12 @@ dati) che servono a comunicare all'altro capo una serie di parametri utili a
 regolare la connessione. Normalmente vengono usate le seguenti opzioni:
 
 \begin{itemize}
-\item \textit{MSS option}, dove MMS sta per \textit{maximum segment size}, con
-  questa opzione ciascun capo della connessione annuncia all'altro il massimo
-  ammontare di dati che vorrebbe accettare per ciascun segmento nella
-  connessione corrente. È possibile leggere e scrivere questo valore
-  attraverso l'opzione del socket \const{TCP\_MAXSEG}.
+\item \textit{MSS option}, dove MMS sta per \itindex{Maximum~Segment~Size}
+  \textit{Maximum Segment Size}, con questa opzione ciascun capo della
+  connessione annuncia all'altro il massimo ammontare di dati che vorrebbe
+  accettare per ciascun segmento nella connessione corrente. È possibile
+  leggere e scrivere questo valore attraverso l'opzione del socket
+  \const{TCP\_MAXSEG}.
   
 \item \textit{window scale
     option}, %come spiegato in sez.~\ref{sec:tcp_protocol}
@@ -165,8 +166,8 @@ regolare la connessione. Normalmente vengono usate le seguenti opzioni:
 
 \end{itemize}
 
-La MSS è generalmente supportata da quasi tutte le implementazioni del
-protocollo, le ultime due opzioni (trattate
+La MSS \itindex{Maximum~Segment~Size} è generalmente supportata da quasi tutte
+le implementazioni del protocollo, le ultime due opzioni (trattate
 nell'\href{http://www.ietf.org/rfc/rfc1323.txt}{RFC~1323}) sono meno comuni;
 vengono anche dette \textit{long fat pipe options} dato che questo è il nome
 che viene dato alle connessioni caratterizzate da alta velocità o da ritardi
@@ -290,9 +291,10 @@ che il protocollo viene ad assumere per i due lati, server e client.
   \label{fig:TCP_conn_example}
 \end{figure}
 
-La connessione viene iniziata dal client che annuncia un MSS di 1460, un
-valore tipico con Linux per IPv4 su Ethernet, il server risponde con lo stesso
-valore (ma potrebbe essere anche un valore diverso).
+La connessione viene iniziata dal client che annuncia una MSS
+\itindex{Maximum~Segment~Size} di 1460, un valore tipico con Linux per IPv4 su
+Ethernet, il server risponde con lo stesso valore (ma potrebbe essere anche un
+valore diverso).
 
 Una volta che la connessione è stabilita il client scrive al server una
 richiesta (che assumiamo stare in un singolo segmento, cioè essere minore dei
index 243177fc3f0048c5f6212597f2276e24f3e9f2bf..2bb10eb472829fe991adeb53e3bea6e9994de38e 100644 (file)
@@ -52,6 +52,11 @@ fig.~\ref{fig:TCP_state_diag} sono gli stessi che vengono riportati del
 comando \cmd{netstat} nel campo \textit{State}.
 
 
+% TODO trattare la MSS
+% TODO trattare la advertised window
+
+
+
 
 \section{Il protocollo UDP}
 \label{sec:udp_protocol}