From 5c31faf40cb22faf707e6dc3b16770ae64fe5b4d Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sat, 8 Mar 2003 15:36:56 +0000 Subject: [PATCH] Nuovo overview dei protocolli. Scritto qualcosa su peer-to-peer e three-tier --- img/gapil.jpg | Bin 38271 -> 0 bytes img/tcpip_overview.dia | Bin 3923 -> 5249 bytes network.tex | 112 ++++++++++++++++++++++++++++++++--------- socket.tex | 107 ++++++++++++++++++++------------------- 4 files changed, 144 insertions(+), 75 deletions(-) delete mode 100644 img/gapil.jpg diff --git a/img/gapil.jpg b/img/gapil.jpg deleted file mode 100644 index cdf8a7e61b43705234386ac4063303191566b336..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38271 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 h_74o@>rwiUu=WQ$0RRpNja~o% diff --git a/network.tex b/network.tex index 606a330..d564dc4 100644 --- a/network.tex +++ b/network.tex @@ -47,43 +47,107 @@ gli scopi del testo approfondire questi argomenti. \subsection{Il modello \textit{client-server}} \label{sec:net_cliserv} -Il concetto fondamentale su cui si basa la programmazione di rete sotto Linux -(e sotto Unix in generale) è il modello \textit{client-server} in cui un -programma di servizio, il \textit{server}, riceve una richiesta e risponde a -un programma di utilizzo, il \textit{client}, fornendo a quest'ultimo un -definito insieme di servizi. - -Infatti seguono questo modello tutti i servizi fondamentali di internet, come -il le pagine web, ftp, telnet, ssh e praticamente ogni servizio che viene -fornito tramite la rete, anche se, come abbiamo visto, il modello è utilizzato -in generale anche per programmi che, come gli esempi che abbiamo usato in -\capref{cha:IPC} a proposito della comunicazione fra processi nello stesso -sistema, non fanno necessariamente uso della rete. +L'architettura fondamentale su cui si basa gran parte della programmazione di +rete sotto Linux (e sotto Unix in generale) è il modello +\textit{client-server} caratterizzato dalla presenza di due categorie di +soggetti, i programmi di servizio, chiamati \textit{server}, che ricevono le +richieste e forniscono le risposte, ed i programmi di utilizzo, detti +\textit{client}. + +In generale un server può (di norma deve) essere in grado di rispondere a più +di un client, per cui è possibile che molti programmi possano interagire +contemporaneamente, quello che contraddistingue il modello però è che +l'architettura dell'interazione è sempre nei termini di molti verso uno, il +server, che viene ad assumere un ruolo privilegiato. + +Seguono questo modello tutti i servizi fondamentali di internet, come le +pagine web, la posta elettronica, ftp, telnet, ssh e praticamente ogni +servizio che viene fornito tramite la rete, anche se, come abbiamo visto, il +modello è utilizzato in generale anche per programmi che, come gli esempi che +abbiamo usato in \capref{cha:IPC} a proposito della comunicazione fra processi +nello stesso sistema, non fanno necessariamente uso della rete. Normalmente si dividono i server in due categorie principali, e vengono detti \textsl{concorrenti} o \textsl{iterativi}, sulla base del loro comportamento. - Un \textsl{server iterativo} risponde alla richiesta inviando i dati e resta -occupato (non rispondendo ad ulteriori richieste) fintanto che non ha concluso -la richiesta. Una volta completata la richiesta il server diventa di nuovo -disponibile. +occupato e non rispondendo ad ulteriori richieste fintanto che non ha fornito +una risposta alla richiesta. Una volta completata la risposta il server +diventa di nuovo disponibile. Un \textsl{server concorrente} al momento di trattare la richiesta crea un -processo figlio incaricato di fornire i servizi richiesti, per poi porsi in -attesa di ulteriori richieste. In questo modo più richieste possono essere -soddisfatte contemporaneamente; una volta che il processo figlio ha concluso -il suo lavoro viene terminato, mentre il server originale resta sempre attivo. +processo figlio (o un thread) incaricato di fornire i servizi richiesti, per +porsi immediatamente in attesa di ulteriori richieste. In questo modo, con +sistemi multitasking, più richieste possono essere soddisfatte +contemporaneamente. Una volta che il processo figlio ha concluso il suo lavoro +esso di norma viene terminato, mentre il server originale resta sempre attivo. -\subsection{Il modello \textit{peer-to-perr}} +\subsection{Il modello \textit{peer-to-peer}} \label{sec:net_peertopeer} -Da fare +Come abbiamo visto il tratto saliente dell'architettura \textit{client-server} +è quello della preminenza del server rispetto ai client, le architetture +\textit{peer-to-peer} si basano su un approccio completamente opposto che è +quello di non avere nessun programma che svolga un ruolo preminente. + +Questo vuol dire che in generale ciascun programma viene ad agire come un nodo +in una rete potenzialmente paritetica; ciascun programma si trova pertanto a +ricevere ed inviare richieste ed a ricevere ed inviare risposte, e non c'è più +la separazione netta dei compiti che si ritrova nelle archietetture +\textit{client-server}. + +Le architetture \textit{peer-to-peer} sono salite alla ribalta con +l'esplosione del fenomeno Napster, ma gli stessi protocolli di routing sono un +buon esempio di archietetture \textit{peer-to-peer}, in cui ciascun nodo, +tramite il demone che gestisce il routing, richiede ed invia informazioni ad +altri nodi. + +In realtà in molti casi di archietture classificate come \textit{peer-to-peer} +non è detto che la struttura sia totalmente paritetica e ci sono parecchi +esempi in cui alcuni servizi vengono centralizzati o disribuiti +gerarchicamente, come per lo stesso Napster, in cui le ricerche venivano +effettuate su un server centrale. + + \subsection{Il modello \textit{three-tier}} \label{sec:net_three_tier} -Da fare +Benché qui sia trattato a parte, il modello \textit{three-tier} in realtà è +una estensione del modello \textit{client-server}. Con il crescere della +quantità dei servizi forniti in rete (in particolare su internet) ed al numero +di accessi richiesto. Si è così assistito anche ad una notevole crescita di +complessità, in cui diversi servizi venivano ad essere integrati fra di loro. + +In particolare sempre più spesso si assiste ad una integrazione di servizi di +database con servizi di web, in cui le pagine vengono costruite dinamicamente +sulla base dei dati contenuti nel database. In tutti questi casi il problema +fondamentale di una architettura \textit{client-server} è che la richiesta di +un servizio da parte di un gran numero di client si scontra con il collo di +bottiglia dell'accesso diretto ad un unico server, con gravi problemi di +scalabilità. + +Rispondere a queste esigenze di scalabilità il modello più semplice (chiamato +talvolta \textit{two-tier}) da adottare è stata quello di distribuire il +carico delle richieste su più server identici, mantenendo quindi +sostanzialmente inalterata l'archiettettura \textit{client-server} originale. + +Nel far questo ci si scontra però con gravi problemi di manutenibilità dei +servizi, in particolare per quanto riguarda la sincronizzazione dei dati, e di +inefficienza dell'uso delle risorse. Il problema è particolarmente grave per i +database che non possono essere replicati e sincronizzati facilemente, e che +sono molto onerosi sia in termini di richiesta risorse. + +È a partire da queste problematiche che nasce il modello \textit{three-tier}, +che si struttura, come dice il nome, su tre livelli. Il primo, quello dei +client, che eseguono le richieste e gestiscono l'interfaccia con l'utente, +resta sostanzialmente lo stesso del modello \textit{client-server}, ma la +parte server viene suddivisa in due livelli, introducendo un +\textit{middle-tier}, su cui deve appoggiarsi tutta la logica di analisi delle +richieste dei client per ottimizzare l'accesso al terzo livello, quello dei +server che invece si limita a fornire dei dati che verranno usati dal +\textit{middle-tier} per eseguire le operazioni. + \section{I protocolli di rete} @@ -317,7 +381,7 @@ reciproche e con alcune dalle principali applicazioni che li usano. \begin{figure}[!htbp] \centering - \includegraphics[width=15cm]{img/tcpip_overview} + \includegraphics[width=13cm]{img/tcpip_overview} \caption{Panoramica sui vari protocolli che compongono la suite TCP/IP.} \label{fig:net_tcpip_overview} \end{figure} diff --git a/socket.tex b/socket.tex index 5a2a8ea..2dc5674 100644 --- a/socket.tex +++ b/socket.tex @@ -278,33 +278,35 @@ elencati. \begin{table}[htb] \footnotesize \centering - \begin{tabular}{l|c|c|c|c|c|} - \multicolumn{1}{c}{} &\multicolumn{1}{c}{\const{SOCK\_STREAM}}& - \multicolumn{1}{c}{\const{SOCK\_DGRAM}} & - \multicolumn{1}{c}{\const{SOCK\_RAW}} & - \multicolumn{1}{c}{\const{SOCK\_PACKET}}& - \multicolumn{1}{c}{\const{SOCK\_SEQPACKET}} \\ - \cline{2-6} + \begin{tabular}{|l|c|c|c|c|c|} + \hline + \multicolumn{1}{|c|}{\textbf{Famiglia}}& + \multicolumn{5}{|c|}{\textbf{Tipo}}\\ + \hline + \hline + &\const{SOCK\_STREAM} &\const{SOCK\_DGRAM} &\const{SOCK\_RAW}& + \const{SOCK\_PACKET}&\const{SOCK\_SEQPACKET} \\ + \hline \const{PF\_UNIX} & si & si & & & \\ - \cline{2-6} + \hline \const{PF\_INET} & TCP & UDP & IPv4 & & \\ - \cline{2-6} + \hline \const{PF\_INET6} & TCP & UDP & IPv6 & & \\ - \cline{2-6} + \hline \const{PF\_IPX} & & & & & \\ - \cline{2-6} + \hline \const{PF\_NETLINK} & & si & si & & \\ - \cline{2-6} + \hline \const{PF\_X25} & & & & & si \\ - \cline{2-6} + \hline \const{PF\_AX25} & & & & & \\ - \cline{2-6} + \hline \const{PF\_ATMPVC} & & & & & \\ - \cline{2-6} + \hline \const{PF\_APPLETALK} & & si & si & & \\ - \cline{2-6} + \hline \const{PF\_PACKET} & & si & si & & \\ - \cline{2-6} + \hline \end{tabular} \caption{Combinazioni valide di dominio e tipo di protocollo per la funzione \func{socket}.} @@ -437,12 +439,12 @@ si usa IPv4) \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{} struct sockaddr_in { sa_family_t sin_family; /* address family: AF_INET */ - u_int16_t sin_port; /* port in network byte order */ + in_port_t sin_port; /* port in network byte order */ struct in_addr sin_addr; /* internet address */ }; /* Internet address. */ struct in_addr { - u_int32_t s_addr; /* address in network byte order */ + in_addr_t s_addr; /* address in network byte order */ }; \end{lstlisting} \end{minipage} @@ -497,15 +499,15 @@ in \figref{fig:sock_sa_ipv6_struct}. \begin{minipage}[c]{15cm} \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{} struct sockaddr_in6 { - u_int16_t sin6_family; /* AF_INET6 */ - u_int16_t sin6_port; /* port number */ - u_int32_t sin6_flowinfo; /* IPv6 flow information */ + uint16_t sin6_family; /* AF_INET6 */ + in_port_t sin6_port; /* port number */ + uint32_t sin6_flowinfo; /* IPv6 flow information */ struct in6_addr sin6_addr; /* IPv6 address */ - u_int32_t sin6_scope_id; /* Scope id (new in 2.4) */ + uint32_t sin6_scope_id; /* Scope id (new in 2.4) */ }; struct in6_addr { - unsigned char s6_addr[16]; /* IPv6 address */ + uint8_t s6_addr[16]; /* IPv6 address */ }; \end{lstlisting} \end{minipage} @@ -540,8 +542,9 @@ comunicazione fra processi che stanno sulla stessa macchina (per vengono chiamati \textit{local domain} o anche \textit{Unix domain}); essi rispetto ai precedenti possono essere anche creati in maniera anonima attraverso la funzione \func{socketpair} (vedi \secref{sec:ipc_socketpair}). Quando però si -vuole fare riferimento esplicito ad uno di questi socket si deve usare la -seguente struttura di indirizzi definita nel file di header \file{sys/un.h}. +vuole fare riferimento esplicito ad uno di questi socket si deve usare una +struttura degli indirizzi di tipo \struct{sockaddr\_un}, la cui definizione si +è riportata in \secref{fig:sock_sa_local_struct}. \begin{figure}[!htb] \footnotesize \centering @@ -554,18 +557,18 @@ struct sockaddr_un { }; \end{lstlisting} \end{minipage} - \caption{La struttura degli indirizzi dei socket locali - \structd{sockaddr\_un}.} + \caption{La struttura degli indirizzi dei socket locali (detti anche + \textit{unix domain}) \structd{sockaddr\_un} definita in \file{sys/un.h}.} \label{fig:sock_sa_local_struct} \end{figure} In questo caso il campo \var{sun\_family} deve essere \const{AF\_UNIX}, mentre -il campo \var{sun\_path} deve specificare un indirizzo; questo ha due forme: +il campo \var{sun\_path} deve specificare un indirizzo. Questo ha due forme: un file (di tipo socket) nel filesystem o una stringa univoca (mantenuta in uno spazio di nomi astratto). Nel primo caso l'indirizzo viene specificato come una stringa (terminata da uno zero) corrispondente al pathname del file; -nel secondo invece \var{sun\_path} inizia con uno zero vengono usati i -restanti byte come stringa (senza terminazione). +nel secondo invece \var{sun\_path} inizia con uno zero e vengono usati i +restanti byte come stringa, senza terminazione. \subsection{La struttura degli indirizzi AppleTalk} @@ -576,8 +579,9 @@ I socket di tipo \const{PF\_APPLETALK} sono usati dalla libreria AppleTalk, uno dei primi protocolli di rete usato nel mondo dei personal computer, usato dalla Apple per connettere fra loro computer e stampanti. Il kernel supporta solo due strati del protocollo, DDP e AARP, e di norma è -opportuno usare le funzioni di libreria, si tratta qui questo argomento -principalmente per mostrare l'uso di un protocollo alternativo. +opportuno usare le funzioni della libreria \texttt{netatalk}, tratteremo qui +questo argomento principalmente per mostrare l'uso di un protocollo +alternativo. I socket AppleTalk permettono di usare il protocollo DDP, che è un protocollo a pacchetto, di tipo \const{SOCK\_DGRAM}; l'argomento \param{protocol} di @@ -585,19 +589,24 @@ a pacchetto, di tipo \const{SOCK\_DGRAM}; l'argomento \param{protocol} di specificando un tipo \const{SOCK\_RAW}, nel qual caso l'unico valore valido per \param{protocol} è \func{ATPROTO\_DDP}. +Gli indirizzi AppleTalk devono essere specificati tramite una struttura +\struct{sockaddr\_atalk}, la cui definizione è riportata in +\figref{fig:sock_sa_atalk_struct}; la struttura viene dichiarata includendo il +file \file{netatalk/at.h}. + \begin{figure}[!htb] \footnotesize \centering \begin{minipage}[c]{15cm} \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{} struct sockaddr_atalk { sa_family_t sat_family; /* address family */ - u_char sat_port; /* port */ + uint8_t sat_port; /* port */ struct at_addr sat_addr; /* net/node */ }; struct at_addr { - unsigned short s_net; - unsigned char s_node; + uint16_t s_net; + uint8_t s_node; }; \end{lstlisting} \end{minipage} @@ -606,12 +615,12 @@ struct at_addr { \label{fig:sock_sa_atalk_struct} \end{figure} -Il campo \var{sut\_family} deve essere sempre \const{AF\_APPLETALK}, mentre il -campo \var{sun\_port} specifica la porta che identifica i vari servizi. Valori +Il campo \var{sat\_family} deve essere sempre \const{AF\_APPLETALK}, mentre il +campo \var{sat\_port} specifica la porta che identifica i vari servizi. Valori inferiori a 129 sono usati per le \textsl{porte riservate}, e possono essere usati solo da processi con i privilegi di amministratore o con la capability \const{CAP\_NET\_BIND\_SERVICE}. L'indirizzo remoto è specificato nella -struttura \var{sun\_addr}, e deve essere in \textit{network order}; esso è +struttura \var{sat\_addr}, e deve essere in \textit{network order}; esso è composto da un parte di rete data dal campo \var{s\_net}, che può assumere il valore \const{AT\_ANYNET}, che indica una rete genrica e vale anche per indicare la rete su cui si è, il singolo nodo è indicato da \var{s\_node}, e @@ -619,18 +628,14 @@ pu corrente, ed il valore \const{ATADDR\_BCAST} che indica tutti i nodi della rete. - - - - -\subsection{La struttura degli indirizzi DECnet} -\label{sec:sock_sa_decnet} - -I socket di tipo \const{PF\_DECnet} usano il protocollo DECnet, usato dai VAX -Digital sotto VMS quando ancora il TCP/IP non era diventato lo standard di -fatto. Il protocollo è un protocollo chiuso, ed il suo uso attuale è di -compatibilità con macchine che stanno comunque scomparendo. Lo si riporta solo -come esempio +%% \subsection{La struttura degli indirizzi DECnet} +%% \label{sec:sock_sa_decnet} + +%% I socket di tipo \const{PF\_DECnet} usano il protocollo DECnet, usato dai VAX +%% Digital sotto VMS quando ancora il TCP/IP non era diventato lo standard di +%% fatto. Il protocollo è un protocollo chiuso, ed il suo uso attuale è limitato +%% alla comunicazione con macchine che stanno comunque scomparendo. Lo si riporta +%% solo come esempio -- 2.30.2