From: Simone Piccardi Date: Wed, 6 Sep 2006 15:56:19 +0000 (+0000) Subject: Materiale sulle opzioni dei socket e qualche riferimento alla futura X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=3925d42aafd1c1ac743c2f0a748981c26335915d;p=gapil.git Materiale sulle opzioni dei socket e qualche riferimento alla futura sezione sul protocollo TCP delle appendici. --- diff --git a/network.tex b/network.tex index 15459e0..c96d96b 100644 --- a/network.tex +++ b/network.tex @@ -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. diff --git a/sockadv.tex b/sockadv.tex index f501771..0f0aa32 100644 --- a/sockadv.tex +++ b/sockadv.tex @@ -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. diff --git a/sockctrl.tex b/sockctrl.tex index 8bc4d03..ae340ef 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -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 diff --git a/tcpsock.tex b/tcpsock.tex index d3d1f55..3555937 100644 --- a/tcpsock.tex +++ b/tcpsock.tex @@ -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 diff --git a/trasplayer.tex b/trasplayer.tex index 243177f..2bb10eb 100644 --- a/trasplayer.tex +++ b/trasplayer.tex @@ -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}