X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=elemtcp.tex;h=1db669a29c80a1770eec1cff7c0ea1ed5067c510;hp=e31736ff6798a7c824528e69bfb94ac18489a54a;hb=25de957ddf731370bec1eb74b13cf35aa7886d1b;hpb=2e096eb5d1df57ce4b887630bdc81526c455b45b diff --git a/elemtcp.tex b/elemtcp.tex index e31736f..1db669a 100644 --- a/elemtcp.tex +++ b/elemtcp.tex @@ -30,8 +30,8 @@ per capire il modello di programmazione ed il funzionamento delle API. In particolare ci concentreremo sulle modalità con le quali il protocollo dà inizio e conclude una connessione; faremo inoltre anche un breve accenno al significato di alcuni dei vari stati che il protocollo assume durante la vita -di una connessione, che possono essere osservati per ciascun socket attivo con -l'uso del programma \cmd{netstat}. +di una connessione, che possono essere osservati per ciascun +socket\index{socket} attivo con l'uso del programma \cmd{netstat}. \subsection{La creazione della connessione: il \textit{three way handshake}} \label{sec:TCPel_conn_cre} @@ -253,10 +253,9 @@ nel campo \textit{State}. Una descrizione completa del funzionamento del protocollo va al di là degli obiettivi di questo libro; un approfondimento sugli aspetti principali si trova in \capref{cha:tcp_protocol}, ma per una trattazione esauriente il -miglior riferimento resta (FIXME citare lo Stevens); qui ci limiteremo a -descrivere brevemente un semplice esempio di connessione e le transizioni che -avvengono nei due casi appena citati (creazione e terminazione della -connessione). +miglior riferimento resta \cite{TCPIll1}; qui ci limiteremo a descrivere +brevemente un semplice esempio di connessione e le transizioni che avvengono +nei due casi appena citati (creazione e terminazione della connessione). In assenza di connessione lo stato del TCP è \texttt{CLOSED}; quando una applicazione esegue una apertura attiva il TCP emette un SYN e lo stato @@ -507,12 +506,15 @@ dal lato client come parte dell'autenticazione. Questo viene fatto tramite la funzione \func{rresvport} assegnando al socket una porta libera nell'intervallo fra 512 e 1023. -Data una connessione TCP si suole chiamare \textit{socket pair} la -combinazione dei quattro numeri che definiscono i due capi della connessione e -cioè l'indirizzo IP locale e la porta TCP locale, e l'indirizzo IP remoto e la -porta TCP remota; questa combinazione, che scriveremo usando una notazione del -tipo (195.110.112.152:22, 192.84.146.100:20100), identifica univocamente una -connessione su internet. Questo concetto viene di solito esteso anche a UDP, +Data una connessione TCP si suole chiamare \textit{socket pair}\footnote{da + non confondere con la coppia di socket della omonima funzione + \func{socketpair} che fanno riferimento ad una coppia di socket sulla stessa + macchina, non ai capi di una connessione TCP.} la combinazione dei quattro +numeri che definiscono i due capi della connessione e cioè l'indirizzo IP +locale e la porta TCP locale, e l'indirizzo IP remoto e la porta TCP remota; +questa combinazione, che scriveremo usando una notazione del tipo +(195.110.112.152:22, 192.84.146.100:20100), identifica univocamente una +connessione su internet. Questo concetto viene di solito esteso anche a UDP, benché in questo caso non abbia senso parlare di connessione. L'utilizzo del programma \cmd{netstat} permette di visualizzare queste informazioni nei campi \textit{Local Address} e \textit{Foreing Address}. @@ -658,7 +660,7 @@ ci si porr \item[\errcode{EBADF}] il file descriptor non è valido. \item[\errcode{EINVAL}] il socket ha già un indirizzo assegnato. \item[\errcode{ENOTSOCK}] il file descriptor non è associato ad un socket. - \item[\errcode{EACCESS}] si è cercato di usare una porta riservata senza + \item[\errcode{EACCES}] si è cercato di usare una porta riservata senza sufficienti privilegi. \end{errlist}} \end{prototype} @@ -773,9 +775,9 @@ connessione con un server TCP, il prototipo della funzione \item[\errcode{EAGAIN}] non ci sono più porte locali libere. \item[\errcode{EAFNOSUPPORT}] l'indirizzo non ha una famiglia di indirizzi corretta nel relativo campo. - \item[\errcode{EACCESS, EPERM}] si è tentato di eseguire una connessione ad - un indirizzo broadcast senza che il socket fosse stato abilitato per il - broadcast. + \item[\errcode{EACCES}, \errcode{EPERM}] si è tentato di eseguire una + connessione ad un indirizzo broadcast senza che il socket fosse stato + abilitato per il broadcast. \end{errlist} altri errori possibili sono: \errval{EFAULT}, \errval{EBADF}, \errval{ENOTSOCK}, \errval{EISCONN} e \errval{EADDRINUSE}.} @@ -972,13 +974,9 @@ effettuare la comunicazione. Se non ci sono connessioni completate il processo viene messo in attesa. Il prototipo della funzione è il seguente: \begin{prototype}{sys/socket.h} {int accept(int sockfd, struct sockaddr *addr, socklen\_t *addrlen)} - Estrae la prima connessione relativa al socket \var{sockfd} - in attesa sulla coda delle connessioni complete, che associa ad nuovo socket - con le stesse caratteristiche di \var{sockfd} (restituito dalla funzione - stessa). Il socket originale non viene toccato. Nella struttura - \var{addr} e nella variabile \var{addrlen} vengono restituiti - indirizzo e relativa lunghezza del client che si è connesso. + Accetta una connessione sul socket specificato. + \bodydesc{La funzione restituisce un numero di socket descriptor positivo in caso di successo e -1 in caso di errore, nel qual caso la variabile \var{errno} viene impostata ai seguenti valori: @@ -993,9 +991,9 @@ viene messo in attesa. Il prototipo della funzione come non bloccante (vedi \secref{sec:file_noblocking}), e non ci sono connessioni in attesa di essere accettate. \item[\errcode{EPERM}] Le regole del firewall non consentono la connessione. - \item[\errcode{ENOBUFS, ENOMEM}] questo spesso significa che l'allocazione - della memoria è limitata dai limiti sui buffer dei socket, non dalla - memoria di sistema. + \item[\errcode{ENOBUFS}, \errcode{ENOMEM}] questo spesso significa che + l'allocazione della memoria è limitata dai limiti sui buffer dei socket, + non dalla memoria di sistema. \end{errlist} Inoltre possono essere restituiti gli errori di rete relativi al nuovo socket come: \errval{EMFILE}, \errval{EINVAL}, \errval{ENOSR}, @@ -1004,6 +1002,13 @@ viene messo in attesa. Il prototipo della funzione \errval{ERESTARTSYS}.} \end{prototype} +Estrae la prima connessione relativa al socket \var{sockfd} in attesa sulla +coda delle connessioni complete, che associa ad nuovo socket con le stesse +caratteristiche di \var{sockfd} (restituito dalla funzione stessa). Il socket +originale non viene toccato. Nella struttura \var{addr} e nella variabile +\var{addrlen} vengono restituiti indirizzo e relativa lunghezza del client che +si è connesso. + La funzione può essere usata solo con socket che supportino la connessione (cioè di tipo \const{SOCK\_STREAM}, \const{SOCK\_SEQPACKET} o \const{SOCK\_RDM}). Per alcuni protocolli che richiedono una conferma