From 388493a5b44babce8434148b87562aea0f046db7 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sat, 26 Mar 2005 14:01:17 +0000 Subject: [PATCH] Reindicizzate alcune macro, messa sezione sulle opzioni di IP, risistemata la parte di SO_REUSEADDR. --- sockctrl.tex | 102 ++++++++++++++++++++++++++++++++++++++++++--------- socket.tex | 14 +++---- tcpsock.tex | 32 ++++++++-------- 3 files changed, 108 insertions(+), 40 deletions(-) diff --git a/sockctrl.tex b/sockctrl.tex index 90e922b..89c3bfc 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -2072,7 +2072,7 @@ anche di trattare i vari casi particolari, dato che nonostante queste opzioni siano indicate al livello generico, alcune di esse han senso solo per alcuni tipi di socket. L'elenco dettagliato del significato di ciascuna di esse è allora il seguente: -\begin{basedescript}{\desclabelwidth{3cm}\desclabelstyle{\nextlinelabel}} +\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}} \item[\const{SO\_KEEPALIVE}] una connessione può restare attiva se non viene effettuato alcun traffico su di essa; in certi casi però può essere utile controllarne lo stato per accorgersi di eventuali problemi. Per questo, se @@ -2236,12 +2236,12 @@ allora il seguente: di amministratore (in particolare con la \textit{capability} \const{CAP\_NET\_ADMIN}). L'opzione necessita inoltre dell'opportuno supporto nel kernel;\footnote{deve cioè essere definita la macro di - preprocessore \texttt{SOCK\_DEBUGGING} nel file \file{include/net/sock.h} + preprocessore \macro{SOCK\_DEBUGGING} nel file \file{include/net/sock.h} dei sorgenti del kernel, questo è sempre vero nei kernel delle serie superiori alla 2.3, per i kernel delle serie precedenti invece è necessario aggiungere a mano detta definizione; è inoltre possibile abilitare anche il tracciamento degli stati del TCP definendo la macro - \texttt{STATE\_TRACE} in \file{include/net/tcp.h}.} quando viene + \macro{STATE\_TRACE} in \file{include/net/tcp.h}.} quando viene abilitata una serie di messaggi con le informazioni di debug vengono inviati direttamente al sistema del kernel log.\footnote{si tenga presente che il comportamento è diverso da quanto avviene con BSD, dove l'opzione opera @@ -2273,7 +2273,7 @@ allora il seguente: Usando \const{SO\_REUSEADDR} fra la chiamata a \func{socket} e quella a \func{bind} si consente a quest'ultima di avere comunque successo anche se - la connessione è attiva (o nello stato texttt{TIME\_WAIT}). È bene però + la connessione è attiva (o nello stato \texttt{TIME\_WAIT}). È bene però ricordare (si riveda quanto detto in sez.~\ref{sec:TCP_time_wait}) che la presenza dello stato \texttt{TIME\_WAIT} ha una ragione, ed infatti se si usa questa opzione esiste sempre una probabilità, anche se estremamente @@ -2294,16 +2294,20 @@ allora il seguente: impostato \const{SO\_REUSEADDR}. Usando questa opzione diventa anche possibile eseguire \func{bind} sull'indirizzo generico, e questo permetterà il collegamento per tutti gli indirizzi (di quelli presenti) per i quali la - porta risulti libera. Infine si tenga presente che con il protocollo TCP non - è mai possibile far partire server che eseguano \func{bind} sullo stesso - indirizzo e la stessa porta, cioè ottenere quello che viene chiamato un - \textit{completely duplicate binding}. + porta non risulti occupata da una precedente chiamata più specifica. Infine + si tenga presente che con il protocollo TCP non è mai possibile far partire + server che eseguano \func{bind} sullo stesso indirizzo e la stessa porta, + cioè ottenere quello che viene chiamato un \textit{completely duplicate + binding}. Il terzo impiego è simile al precedente e prevede l'uso di \func{bind} all'interno dello stesso programma per associare indirizzi diversi a socket - diversi. Vale in questo caso quanto detto in precedenza, l'unica differenza - è che in questo caso le diverse chiamate a \func{bind} sono eseguite - all'interno dello stesso programma. + diversi. Il meccanismo funziona fintanto che ciascuna chiamata usa degli + indirizzi remoti diversi. In genere questo viene fatto per i socket UDP, per + ottenere l'indirizzo remoto, sui sistemi per i quali non è diponibile + l'opzione \const{IP\_RECVDSTADDR}, non viene usata per TCP dato che su tali + socket si può sempre invocare \func{getsockname} una volta che si è + completata la connessione. \item[\const{SO\_TYPE}] questa opzione permette di leggere il tipo di socket @@ -2348,23 +2352,87 @@ allora il seguente: \item[\const{SO\_PRIORITY}] questa opzione permette di impostare le priorità per tutti i pacchetti che sono inviati sul socket, prende per \param{optval} un valore intero. Con questa opzione il kernel usa il valore per ordinare le - priorità sulle code di rete,\foonote{questo richiede che sia abilitato il + priorità sulle code di rete,\footnote{questo richiede che sia abilitato il sistema di \textit{Quality of Service} disponibile con le opzioni di routing avanzato.} i pacchetti con priorità più alta vengono processati per primi, in modalità che dipendono dalla disciplina di gestione della coda. Nel caso di protocollo IP questa opzione permette anche di impostare i - valori del campo \textit{type of service} (TOF, vedi - sez.~\ref{sec:IP_intro}) per i pacchetti uscenti. Per impostare una priorità + valori del campo \textit{type of service} (noto come TOS, vedi + sez.~\ref{sec:IP_xxx}) per i pacchetti uscenti. Per impostare una priorità al di fuori dell'intervallo di valori fra 0 e 6 sono richiesti i privilegi di amministratore con la capability \const{CAP\_NET\_ADMIN}. \item[\const{SO\_ERROR}] questa opzione riceve un errore presente sul socket; può essere utilizzata soltanto con \func{getsockopt} e prende per - \param{optval} un valore intero. - + \param{optval} un valore intero. \end{basedescript} +\subsection{Le opzioni per il protocollo IPv4} +\label{sec:sock_ipv4_options} + +Il secondo insieme di opzioni dei socket che tratteremo è quello relativo ai +socket che usano il protocollo IPv4.\footnote{come per le precedenti opzioni + generiche una descrizione di esse è disponibile nella settima sezione delle + pagine di manuale, nel caso specifico la documentazione si può consultare + con \texttt{man 7 ip}.} Se si vuole operare su queste opzioni generiche il +livello da utilizzare è \const{SOL\_IP}; si è riportato un elenco di queste +opzioni in tab.~\ref{tab:sock_opt_iplevel}. + + +\begin{table}[!htb] + \centering + \footnotesize + \begin{tabular}[c]{|l|c|c|c|l|l|} + \hline + \textbf{Opzione}&\texttt{get}&\texttt{set}&\textbf{flag}&\textbf{Tipo}& + \textbf{Descrizione}\\ + \hline + \hline + \const{IP\_OPTIONS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + .\\ + \const{IP\_PKTINFO}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + .\\ + \const{IP\_RECVTOS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + .\\ + \const{IP\_RECVTTL}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + .\\ + \const{IP\_RECVOPTS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + .\\ + \const{IP\_RETOPTS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + .\\ + \const{IP\_TOS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + .\\ + \const{IP\_TTL}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + .\\ + \const{IP\_HDRINCL}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + .\\ + \const{IP\_RECVERR}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + .\\ + \const{IP\_MTU\_DISCOVER}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + .\\ + \const{IP\_MTU}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + .\\ + \const{IP\_ROUTER\_ALERT}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + .\\ + \const{IP\_MULTICAST\_TTL}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + .\\ + \const{IP\_MULTICAST\_LOOP}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + .\\ + \const{IP\_ADD\_MEMBERSHIP}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + .\\ + \const{IP\_DROP\_MEMBERSHIP}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + .\\ + \const{IP\_MULTICAST\_IF}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + .\\ + \hline + \end{tabular} + \caption{Le opzioni disponibili al livello \const{SOL\_IP}.} + \label{tab:sock_opt_iplevel} +\end{table} + + + \section{Altre funzioni di controllo} @@ -2427,7 +2495,7 @@ possibile intervenire; un contenuto tipico Nella directory \texttt{/proc/sys/net/core} sono disponibili le opzioni generiche dei socket, descritte anche nella rispettiva pagina di -manuale.\foonote{quella accessibile con \texttt{man 7 socket}.} Queste sono: +manuale.\footnote{quella accessibile con \texttt{man 7 socket}.} Queste sono: \begin{basedescript}{\desclabelwidth{3cm}\desclabelstyle{\nextlinelabel}} \item[\texttt{rmem\_default}] imposta la dimensione di default del buffer di diff --git a/socket.tex b/socket.tex index eb43ce5..833d037 100644 --- a/socket.tex +++ b/socket.tex @@ -240,7 +240,7 @@ Si tenga presente che non tutte le famiglie di protocolli sono utilizzabili dall'utente generico, ad esempio in generale tutti i socket di tipo \const{SOCK\_RAW} possono essere creati solo da processi che hanno i privilegi di amministratore (cioè con user-ID effettivo uguale a zero) o dotati della -capability \texttt{CAP\_NET\_RAW}. +capability \const{CAP\_NET\_RAW}. \subsection{Il tipo, o stile} @@ -457,7 +457,7 @@ altrimenti si avr specifica il \textsl{numero di porta}. I numeri di porta sotto il 1024 sono chiamati \textsl{riservati} in quanto utilizzati da servizi standard e soltanto processi con i privilegi di amministratore (con user-ID effettivo -uguale a zero) o con la capability \texttt{CAP\_NET\_BIND\_SERVICE} possono +uguale a zero) o con la capability \const{CAP\_NET\_BIND\_SERVICE} possono usare la funzione \func{bind} (che vedremo in sez.~\ref{sec:TCP_func_bind}) su queste porte. @@ -719,13 +719,13 @@ cos % passaggio dipende dalla direzione del medesimo, dal processo al kernel o % viceversa. -% In particolare le tre funzioni \texttt{bind}, \texttt{connect} e -% \texttt{sendto} passano la struttura al kernel, in questo caso è passata +% In particolare le tre funzioni \func{bind}, \func{connect} e +% \func{sendto} passano la struttura al kernel, in questo caso è passata % \textsl{per valore} anche la dimensione della medesima -% Le funzioni \texttt{accept}, \texttt{recvfrom}, \texttt{getsockname} e -% \texttt{getpeername} invece ricevono i valori del kernel +% Le funzioni \func{accept}, \func{recvfrom}, \func{getsockname} e +% \func{getpeername} invece ricevono i valori del kernel @@ -956,7 +956,7 @@ e \textit{numeric}. % \centering % \caption{Schema della rappresentazioni utilizzate dalle funzioni di -% conversione \texttt{inet\_pton} e \texttt{inet\_ntop} } +% conversione \func{inet\_pton} e \func{inet\_ntop} } % \label{fig:sock_inet_conv_func} % \end{figure} diff --git a/tcpsock.tex b/tcpsock.tex index 1c55fd3..7fa5507 100644 --- a/tcpsock.tex +++ b/tcpsock.tex @@ -86,12 +86,12 @@ si stabilisce la connessione. % Una analogia citata da R. Stevens per la connessione TCP è quella con il -% sistema del telefono. La funzione \texttt{socket} può essere considerata -% l'equivalente di avere un telefono. La funzione \texttt{bind} è analoga al +% sistema del telefono. La funzione \func{socket} può essere considerata +% l'equivalente di avere un telefono. La funzione \func{bind} è analoga al % dire alle altre persone qual è il proprio numero di telefono perché possano -% chiamare. La funzione \texttt{listen} è accendere il campanello del telefono -% per sentire le chiamate in arrivo. La funzione \texttt{connect} richiede di -% conoscere il numero di chi si vuole chiamare. La funzione \texttt{accept} è +% chiamare. La funzione \func{listen} è accendere il campanello del telefono +% per sentire le chiamate in arrivo. La funzione \func{connect} richiede di +% conoscere il numero di chi si vuole chiamare. La funzione \func{accept} è % quando si risponde al telefono. \begin{figure}[htb] @@ -271,7 +271,7 @@ passiva stato \texttt{LISTEN} in cui vengono accettate le connessioni. Dallo stato \texttt{ESTABLISHED} si può uscire in due modi; se un'applicazione -chiama la funzione \texttt{close} prima di aver ricevuto un +chiama la funzione \func{close} prima di aver ricevuto un \textit{end-of-file} (chiusura attiva) la transizione è verso lo stato \texttt{FIN\_WAIT\_1}; se invece l'applicazione riceve un FIN nello stato \texttt{ESTABLISHED} (chiusura passiva) la transizione è verso lo stato @@ -641,7 +641,7 @@ precedente in sez.~\ref{sec:sock_socket}. La funzione \funcd{bind} assegna un indirizzo locale ad un socket.\footnote{nel nostro caso la utilizzeremo per socket TCP, ma la funzione è generica e deve essere usata per qualunque tipo di socket - \texttt{SOCK\_STREAM} prima che questo possa accettare connessioni.} È usata + \const{SOCK\_STREAM} prima che questo possa accettare connessioni.} È usata cioè per specificare la prima parte dalla socket pair. Viene usata sul lato server per specificare la porta (e gli eventuali indirizzi locali) su cui poi ci si porrà in ascolto. Il prototipo della funzione è il seguente: @@ -754,10 +754,10 @@ staticamente a \const{IN6ADRR\_LOOPBACK\_INIT}. La funzione \funcd{connect} è usata da un client TCP per stabilire la connessione con un server TCP,\footnote{di nuovo la funzione è generica e supporta vari tipi di socket, la differenza è che per socket senza - connessione come quelli di tipo \texttt{SOCK\_DGRAM} la sua chiamata si + connessione come quelli di tipo \const{SOCK\_DGRAM} la sua chiamata si limiterà ad impostare l'indirizzo dal quale e verso il quale saranno inviati - e ricevuti i pacchetti, mentre per socket di tipo \texttt{SOCK\_STREAM} o - \texttt{SOCK\_SEQPACKET}, essa attiverà la procedura di avvio (nel caso del + e ricevuti i pacchetti, mentre per socket di tipo \const{SOCK\_STREAM} o + \const{SOCK\_SEQPACKET}, essa attiverà la procedura di avvio (nel caso del TCP il \index{\textit{three~way~handshake}}\textit{three way handshake}) della connessione.} il prototipo della funzione è il seguente: \begin{prototype}{sys/socket.h} @@ -864,8 +864,8 @@ necessario effettuare una \func{bind}. La funzione \funcd{listen} serve ad usare un socket in modalità passiva, cioè, come dice il nome, per metterlo in ascolto di eventuali connessioni;\footnote{questa funzione può essere usata con socket che - supportino le connessioni, cioè di tipo \texttt{SOCK\_STREAM} o - \texttt{SOCK\_SEQPACKET}.} in sostanza l'effetto della funzione è di portare + supportino le connessioni, cioè di tipo \const{SOCK\_STREAM} o + \const{SOCK\_SEQPACKET}.} in sostanza l'effetto della funzione è di portare il socket dallo stato \texttt{CLOSED} a quello \texttt{LISTEN}. In genere si chiama la funzione in un server dopo le chiamate a \func{socket} e \func{bind} e prima della chiamata ad \func{accept}. Il prototipo della funzione, come @@ -992,8 +992,8 @@ trasparente dal protocollo TCP. La funzione \funcd{accept} è chiamata da un server per gestire la connessione una volta che sia stato completato il \textit{three way handshake},\footnote{la funzione è comunque generica ed è utilizzabile su - socket di tipo \texttt{SOCK\_STREAM}, \texttt{SOCK\_SEQPACKET} e - \texttt{SOCK\_RDM}.} la funzione restituisce un nuovo socket descriptor su + socket di tipo \const{SOCK\_STREAM}, \const{SOCK\_SEQPACKET} e + \const{SOCK\_RDM}.} la funzione restituisce un nuovo socket descriptor su cui si potrà operare per effettuare la comunicazione. Se non ci sono connessioni completate il processo viene messo in attesa. Il prototipo della funzione è il seguente: @@ -1406,7 +1406,7 @@ marcare dei blocchi di dati, per cui se questo programma stesso. Se abilitiamo il servizio \textit{daytime}\footnote{in genere questo viene - fornito direttamente dal \textsl{superdemone} \texttt{inetd}, pertanto basta + fornito direttamente dal \textsl{superdemone} \cmd{inetd}, pertanto basta assicurarsi che esso sia abilitato nel relativo file di configurazione.} possiamo verificare il funzionamento del nostro client, avremo allora: \begin{verbatim} @@ -1705,7 +1705,7 @@ sez.~\ref{sec:sock_io_behav}, per scrivere i dati sul socket, gestendo automaticamente l'invio multiplo qualora una singola \func{write} non sia sufficiente. I dati vengono riletti indietro (\texttt{\small 7}) con una \func{read}\footnote{si è fatta l'assunzione implicita che i dati siano - contenuti tutti in un solo segmento, così che la chiamata a \texttt{read} li + contenuti tutti in un solo segmento, così che la chiamata a \func{read} li restituisca sempre tutti; avendo scelto una dimensione ridotta per il buffer questo sarà sempre vero, vedremo più avanti come superare il problema di rileggere indietro tutti e soli i dati disponibili, senza bloccarsi.} sul -- 2.30.2