[successivo] [precedente] [inizio] [fine] [indice generale]


Capitolo 1.   Il software di rete

La programmazione di rete si occupa della realizzazione di programmi che vengono eseguiti su macchine diverse e devono comunicare attraverso la rete.

Il problema può quindi essere visto come la generalizzazione di quello della comunicazione tra processi (IPC Inter Process Comunication) in cui i processi sono eseguiti su una stessa macchina.

1.1   Tipi di applicazioni di rete

Esistono vari modelli di architettura per le applicazioni di rete; i più importanti sono:

Il modello a tre livelli è molto interessante ma in un contesto diverso da quello preso in esame in queste dispense e cioè nel campo della realizzazione di applicazioni basate sul Web; quindi non viene approfondito in questa sede.

Il modello paritetico ha acquisito importanza e notorietà grazie alla diffusione dei servizi di condivisione di file tra nodi paritetici in Internet.

Il modello più importante in ambito GNU/Linux e, storicamente in Unix, è però quello cliente/ servente sul quale si sofferma in modo particolare il presente documento.

Lo scenario considerato è quello di comunicazioni in rete basate su protocolli orientati alla connessione (TCP) dove un cliente invia richieste di connessione a un servente che è in attesa di tali richieste.

Comunque anche le comunicazioni basate su protocolli non orientati alla connessione (UDP) vengono esaminati anche se più brevemente.

1.2   Richiami sulle connessioni TCP

Questo paragrafo contiene una breve illustrazione del funzionamento del protocollo TCP, in particolare riguardo i meccanismi di attivazione e rilascio di una connessione.

La trattazione non ha la minima pretesa di essere esaustiva; per conoscere più in profondità questo argomento, e in generale tutto ciò che riguarda il software di rete, si consiglia la consultazione di testi specializzati come «Reti di calcolatori» di A.S. Tanenbaum.

1.2.1   Il segmento TCP

Nella figura 1.1 è riportato il formato del segmento TCP.

Figura 1.1

figure/progr-socket-figura-tcp1

Segue una breve descrizione delle funzioni dei vari campi:

1.2.2   Attivazione della connessione TCP

La connessione TCP tra due nodi di rete viene attivata con il meccanismo TWH (Three Way Handshake).

Uno dei due nodi, il servente, esegue le funzioni listen() e accept() e rimane in attesa di una richiesta di connessione su una certa porta; l'altro nodo, il cliente, esegue la funzione connect() indicando l'indirizzo IP e la porta del servente.

Questo causa l'invio di un segmento TCP col bit SYN a uno, il bit ACK a zero e un numero di sequenza creato al momento con un meccanismo basato sul clock di sistema.

All'arrivo di tale segmento l'entità a livello di transporto del servente controlla se c'è un processo in ascolto sulla porta specificata:

Se anche quest'ultimo accetta la connessione invia una risposta con bit ACK a uno al servente e l'attivazione si conclude con successo; da questo momento i due nodi possono iniziare a scambiarsi segmenti dati.

Nella figura 1.2 è schematizzato il meccanismo di attivazione di una connessione TCP.

Figura 1.2

figure/progr-socket-figura-tcp2

1.2.3   Rilascio della connessione TCP

Per il rilascio, la connessione, che è full-duplex, viene considerata come una coppia di connessioni simplex indipendenti.

Il meccanismo (stavolta a «quattro vie») è il seguente:

Anche in questo caso i passi del procedimento possono diventare tre se il secondo nodo invia in un solo segmento l'ACK e il suo FIN al primo nodo.

Nella figura 1.3 è schematizzato il meccanismo di rilascio di una connessione TCP.

Figura 1.3

figure/progr-socket-figura-tcp3

Per evitare il problema noto in letteratura tecnica come «problema dei 2 eserciti» vengono usati dei contatori di tempo.

Il problema dei due eserciti consiste in due eserciti alleati che devono attaccare insieme, pena la sconfitta, un esercito nemico e quindi devono sincronizzare le proprie azioni con l'invio di messaggeri che però possono essere catturati o uccisi; è una situazione molto simile a quella dei due nodi di rete che devono sincronizzarsi per rilasciare la connessione correttamente e si inviano dei messaggi che possono andare persi.

Il problema, che non ha una soluzione teoricamente perfetta, viene affrontato, in modo comunque efficace nella pratica con l'uso di temporizzatori: se una risposta a un FIN non arriva entro un certo tempo, il mittente del FIN chiude la connessione; l'altro nodo va in timeout perché si accorge che nessuno sembra ascoltarlo più.

1.3   Tipologie di serventi

I processi serventi in rete possono essere di due tipi diversi:

1.4   Comunicazione tra processi in rete

Le interfacce software o API (Application Program Interface) di comunicazione più utilizzate fra processi in rete, sono:

Entrambe sono definite per il linguaggio C e fra le due la API basata sui socket è senz'altro la più usabile e flessibile e quindi la più diffusa; essa è stata introdotta nel 1982 in Unix BSD 4.1c ed è rimasta sostanzialmente invariata.

I socket vengano usati per la comunicazione di rete in molti sistemi operativi, compresi Unix e GNU/Linux e possono essere utilizzati anche per far comunicare processi in esecuzione sulla stessa macchina.

La flessibilità dei socket permette di usarli a fronte di stili di comunicazione diversi: ad esempio nel caso di invio dei dati come flusso di byte o suddivisi in pacchetti, di comunicazioni affidabili o non affidabili, di comunicazioni punto a punto o broadcast e altro ancora.

Nel caso di comunicazione in rete i socket possono essere usati con protocolli diversi; come già detto però in queste dispense si fa riferimento unicamente all'uso dei socket con l'architettura TCP/IP (protocolli TCP e UDP).


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome il_software_di_rete.html

[successivo] [precedente] [inizio] [fine] [indice generale]

Valid ISO-HTML!

CSS validator!