X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=tcpsock.tex;h=d4533fe0bad22fe803df9b99518d1ead61b2cf26;hp=3786c86bdc7c68b6cbc58a2ddf906093c7a3f212;hb=8e2e77dff8f3cffb28ddf982280dff6fc015eb19;hpb=ffb12837c5ed8ccc095bc9c88349cd19b5e6b472 diff --git a/tcpsock.tex b/tcpsock.tex index 3786c86..d4533fe 100644 --- a/tcpsock.tex +++ b/tcpsock.tex @@ -135,12 +135,13 @@ 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 \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} (vedi sez.~\ref{sec:sock_tcp_udp_options}). +\item \textit{MSS option}, dove MMS sta per + \itindex{Maximum~Segment~Size~(MSS)} \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} (vedi + sez.~\ref{sec:sock_tcp_udp_options}). \item \textit{window scale option}, il protocollo TCP implementa il controllo di flusso attraverso una \itindex{advertised~window} \textit{advertised @@ -179,8 +180,8 @@ connessione. Normalmente vengono usate le seguenti opzioni: \end{itemize} -La MSS \itindex{Maximum~Segment~Size} è generalmente supportata da quasi tutte -le implementazioni del protocollo, le ultime due opzioni (trattate +La MSS \itindex{Maximum~Segment~Size~(MSS)} è 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 @@ -304,9 +305,9 @@ che il protocollo viene ad assumere per i due lati, server e client. \end{figure} La connessione viene iniziata dal client che annuncia una -\itindex{Maximum~Segment~Size} 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). +\itindex{Maximum~Segment~Size~(MSS)} 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). Una volta che la connessione è stabilita il client scrive al server una richiesta (che assumiamo stare in un singolo segmento, cioè essere minore dei @@ -1100,8 +1101,9 @@ eventualmente ripetere la chiamata alla funzione come per l'errore di Un'altra differenza con BSD è che la funzione non fa ereditare al nuovo socket i flag del socket originale, come \const{O\_NONBLOCK},\footnote{ed in generale tutti quelli che si possono impostare con \func{fcntl}, vedi - sez.~\ref{sec:file_fcntl}.} che devono essere rispecificati ogni volta. Tutto -questo deve essere tenuto in conto se si devono scrivere programmi portabili. + sez.~\ref{sec:file_fcntl_ioctl}.} che devono essere rispecificati ogni +volta. Tutto questo deve essere tenuto in conto se si devono scrivere +programmi portabili. Il meccanismo di funzionamento di \func{accept} è essenziale per capire il funzionamento di un server: in generale infatti c'è sempre un solo socket in @@ -1221,9 +1223,9 @@ socket BSD fanno questa assunzione. \subsection{La funzione \func{close}} \label{sec:TCP_func_close} -La funzione standard Unix \func{close} (vedi sez.~\ref{sec:file_close}) che si -usa sui file può essere usata con lo stesso effetto anche sui file descriptor -associati ad un socket. +La funzione standard Unix \func{close} (vedi sez.~\ref{sec:file_open_close}) +che si usa sui file può essere usata con lo stesso effetto anche sui file +descriptor associati ad un socket. L'azione di questa funzione quando applicata a socket è di marcarlo come chiuso e ritornare immediatamente al processo. Una volta chiamata il socket @@ -1240,9 +1242,9 @@ Come per tutti i file descriptor anche per i socket viene mantenuto un numero di riferimenti, per cui se più di un processo ha lo stesso socket aperto l'emissione del FIN e la sequenza di chiusura di TCP non viene innescata fintanto che il numero di riferimenti non si annulla, questo si applica, come -visto in sez.~\ref{sec:file_sharing}, sia ai file descriptor duplicati che a -quelli ereditati dagli eventuali processi figli, ed è il comportamento che ci -si aspetta in una qualunque applicazione client/server. +visto in sez.~\ref{sec:file_shared_access}, sia ai file descriptor duplicati +che a quelli ereditati dagli eventuali processi figli, ed è il comportamento +che ci si aspetta in una qualunque applicazione client/server. Per attivare immediatamente l'emissione del FIN e la sequenza di chiusura descritta in sez.~\ref{sec:TCP_conn_term}, si può invece usare la funzione @@ -3143,7 +3145,7 @@ velocità consentitagli dalla rete, sul socket. Dato che la connessione è con una macchina remota occorre un certo tempo perché i pacchetti vi arrivino, vengano processati, e poi tornino indietro. Considerando trascurabile il tempo di processo, questo tempo è quello impiegato nella trasmissione via rete, che -viene detto RTT (dalla denominazione inglese \itindex{Round~Trip~Time} +viene detto RTT (dalla denominazione inglese \itindex{Round~Trip~Time~(RTT)} \textit{Round Trip Time}) ed è quello che viene stimato con l'uso del comando \cmd{ping}. @@ -3302,17 +3304,17 @@ con il ciclo (\texttt{\small 8--10}) in cui si impostano i socket trovati attivi. Per far questo si usa la caratteristica dei file descriptor, descritta in -sez.~\ref{sec:file_open}, per cui il kernel associa sempre ad ogni nuovo file -il file descriptor con il valore più basso disponibile. Questo fa sì che si -possa eseguire il ciclo (\texttt{\small 8}) a partire da un valore minimo, che -sarà sempre quello del socket in ascolto, mantenuto in \var{list\_fd}, fino al -valore massimo di \var{max\_fd} che dovremo aver cura di tenere aggiornato. -Dopo di che basterà controllare (\texttt{\small 9}) nella nostra tabella se il -file descriptor è in uso o meno,\footnote{si tenga presente che benché il - kernel assegni sempre il primo valore libero, dato che nelle operazioni i - socket saranno aperti e chiusi in corrispondenza della creazione e - conclusione delle connessioni, si potranno sempre avere dei \textsl{buchi} - nella nostra tabella.} e impostare \var{fset} di conseguenza. +sez.~\ref{sec:file_open_close}, per cui il kernel associa sempre ad ogni nuovo +file il file descriptor con il valore più basso disponibile. Questo fa sì che +si possa eseguire il ciclo (\texttt{\small 8}) a partire da un valore minimo, +che sarà sempre quello del socket in ascolto, mantenuto in \var{list\_fd}, +fino al valore massimo di \var{max\_fd} che dovremo aver cura di tenere +aggiornato. Dopo di che basterà controllare (\texttt{\small 9}) nella nostra +tabella se il file descriptor è in uso o meno,\footnote{si tenga presente che + benché il kernel assegni sempre il primo valore libero, dato che nelle + operazioni i socket saranno aperti e chiusi in corrispondenza della + creazione e conclusione delle connessioni, si potranno sempre avere dei + \textsl{buchi} nella nostra tabella.} e impostare \var{fset} di conseguenza. Una volta inizializzato con i socket aperti il nostro \textit{file descriptor set} potremo chiamare \func{select} per fargli osservare lo stato degli @@ -3576,7 +3578,7 @@ sez.~\ref{sec:TCP_serv_select}. -\subsection{I/O multiplexing con \func{epoll}} +\subsection{I/O multiplexing con \textit{epoll}} \label{sec:TCP_serv_epoll} Da fare.