MODELLI
I sistemi distribuiti sono sistemi nati dallesigenza di soddisfare richieste distribuite con accessi eterogenei. Questi sistemi
devono offrire caratteristiche solide di:
Accessibilit e condivisione di risorse
Affidabilit (dependability) per la tolleranza ai guasti.
o La dependability comunque un attributo generico derivato dalla sintesi dei seguenti attributi di sistema:
Affidabilit (Reliability): capacit del sistema di funzionare ininterrottamente senza guasti.
Manutenibilit (Maintainability): tendenza del sistema a poter essere riparato;
Disponibilit (Availability): capacit del sistema di continuare a funzionare correttamente anche in
presenza di guasti. ( correlata con affidabilit e manutentibilit).
Performanza (Performability): capacit del sistema di offrire i servizi nei tempi prefissati;
Incolumit (Safety): Capacit di non arrecare danni a cose, persone ed ambiente.
Sicurezza (Security) capacit del sistema di fornire confidenzialit (impedire la fuga di informazioni
riservate permettendo accessi solo ad utenti autorizzati) ed integrit (accesso e modifica ai dati da
parte degli utenti esclusivamente nelle modalit previste).
o Le minacce che possono violare la dependability di un sistema sono classificate in: guasti, errori, disastri
(naturali), attacchi (Intrusioni informatiche, vandalismo...)
Uniformit in crescita e Scalabilit: indipendenza in prestazioni dal numero di nodi nel sistema.
o La scalabilit un fattore che in ogni caso non pu essere infinito. Infatti la scalabilit di un sistema si misura
sempre allinterno di un range prefissato che ne assicura luniformit in prestazioni.
Apertura (openness): capacit di evolvere e operare seguendo naturali evoluzioni di specifiche.
Architetture MIMD (Multiple Instruction Multiple Data) un'architettura hardware parallela in cui diverse unit effettuano
diverse elaborazioni su dati diversi con comunicazione attraverso memoria condivisa.
Architetture Software
Per una applicazione distribuita: Analisi, sviluppo tramite algoritmo e
sua codifica in linguaggi di programmazione.
Mapping: Configurazione per larchitettura di destinazione del sistema e
gestione dellallocazione delle risorse.
Binding: il processo tramite cui viene effettuato il collegamento fra
una entit logiche e entit fisiche (o di sistema). Questo processo pu
avvenire in modo STATICO (collegato allinizio e utilizzato) o DINAMICO
(collegamento effettuato solo al momento del bisogno)
Per i sistemi operativi esiste uno standard per le funzioni di accesso
(API) e un modello architetturale.
UNIX: Sistema operativo concentrato che fornisce un modello di
conformit per laccesso ai file, la concorrenza e la comunicazione con
primitive di sistema (kernel) invocabili da diversi ambienti. In tutto questo importante che si stabiliscano degli STANDARD
(anche di fatto) affinch tutti i sistemi siano uniformi e possano facilmente interagire.
Modello dei processi
Processo autocontenuto che contiene
tutto ci che serve alla sua esecuzione.
Non esiste condivisione di dati o variabili
tra diversi processi. Esso contiene uno
spazio di indirizzamento e uno spazio di
esecuzione: parte di supporto per
linterazione con il sistema operativo e
per la comunicazione.
I processi pesanti richiedono molte
risorse (es in UNIX). Il cambiamento di contesto (passaggio da
un processo allaltro) unoperazione molto pesante con
overhead soprattutto per la parte di sistema.
Modello Publish/Subscribe
Modello molti a molti. In caso di iniziativa mista, e necessario che
gli interessati manifestino interesse alle informazioni attraverso una
registrazione (subscribe) e poi si ricevono tutte le informazioni
generate (publish).
Rappresenta un modello push a tre untit:
1. Gli utenti (subscriber o consumatori) che si registrano
come interesse (subscribe).
2. Un gestore (servitore di notifica) che registra gli interessi,
riceve la notizia degli eventi generati e notifica ai consumatori
sottoscrittori.
3. I produttori che generano gli eventi e fanno publish.
Modello ad eventi
Il modello ad eventi asincrono e fortemente disaccoppiato: prevede di avere molti produttori, molti consumatori, e ad
assumere lesistenza di un supporto. In questo modo si gestisce linvio di messaggi disaccoppiando gli interessati.
I produttori segnalano.
I consumatori ricevono dopo sottoscrizione (pub/sub),
il gestore degli eventi segnala loccorrenza degli eventi e i relativi messaggi agli interessati sottoscrittori (push dei
messaggi).
Confronto C/S con Scambio di messaggi
Client/Server
o Modello a accoppiamento forte (strong coupling) che implica la compresenza di entrambe le entit
interagenti.
o Meccanismo molto adatto per comunicazioni di alto livello e semplici per uso applicativo e utente.
o Non cos flessibili per situazioni diverse e specifiche (impossibilit di MX e BX)
Visibilit
Nella comunicazione importante se si possa essere in visibilit di tutti i potenziali partecipanti (scalabilit).
Modelli locali(o ristretti) prevedono limiti alla interazione
o Operazioni Scalabili poco dipendenti dal diametro del sistema
Modelli globali Non impongono restrizioni alle interazioni
o Operazioni non scalabili dipendenti dal diametro del sistema
Si va verso la localit, vincoli, domini per ottenere scalabilit.
Stato
In una interazione C/S un aspetto centrale lo stato delle richieste contro lautocontenimento delle richieste. Lo stato
dellinterazione viene usualmente memorizzato nel Server che pu essere
Stateless non tiene traccia dello stato: ogni messaggio completamente indipendente dagli altri e autocontenuto.
o pi leggero e pi affidabile in presenza di malfunzionamenti (soprattutto causati dalla rete)
o Fornisce API pi complete e complesse perch, essendo i messaggi auto contenuti, c bisogno di essere pi
specifici
o Porta ad un progetto del cliente pi complesso ma semplificano il progetto del Server
o Una interazione stateless sensata e possibile SOLO se il protocollo progettato per operazioni
idempotenti: operazioni che tendono a produrre lo stesso risultato anche se ripetute (a meno che non cambi
lo stato del server stesso)
Stateful si mantiene lo stato dellinterazione tra chi interagisce un messaggio con loperazione conseguente pu
dipendere da quelli precedenti
o Garantisce efficienza: dimensioni messaggi pi contenute e migliore velocit di risposta del Server
o API pi semplici
o Un Server stateful deve sicuramente presentare un impegno di risorse ulteriore per identificare la sessione
del Client e tenerne traccia per le interazioni future.
o Il vantaggio di avere minore costo delle operazioni in termini di banda impegnata, sicurezza e garanzie di
ripristino in caso di problemi dei clienti.
o Lo stato si distingue in:
Stato permanente mantenuto per sempre
Stato soft o a tempo
Progetto del Servitore
Modelli di servizio
Servitore con stato interazione il servitore tiene traccia dellinterazione con i clienti
Servitore senza stato interazione il servitore dimentica le richieste appena le ha eseguite
Servitore con connessione le richieste arrivano in ordine di emissione del cliente
Servitore senza connessione ogni richiesta arriva in modo indipendente (senza ordine)
Schema in cui i servizi sono forniti dal coordinamento di pi servitori detti agenti che forniscono un servizio globale unico. Gli
agenti forniscono il servizio coordinato e possono partizionare le capacit di servizio o replicare le funzionalit del servizio,
tutto in modo trasparente al cliente.
Vi possono esser anche modelli a livelli multipli per la divisione dei compiti:
Clienti che interagiscono con Agenti
Agenti, anche paralleli, capaci di coordinarsi
Server di operazione paralleli, replicati e coordinati
Con necessit di protocolli di coordinamento, sincronizzazione, rilevazione e tolleranza ai guasti.
Sistemi di Nomi
Nella relazione C/S, il cliente deve riferire il servitore. Questo reso possibile dal nome del servitore nel cliente. I clienti
possono usare molte forme di nomi diversi:
nomeGestore.nomeServizio
123:123456 (non trasparente)
nomeServizio
stampa (trasparente) (binding dinamico)
Esistono nomi Trasparenti e Non Trasparenti alla allocazione. La trasparenza non lega il nome a dettagli di basso livello.
I nomi, ossia i riferimenti ad altre entit, sono distribuiti nel codice dei clienti, degli utilizzatori, delle librerie ecc. e se ne deve
garantire la consistenza.
Per la risoluzione dei riferimenti e la qualifica dei nomi si effettua unoperazione di binding:
Statico i riferimenti sono risolti prima dellesecuzione.
o Tipico di sistemi concentrati, si risolve tutto staticamente e non si necessita di un servizio di nomi
considerata linvarianza dei nomi e della allocazione delle entit
o Non consentito cambiare alcuna allocazione (problemi)
Dinamico i riferimenti sono risolti solo al momento del bisogno e durante lesecuzione.
o Tipico in sistemi distribuiti in cui le risorse sono dinamiche e non prevedibili staticamente.
o I sistemi di nomi sono presenti durante lesecuzione per effettuare il binding.
o Le entit non sono staticamente fissate
o Nasce la necessit di un servizio di nomi (name server -> Agente) che mantiene e risolve i nomi e che
fornisce il servizio durante la esecuzione coordinandosi con i gestori della allocazione
o Tipicamente si usano delle tabelle di allocazione controllare da opportuni gestori di nomi
I nomi possono essere a loro volta non trasparenti (dipendenti dalla locazione) o trasparenti (non dipendenti dalla locazione).
I nomi trasparenti permettono ad un entit di cambiare allocazione senza cambiare nome.
In sistemi aperti tipicamente si devono introdurre molteplici gestori di nomi distinti e coordinarne lesecuzione.
Partizionamento dei gestori ciascuno responsabile di una sola parte dei riferimenti e localit.
Replicazione dei gestori ciascuno responsabile con altri di una parte (partizione) dei riferimenti e coordinamento.
I gestori sono spesso organizzati a livelli: un gestore generale che coordina gestori di pi basso livello in molti livelli con localit
di informazioni. Questo li rende pi efficienti per la localit e meno efficienti per sistemi pi lontani ma un prezzo che si
disposti a pagare a vantaggio dellefficienza dellintero sistema.
Es. deis33.deis.unibo.it
Riferisce ad un dominio nazionale italiano. a 4 livelli. Il numero di livelli dinamico (non standardizzato).
Ogni nome permette dei mappaggi logici propri. I singoli nomi sono case sensitive e al massimo 63 caratteri per dominio.
Nome completo massimo 255 caratteri. I domini sono del tutto logici e non sono collegati in nessun modo alle reti fisiche o
alle organizzazioni di rete. Ogni dominio pu essere usato in modo relativo o assoluto. Ogni dominio relativo fa riferimento al
dominio che lo contiene.
Architettura del DNS
Ogni nome di dominio corrisponde ad un server di responsabilit. I domini sono organizzati su responsabilit primaria di un
server (detto ZONA > 1 o pi server). Ogni zona riconosce una autorit, ossia un server che fornisce le corrette
corrispondenze e garantisce caratteristiche specifiche come, ad esempio, replicazione. I diversi servitori che gestiscono domini
suddivisi on zone possono a loro volta delegare la gestione ad altri server con sottodomini e servitori sottostanti. Le richieste
sono smistate dal sistema in modo opportuno.
Ogni richiesta di utente viene fatta al servizio di nomi in modo
indiretto tramite un agente specifico (Name Resolver) per la
gestione dei nomi della localit. (Caching)
I diversi server DNS sono organizzati per ottenere diversi requisiti:
affidabilit, efficienza e localit. Ogni dominio ha un Name
Resolver e domain name server locali (un o pi in replicazione) e
usa estensivamente cache per conoscenze pregresse.
Il resolver fornisce la risposta o perch conosce gi la corrispondenza (in cache) o la trova attraverso una richiesta
C/S ad un name server.
I DNS name server sono organizzati come agenti per ottenere informazioni reciprocamente (dalla pi corretta
autorit) e poter fornire a loro volta risposte consultando le rispettive tabelle DNS
Lorganizzazione ad albero consente di muoversi tra i DNS con le richieste necessarie fino a raggiungere il dominio di
autorit.
I diversi DNS sfruttano la replicazione per fornire la risposta anche in cado di problemi (Affidabilit).
Clienti e Resolver (anche fra diversi DNS) fanno richieste usando il protocollo UDP (porte 53). In caso di messaggi troppo
lunghi (>64k) allora si usa TCP. Viene usato TCP per laggiornamento dei secondari.
Query DNS:
Ricorsiva
o Richiede al resolver (o DNS) che fornisca la risposta (chiedendo ad altri) o segnali un errore.
o Si prevede una catena di server request/reply
o Il resolver o DNS rimane impegnato fino a risposta o timeout
Iterativa
o Richiede al resolver (o DNS) che fornisca la risposta o il migliore suggerimento come riferimento al miglior
DNS server
o Si prevede una sequenza di server request/reply a server
o Risponde con un riferimento al gestore pi vicino che possa ragionevolmente rispondere
OSI
Open System Interconnection stabilisce standard di comunicazione tra sistemi aperti con lobiettivo di realizzare interoperabilit tra
sistemi eterogenei. uno standard di comitato, di gestione, non operativo: non fornisce realizzazioni. Gestione dei sistemi: definisce
come si possono controllare, coordinare, monitorare sistemi interconnessi eterogenei. Quindi non definire come avviene la
comunicazione ma come gestire il sistema interconnesso.
uno standard: organizzato a livelli precisi, ad oggetti, come scenario generale di soluzione, senza legami con le realizzazioni.
Livelli
Ci sono 7 livelli. Ogni sistema a livelli, come OSI, si basa sul principio di separazione dei compiti (delega) e della trasparenza della
realizzazione (astrazione).
SAP
Service Access Point o (N)-SAP: una interfaccia logica tra una (N-1)-entity ed una (N)-entity. Quando un livello ha bisogno di
comunicare con un altro il SAP si occupa di gestire le richieste tra i livelli. Quindi per chiedere
qualcosa ad un particolare livello si deve far riferimento alla SAP relativa al livello
corrispondente. Esempio: se voglio chiedere qualcosa al livello di trasporto (T, Layer 4) devo
chiederlo alla SAP corrispondente (T-SAP) che fornir la risposta.
Ogni SAP ha un nome unico che la identifica. Per identificare unentit (es di Layer 6) si
dovrebbero nominare tutti i SAP di ogni livello (fino all1). In questo caso ci si ferma ai nomi di
rete (Layer 3 Network). Una entit (pari) viene quindi identificato come SAP di rete e con la
sequenza di stack dei nomi delle entit per identificare il livello superiore (IP, porte, socket,
processo ecc.)
> Si specifica in modo non ambiguo ogni partecipante.
Dimostrazione del fatto che OSI non legato alle implementazioni.
Lorganizzazione a SAP completamente astratta e potrebbe essere applicata alla modellazione di sistemi molto diversi.
Comunicazione
In genere per una comunicazione si hanno un mittente, un destinatario e degli intermediari. In OSI gli intermediari sono fissi e devono
partecipare alla comunicazione intesa come risorse per mantenerla.
Standardizzazione dei messaggi -> descrizione i messaggi che permettono:
Chiedere il servizio SDU (Service Data Unit o Interface Data Unit, IDU)
Specificare il protocollo PDU (Protocol Data Unit)
Le informazioni che vanno verso il basso sono incapsulate e devono poi essere trattate
dal protocollo.
Linterfaccia con il livello sottostante IDU contiene anche la parte di specifica di
protocollo: ICI (Interface Control Information) coordina operazioni, determinando il
protocollo e definendo il PCI (Protocol Control Information).
PDU fornito dal protocollo diventa SDU (Service e Interface) per il livello sottostante.
Modalit
Connectionless: Ogni unit di dati trasferita in modo indipendente dalle altre unit ed autocontenuta (senza ordine)
Nessuna qualit di servizio. Lo scambio di informazioni tra due pari avviene senza storia e senza concetto di negoziazione.
Soluzione a basso costo
o Adatta per dati occasionali e senza qualit della comunicazione. Costo limitato ma scarse garanzie.
Connection-Oriented: Soluzione privilegiata da OSI. Si stabilisce una connessione tra entit pari che devono comunicare, con
caratteristiche della connessione negoziate nella fase iniziale. Oltre a mittente e destinatario, quindi, si interpone una terza
entit che la connessione. La comunicazione avviene tutta nellambito di una sessione di comunicazione che eretta dalla
connessione. Negoziazione iniziale per stabilire regole ben precise sulla comunicazione per la qualit.
o Comunicazione in tre fasi: Apertura, Trasferimento dati, Chiusura
o Il servizio di un livello deve fornire anche opportune funzionalit per le tre fasi con qualit di servizio.
In OSI > Garanzia piena per la connessione: OSI garantisce che gli intermediari ci sono e ognuno di essi garantisce
banda e QoS.
o La comunicazione pu avere luogo in modo bidirezionale sulla connessione.
o Su una connessione costi pi elevati ma maggiori garanzie
Primitive
Le due entit pari cooperano per implementare le funzionalit del livello cui appartengono.
Primitive base: DATA per trasmettere contenuto, CONNECT, DISCONNECT per aprire e chiudere una connessione.
Quattro possibili forme per una primitiva:
1. Request il service user richiede un servizio (una azione)
2. Indication il service provider indica al service user che stato richiesto un servizio (segnalazione di evento)
3. Response il service user specifica la risposta alla richiesta di servizio (una azione)
4. Confirm il service provider segnala la risposta alla richiesta di servizio (segnalazione di evento)
Asincrona Bloccante:
Mittente invia con una Request, arriva al destinatario con
una Indication per c un blocco locale di Confirm che dice
che le cose sono state spedite dallaltra parte.
Tipica sequenza con connessione:
o CONNECT apertura della connessione con negoziazione (tipicamente sincrona, tutte e 4 le forme)
o molte DATA invio dati
o DATA.request - Invio dati
o DATA.indication - Segnala dati con la qualit della connessione
o DISCONNECT chiusura della connessione
OSI tipicamente con QoS e impegno intermedi
TCP/IP solo best effort e impegno solo endpoint
Servizio confermato
(sincrono)
Servizio non confermato
(asincrono)
Servizio non confermato
(asincrono)
Servizio non confermato
(asincrono)
Indirizzo del chiamante e del chiamato, opzione per luso di dati privilegiati, qualit
di servizio e dati dutente (4 primitive)
Dati di utente (normali).
Dati di utente. Dati che devono essere consegnati in modo preferenziale (urgenti).
Ragione della terminazione, Dati di utente.
Mittente
S-CONNECT
S-DATA
SYNC ->
Ricevente
Con SYNC (sincrona) se fallisce la connessione linterazione non riparte dallinizio ma da questo punto di
sincronizzazione. Richiede allaltro di ricevere tutti i dati e garantire successivamente di confermare la
S-DATA
In caso di N nodi eterogenei nel primo caso le funzioni di conversione sono N*(N-1) nel secondo sono N verso ed N per il formato
comune. Si usa sempre e solo la seconda. Solo trasformazioni dallo standard definito al nodo e viceversa. Differenza: Invece di una
trasformazione se ne fanno due. In questo modo, ogni nodo, conosce solo la sua trasformazione e quella standard e questo facilita
anche laggiunta di altri nodi nel sistema. Per scalabilit.
Dati e Formati
Tipicamente in una comunicazione vengono scambiati dati. La comunicazione pu introdurre errori e corrompere un dato inviato.
Vengono introdotte delle ridondanze per verificare che il dato ricevuto non sia stato corrotto. Quindi si possono inviare informazioni
aggiuntive (descrizioni) che qualificano il dato inviato -> Impegno di banda maggiore per avere affidabilit.
Per il formato dei dati ci sono due tipi di approccio utilizzabili:
Statico: i due nodi che comunicano hanno gi scritto al loro interno il tipo di dati che verranno scambiati.
Buono per sistemi piccoli. Tempo di vita breve.
Dinamico: Trasferimento di informazioni sul tipo di dati non note a tempo di progetto. Accordo da stabilire durante
lesecuzione. OSI descrive anche come (fasi) deve avvenire laccordo (descrizione astratta dellaccordo). Astratta perch
vengono descritti i dati in modo astratto.
Indicato per sistemi grandi e eterogenei. Tempo di vita lungo.
Protocolli di Negoziazione
Protocolli multifase -> numero di informazioni scambiate molto maggiore rispetto ad una interazione cliente/servitore.
BIDDING (asta, offerta) (Contract Net) tra sender e receiver si prevedono molte fasi (almeno 5 anche ripetute).
stato definito per il settore dellIA, di livello applicativo, molto costoso, usato per sistemi ampi in cui si vuole raggiungere una risorsa
che pu essere offerta da pi contraenti nel sistema.
1. Sender fa un broadcast della propria esigenza (ANNOUNCE)
2. Receiver fanno un'offerta (BID). Contiene anche QoS.
3. Sender sceglie tra i bid dei receiver. (AWARD). Manda un messaggio al contraente.
4. Receiver accoglie l'ok definitivo (contract).
5. Accordo
Se il receiver occupato: alla fase 4, il receiver pu rifiutare e si riparte da 3 (o da 1). Soluzione molto flessibile ma costosa e non
ottimale. Nel distribuito non ottimo perch si potrebbe mancare unofferta migliore (che viene dopo ad esempio).
BER e ASN.1
OSI per il livello di presentazione definisce due standard:
Un linguaggio astratto di specifica (parte astratta accordo)
o ASN.1 (Abstract Syntax Notation)
Linguaggio usato in modo astratto per descrivere le funzioni di
accordo fra entit che non si sono accordate in modo statico.
Non descrive solo i dati ma anche possibile descrivere in modo
non ambiguo le informazioni che servono per stabilire il contesto,
il soggetto, la semantica di comunicazione.
Usato raramente (in caso di bisogno) in casi in cui deve essere
fatto un accordo in modo dinamico.
Si pu descrivere, e quindi comunicare, anche del codice.
Reti e Routing
Reti
Le reti permettono ed attuano le interconnessione tra i diversi sistemi di calcolo. Le reti sono il mezzo di interconnessione punto a
punto o via comunicazioni globali che coordinano molte entit.
La rete misurata dal costo, velocit ed affidabilit di invio dei messaggi, nellintero percorso da dove provengono a dove devono
essere consegnati.
Le reti si possono misurare in molti modi e secondo molte metriche.
Le reti come mezzo di interconnessione punto a punto o via interconnessioni di molte entit (es multicast e broadcast)
Parametri:
Tempo di latenza (tempo di ritardo sulla comunicazione)
Banda (quantit di dati trasmessi per unit di tempo)
Connettivit (tipo di interconnessione e topologia)
Costo apparati
Reliability (affidabilit) (percorsi ridondanti)
Funzionalit (ad esempio, attraverso operazioni sui messaggi come combinazione e frammentazione dei messaggi e
ricomposizione)
Topologie
Le reti possono adottare molte topologie, o statiche (reti dirette) o dinamiche (reti indirette).
Le reti dirette statiche prevedono architetture non variabili, fissate, definite, e regolari di interconnessione.
Bus: (ethernet CSMA/CD) tutti trasmettono nello stesso
canale comune. Problema: molto traffico -> Molte
collisioni -> Operativit limitata.
Bus (dinamico): interconnessione di tutti i nodi
attraverso un unico mezzo di interconnessione -> bus
dinamico unico. Va usato bene in accesso considerato
che il mezzo condiviso. Se un nodo sta comunicando
gli altri attendono.
Mesh: Ogni nodo ha un numero di vicini. Le connessioni
verso un altro nodo sono molteplici -> in caso di guasto
posso comunque comunicare.
Queste topologie vengono realizzate in reti relativamente piccole per ottenere qualit di servizio.
Ipercubo una topologia regolare che prevede un grado di connettivit crescente.
Molte architetture parallele usano questa topologia
perch consente di avere tempi di latenza molto bassi visto che il numero di link per
nodo abbastanza elevato. In un ipercubo di dimensione 4 ogni nodo ha 4 link per
comunicare con gli altri nodi -> il numero di link pari alla dimensione del cubo ->
Problema del Costo di interconnessione.
Interconnessione Completa: interconnettere tutti con tutti. Con n elementi, n^2 connessioni con il costo conseguente di una serie di
switch hardware.
Switching
Linterconnessione di diverse entit deve ottimizzare luso delle risorse e metterle a disposizione in modo dinamico di chi manifesta la
necessit di uso. Lo switching permette di dedicare le risorse a pi richieste in tempi diversi e non mantenerle allocate ad un unico
obiettivo di connessione. Lo switching permette di prevedere un impegno anche condiviso delle risorse per consentire di passare i dati
in caso di nodi non in visibilit in modi diversi. Nel caso di messaggi diversi, possono essere frammentati in pezzi corti che possono
viaggiare insieme su tratte di reti disponibili.
Nelle reti si fa Switch di Pacchetto che pu avvenire attraverso canali creati dinamicamente (circuiti virtuali) cio risorse dedicate nei
nodi intermedi o essere del tutto libero senza stabilire connessioni di alcun tipo (usando frammentazione in datagrammi)
Reti Omega Reti basate su una sequenza di switch binari che, con un costo pi basso, permettono di ottenere lo stesso effetto di una
matrice di switch. Reti a stage che interconnettono p elementi, con log2(p) stage; ogni stage ha p input e p output.
Comandando gli stage composti da switch binari, si ottengono dinamicamente le potenziali interconnessioni desiderate
Switch di Circuito Ossia avere canali dedicati (o connessioni statiche) predeterminati e mantenuti anche se non usati -> A priori,
staticamente, conosco il cammino che congiunge mittente e destinatario di una comunicazione. Questo modo di lavorare non mai
utilizzato in internet, ma in OSI s, dove bisogna garantire ad esempio la banda durante il cammino -> Qualit.
Molto spesso vengono realizzati circuiti virtuali. Permettono la condivisione delle risorse per ottenere un migliore uso del sistema di
comunicazione.
Sia circuiti dedicati che virtuali non sono attuabili in TCP/IP -> solo switch di datagrammi
Switch di datagrammi Nessun circuito o canale, ma solo datagrammi, unit di trasmissione, che possono essere mandate tra nodi vicini
(politica ottimista) mirando ad ottenere il migliore uso del sistema di comunicazione
Comunicazione a datagrammi (tecnica ottimista): Con i datagrammi, non si garantisce nessuna connessione end-to-end, e quindi nessun
controllo flusso, nessuna garanzia (no ordine, no QoS). Ogni entit da inviare (datagramma) porta indirizzo del ricevente e viene
smistato in modo indipendente; si possono introdurre molti ritardi e jitter. Congestione -> si lavora male.
Controllo delle reti Se dobbiamo gestire connessioni abbiamo necessit di operazioni per preparare la comunicazione (stabilire la
connessione), mantenerla e garantirla, e chiuderla al termine.
Possibilit di Segnalazione (o Controllo)
I dati e/o i controlli, allinterno del mezzo, possono essere trasmessi:
in-band: usando gli stessi cammini e risorse per i dati
out-of-band: cammini separati per il controllo e il signaling
Ci sono diversi livelli di comunicazione:
Piano User (protocolli utente) (in-band)
o Livello applicativo
Piano di Controllo (controllo connessione) (out-of-band)
o Controlla come va la connessione ed eventualmente la migliora in termini di qualit
Piano di Management (stabilire e gestire il canale) (out-of-band)
o Stabilisce la connessione. Allocazione e deallocazione delle risorse per ottenere un servizio.
Controllo e management sono necessari entrambi per ottenere qualit. Internet usa solo il piano utente (controllo in banda ->
intrusione).
Reti
Spesso i sistemi di interesse sono costituiti da reti molto differenziate ossia reti destinate a interconnettere entit geograficamente
molto eterogenee
Wide Area Network WAN per reti geografiche anche a copertura molto ampia (globale)
o Si trovano in mesh, reti magliate e ridondate, come nel sistema telefonico, Public Switch Telephone Network (PSTN)
Controllo daccesso
Tipici controlli di accesso sono (standard IEEE 802.x):
CSMA/CD (Ethernet), standard 802.3
Carrier Sense Multiple Access/Collision Detection. Accesso ottimistico, reattivo, dinamico al bus, in caso di impegno si deve
avvertire la collisione e ritrasmettere con intervallo random.
Token (control token o token ring), standard 802.5
Accesso pessimistico garantito da un ring in modo statico: in un anello un solo possessore del token ha il diritto di trasmettere;
si forza il passaggio del token da un vicino ad un altro dopo un intervallo.
Slotted ring (anello a slot), standard 802.4
Accesso pessimistico usando messaggi che circolano in modo proattivo sul ring; anello come insieme di contenitori di
messaggi circolanti (o slot) che possono essere riempiti se vuoti.
Interconnessione tra reti
Possiamo avere molti apparati per interconnettere e/o separare entit a diversi livelli OSI
Ripetitori: rigeneratori di un segnale a livello fisico, superando e rimediando ad uneventuale livello di attenuazione. Un
ripetitore non effettua alcuna separazione. (livello fisico - 1)
Bridge: apparati che collegano reti diverse, con capacit di separazione e maggiore intelligenza (livello data link - 2)
Router (o gateway): apparati e sistemi per il passaggio da una rete ad un'altra con obiettivo di supportare la comunicazione dei
messaggi ed il routing (livello network - 3)
Protocol converter: sistemi che collegano reti diverse a pi alto livello con protocolli diversi di interconnessione (dal livello di
trasporto in su)
Strategie di Routing
Per la classificazione si possono considerare molteplici attributi e ruoli
1. Chi prende le decisioni di routing
2. Chi attua le decisioni di routing
3. Il momento delle decisioni di routing
4. Il controllo del routing adattativo
1. Chi prende le decisioni di routing
Sulle strategie di routing, le decisioni prese da diverse entit
Sorgente (source route) Il mittente specifica l'intero cammino (in modo stretto e completo o solo parzialmente); gli altri
devono rispettare la decisione (statica per il datagramma).
Hop-by-hop
Ogni nodo ha uno scope di decisione e decide lui il prossimo hop. Decisione e strategia distribuita.
La decisione non viene guidata dal mittente, ma decisa ad ogni passo e ad ogni intermedio in modo indipendente il sorgente
non conosce il cammino e neanche gli intermedi che comandano solo la propria uscita.
Potrebbero non raggiungere tutti i nodi. Tabelle locali.
Broadcast
Si invia ad ogni possibile entit ricevente il messaggio ed ognuno lo riceve (costoso): non ci sono decisioni per il mittente ma
consegna a tutti (eliminando duplicati). Applicabile in sistemi molto limitati.
2. Chi attua le decisioni di routing
Sulla attuazione delle decisioni di routing, dobbiamo considerare il ruolo dei router intermedi che provvedono funzionalit opportune
Le decisioni possono essere attuate da agenti intermedi.
Unici e centralizzati (usato raramente) Un unico gestore del routing prende le decisioni: questo consente di ottenere anche
decisioni ottimali sullintero sistema. Per sistemi piccoli o in aree limitate.
Distribuiti Non esiste un unico luogo di controllo ma una serie di entit distribuite nellintero sistema e che si occupano del
routing, in modo pi o meno coordinato.
3. Il momento delle decisioni di routing
Per laspetto di tempo delle decisioni di routing, si considera routing:
Statico (fisso o deterministico) La strategia di routing rimane fissata nel sistema e non cambia.
Dinamico (adattativo) Lalgoritmo di routing evolve e si pu adattare alle informazioni di stato del sistema, in modo da
ottenere un costante adattamento alla situazione corrente. Supera problemi e guasti non previsti ad esempio.
4. Controllo routing adattativo In caso di adattivit, si deve prevedere una costante interazione con le risorse impegnate
Dal punto di vista della comunicazione, possiamo
avere Switching di Pacchetto (Internet) o uso di
Circuit Switch ossia canali predeterminati.
La scelta del cammino tra quelli possibili in modo
fissato o meno, adattandosi o meno allo stato del
sistema. Si noti che normalmente si considerano solo
cammini minimi (ottimi). In alcuni casi si possono
anche prevedere cammini non minimi facendo
misrouting (capacit di scegliere una strada diversa se
quella ottima non rispetta pi alcune caratteristiche di qualit o congestionata ad esempio).
Livello Network
Indirizzi IP
Sistema di nomi Internet (IPv4), parole di 4 byte (32 bit), diviso in due parti (parte di rete e parte di host). In Internet se si cambia rete si
cambia IP (cambiando la parte di rete) -> Tipici della rete in cui ci si trova.
I nomi di IP sono dati di autorit dal Network Information Center (NIC) che assegna i numeri di rete, cio informazione usata nei
gateway per routing. La parte di rete quindi assegnata di autorit.
La parte di nodo in IP soggetta a 3 classi primarie (in base al numero di reti e al numero di host collegabili) e differisce per numero
di bit delle singole parti: analizzando un indirizzo IP si pu distinguere la classe in modo automatico.
Datagrammi
Un Datagramma IP la unit base di informazione che viaggia in Internet. Contiene una parte di intestazione (di protocollo) e una
parte di dati.
Protocollo IP
I datagrammi viaggiano in modo indipendente e autonomo (anche come sottoparti o frammenti).
IP un protocollo best-effort a basso costo e non garantisce Quality of Service QoS n ordine.
Il protocollo IPv4 prescrive come si deve realmente implementare linstradamento dei datagrammi, obiettivo fondamentale del livello
Il protocollo prescrive per ogni nodo che deve comportarsi come un router, ossia fare routing, due funzioni principali da svolgere
Elaborazione del messaggio del livello superiore nel formato per la trasmissione
o Incapsulamento / Frammentazione. Il datagramma deve contenere le informazioni di livello superiore,
eventualmente i dati devono essere frammentati (se possibile)
Instradamento (routing) cio:
o Traduzione da indirizzo logico IP a indirizzo fisico di frame (ARP) (MAC)
o Scelta della porta di uscita (in base al percorso)
Invio di un datagramma IP
Un datagramma deve essere smistato da un nodo ad un nodo successivo secondo le normali regole di incapsulamento.
Ogni nodo deve incapsulare ogni datagramma in un frame di livello data link (livello 2) (aggiunge indirizzi di livello 2 MAC al
datagramma). Ovviamente questo avviene anche per ogni singolo datagramma, e senza legami tra i diversi frammenti e datagrammi,
che vengono trattati in modo indipendente dalla driver di routing (FIFO).
Ogni intermediario pu operare sul messaggio, a partire dal mittente. Ogni nodo pu frammentare il datagramma (decomposizione al
mittente, decomposizione ad ogni intermediario, ricomposizione solo al destinatario).
Frammentazione Datagramma IP
I datagrammi devono essere incapsulati nei frame di livello data link su cui transitano in base alla MTU (maximum transfer unit), ossia
la lunghezza massima dei frame a livello fisico (di Internet cio 2 OSI). Per determinare la dimensione massima del datagramma:
1. Calcolo statico da parte del mittente
2. Decisione passo passo (quella usata)
MTU scelta indipendente dalle tecnologie sottostanti per rendere efficiente la comunicazione a livello utente (fissata
tipicamente a 64Kb)
Il destinatario, unico che ricompone il datagramma, riceve diversi frammenti, li identifica in base allo stesso ID e li mette insieme in
base alloffset: se lintero datagramma stato ricevuto allora viene considerato, altrimenti viene eliminato.
1.
2.
3.
4.
Se un link cade, e da una parte c una rete magliata, in questa rete iniziano a essere scambiate offerte che possono
essere accettate (erroneamente) e ci prosegue allinfinito.
Problema generale dovuto al non tenere traccia di chi fornisce una distanza da un nodo (e cammino relativo) che
rende possibile utilizzare lofferta anche se non rilevante o affidabile.
In un primo momento stato risolto limitando il numero di passi a 16.
Strategie migliorative
Split Horizon: per evitare di passare informazioni sbagliate, non si offrono cammini ai nodi da cui le abbiamo
ottenute (necessarie maggiori informazioni) -> non si propaga solo la distanza ma anche chi lha fornita. Problemi con
reti magliate.
Hold-Down: stabilisce un protocollo pi coordinato quando c una variazione. Dopo una notifica di un problema, si
ignorano le informazioni di cammino per un certo intervallo: tutti hanno modo di accorgersi del problema e non ci
sono propagazioni errate.
Split Horizon con poisoned reverse e triggered broadcast: In caso di variazione, ogni nodo invia immediatamente un
broadcast con la indicazione del problema ed il cammino. Poco scalabile (per il broadcast -> costoso).
Routing Internet
In Internet si lavora con degli indirizzi IP che rappresentano una connessione. La connessione stata pensata per un indirizzamento
punto-punto. Internet prevede una strategia precisa per raggiungere tutti i possibili nodi che possono intervenire in una
comunicazione.
Ogni connessione appartiene ad una rete ed una sola
per connessioni punto-a-punto
Ogni connessione libera di indirizzare nella rete facendo operazioni solo locali e a basso costo
per comunicazioni punto-a-punto o broadcast
Ogni connessione pu indirizzare in Internet (in modo globale) ma deve usare opportuni intermediari
routing previsto per Internet basato su responsabili della comunicazione globale a costo pi elevato
Linsieme delle reti Internet tende a minimizzare il costo di supporto del routing.
Basata sulla separazione delle reti e sulla loro interconnessione.
RETI uniche logicamente connesse
RETI fisiche separate
Indirizzamento diretto solo nellambito di nodi della stessa rete, altrimenti si devono usare gateway, ossia nodi intermediari con
almeno due indirizzi IP, ossia connessioni su reti diverse che connettono reti diverse.
Sottoreti
Possibilit di limitare la visibilit allinterno di una rete per garantire una migliore propagazione dellinformazione.
Un nodo in una sottorete pu comunicare direttamente con ogni nodo della sottorete e non pu comunicare direttamente con nodi
di altre sottoreti. In modo operativo, ogni nodo divide il campo host in subnet+host
In reti di classe B, subnet host suddiviso in 8 bit e 8 bit
dida01 137.204.56 subnet 56
deis33 137.204.57 subnet 57
In questo modo riconosce le proprie limitazioni, usando i router anche per comunicazioni allinterno della sua rete stessa.
DALL'ESTERNO DELLA RETE -> il subnetting invisibile e non produce alcuna differenza.
Maschere (NETMASK): sono 32 bit a 1 o 0. I bit a 1 specificano la rete che si sta considerando a livello globale, quelli a 0 lasciano la
visibilit diretta allinterno della specifica rete.
NETMASK esempio maschera in classe B (per 3 byte)
11111111 11111111 11111111 0000000 o 255.255.255.000
La maschera in sostanza un insieme di bit a livello di rete che determina quali siano i limiti di comunicazione che richiedono un router
apposito per uscire FUORI dalla SOTTORETE.
In Internet si attua un Routing Gerarchico per aree distinte di gestione e con domini amministrativi diversi.
Unico protocollo di routing per area. La connessione tra le aree avviene attraverso gerarchie di router.
Distinzione tra sistemi core e noncore (ARPANET)
core insieme di gateway chiave con tabelle complete (e replicate)
non core con informazioni di routing solo parziali (e locali)
I nodi CORE si scambiano tutte le informazioni di routing (algoritmo Distance Vector e Link State)
Scalabilit? problemi aumentando il numero delle reti -> Necessit di routing con astrazione e gerarchia.
Introduzione dei sottosistemi autonomi (di livello inferiore).
Insieme di reti e gateway controllati da una autorit unica centrale, con proprie politiche di routing interne e non visibili
Alcuni gateway di controllo provvedono al protocollo verso l'esterno
o Exterior Gateway Protocol (EGP)
Protocollo del gateway di controllo per trovare il percorso fino ai core. Struttura ad albero con i core come radice
I sistemi autonomi devono scambiarsi informazioni di routing e coordinamento solo intra-sistema
o Interior Gateway Protocol (IGP)
Protocollo per trovare il percorso all'interno di un sistema autonomo (intra-sistema).
Politica che consente percorsi multipli e con possibilit di tollerare i guasti (algoritmi multipath IGRP CISCO)
Propriet Routing IP
Routing statico
tutto il traffico per una data rete stesso percorso e non eventuali percorsi alternativi (vedi problemi in caso di limiti di tempo ed
urgenze). Tabelle non cambiate troppo spesso. Non multipath in generale.
10
Autonomia
Ogni gateway autonomo: ogni datagramma da A verso B pu seguire un percorso differente rispetto a quello da B verso A i gateway
devono cooperare per garantire le due vie di comunicazione nei due sensi.
Visibilit
Solo il gateway finale comunica con il destinatario e verifica se l'host esiste ed operativo: quindi pu rimandare al mittente.
Indicazioni dei problemi di mancata consegna gli intermediari mandano il datagramma in base alla tabella corrente o alle decisioni di
routing attuali.
PERCORSO A DEFAULT
Scelta di un gateway cui inviare i messaggi se non si conosce alcuna informazione correttamente.
Indirizzamento IP cerca nella tabella locale poi invia il datagramma al gateway di default.
Strategia usata da host che servono una piccola quantit di utenti e sono collegati attraverso una sola connessione ad Internet.
PERCORSO DIRETTO AD UNO SPECIFICO HOST
Indirizzamento diretto ad un host in modo diretto e specifico, per esigenze particolari con un migliore controllo delle risorse in caso di
traffico speciale.
Algoritmo
function Route_IP_Datagram (datagram, routing_table)
Separazione indirizzo IP destinatario (Idest) datagramma
Valutazione indirizzo IP della rete di destinazione (Inet)
If
Inet un indirizzo raggiungibile direttamente
then invio diretto del datagramma sulla rete destinataria
(trasformazione indirizzo IP in indirizzo fisico e incapsulamento del datagramma in frame)
else if
Idest un host con un cammino proprio
then
invio del datagramma in base alla tabella
else if
Inet si pu ottenere da una entry nella tabella di routing (tenendo conto di subnet)
then
si invia il datagramma al prossimo gateway
else
percorso di default per tutti i restanti datagrammi
Si tiene conto della sottorete usando la maschera ed Idest. Non competenza delle tabelle -> c sempre un router di default.
11
Internet
TCP/IP
Semantiche di Comunicazione
MAY-BE (o BEST-EFFORT) Per limitare i costi ci si basa su un solo invio di ogni informazione -> il messaggio pu arrivare o meno
Internet tutto BEST-EFFORT. Rappresentato da IP in cui ogni azione fatta una volta, senza preoccuparsi di qualit, di affidabilit e di
garanzie. (UDP e IP)
AT-LEAST-ONCE Si prevedono ritrasmissioni ad intervallo. Il messaggio pu arrivare anche pi volte a causa della duplicazione dei
messaggi dovuti a ritrasmissioni da parte del mittente. Semantica adatta per azioni idempotenti in caso di insuccesso nessuna
informazione. Il Cliente di preoccupa della affidabilit.
AT-MOST-ONCE Pi invii ad intervalli e stato sul server. Cliente e Servitore lavorano in modo coordinato per ottenere garanzie di
correttezza e affidabilit. Il messaggio, se arriva, viene considerato al pi una volta. La semantica non introduce vincoli sulle azioni
applicative. (TCP)
EXACTLY-ONCE (ATOMICIT) Il messaggio arriva una volta sola oppure il messaggio o arrivato o non stato considerato da entrambi
-> Semantica molto coordinata sullo stato. Al termine i pari sanno se l'operazione stata fatta o meno. I pari lavorano entrambi per
ottenere il massimo dell'accordo e della reliability.
TUTTO o NIENTE Semantica senza durata massima. Se le cose vanno bene il messaggio arriva una volta e una volta sola viene trattato,
riconoscendo i duplicati (tutto). Se le cose vanno male il cliente e il servitore sanno se il messaggio arrivato (e considerato 1 volta sola
- tutto) o se non arrivato. Se il messaggio non arrivato a uno dei due, il tutto pu essere riportato indietro (niente). Completo
coordinamento delle azioni, ma durata delle azioni non predicibile. Se uno dei due fallisce, bisogna aspettare che abbia fatto il
recovery. Entrambi sanno realmente come andata (tutto o niente).
Azioni di Gruppo
Broadcast
NON sono consentiti broadcast a livello globale vista la dimensione del sistema -> per evitare costo inaccettabile
Broadcast permessi solo nell'ambito di una rete locale
BROADCAST limitato: Limitato perch i router non li fanno passare (rimane sulla stessa rete locale) indipendentemente dall'indirizzo
IP. Indirizzo in cui tutti i 32 bit sono a 1 (limited broadcast address). Costo basso.
BROADCAST diretto: Verso tutti gli host in una rete specifica. Indirizzo in cui tutti i bit di hostid a 1 (broadcast direttivo o directed
broadcast) trasmesso in Internet, arrivato alla destinazione, broadcast.
Multicast
Indirizzamenti multicast di Classe D. Indirizzi a cui gli host interessati si possono registrare. Tutti gli host che si sono registrati possono
ricevere messaggi e possono mandare messaggi al gruppo di multicast (vedi socket multicast). Problema -> Costo
Al contratto viene associata una durata: se durante lintervallo non si usa, il server
pu riassegnare lindirizzo. Il lease permette di confermare l'uso, senza rieseguire il
protocollo. DHCP permette lattribuzione di tutta una serie di parametri di gestione:
maschera di rete, sottorete, diritti, ecc. ecc
4 Frammentazione necessaria
5 Errore nel percorso sorgente (source route fail)
6 Rete di destinazione sconosciuta
Continuous Requests
Protocollo pi complesso rispetto al caso ARQ
Non attesa in modo sincrono della ricezione conferma (ACK) ma si mandano messaggi in modo ripetuto.
Il mittente manda messaggi che sono mantenuti fino a saturare la memoria disponibile (finestra buffer) e sono scartati solo alla
conferma. Il mittente scorre la finestra in caso di conferma (all'acknowledgement). Attesa del mittente solo a finestra piena. La
dimensione della finestra imposta dal ricevente. Variazione imposta dal ricevente (se a 0 attesa finch non si libera).
In caso di Errore:
SELECTIVE RETRANSMISSION attesa dellesito dei messaggi tenendo conto degli ack ricevuti e anche ack negativi (dovuti al time-out del
ricevente) e ritrasmissione di quelli persi.
GO-BACK-N attesa di ack e ritrasmissione (solo con time-out al mittente) e tenendo conto di ack del ricevente (che salta i non ricevuti);
il mittente scarta i messaggi successivi non in sequenza e li rimanda tutti al ricevente go-back confonde messaggi non in ordine con
perdite (TCP usa GO-BACK-N ottimizzato e ack cumulativi). Nellimplementazione TCP (nel ricevente) i messaggi gi ricevuti non
vengono sostituiti. Un ack pu confermare anche i messaggi precedenti.
Nei protocolli continuous requests, ogni direzione di trasmissione usa una finestra scorrevole (sliding window) per la gestione della
memoria di bufferizzazione. La decisione della dimensione del buffer sempre del ricevente che deve allocarla e mantenerla per i
messaggi. Gli slot non sono mai della stessa dimensione.
Header
5 parole da 32 bit (4 byte). (IP nellheader del Datagramma)
Sequence Number: Numero che indica la posizione precisa nel flusso del byte
contenuto nel segmento.
Acknowledgement Number: Indica lo stato di ricezione del mittente, quanto
stato ricevuto del flusso. Viene inviato sempre.
(Piggybacking: Sfrutta la trasmissione per fare controllo.)
Checksum: Complemento a 1 per il controllo.
HLEN: Header Length, tipicamente 5, ma che pu essere maggiore perch
possono esserci Opzioni.
Window: indicazione in byte della dimensione della finestra di ricezione.
CODE BIT (6bit a 0 o 1):
ACK: se a 1 lacknowledgement number e valido.
SYN: bit per stabilire una connessione.
FIN: bit per chiudere una connessione.
RST: Se a 1, ci sono stati problemi nella connessione (o di qualit) quindi si ristabilisce.
URG: Se a 1 indica che il flusso contiene un dato urgente e viene letto lurgent pointer. Il campo urgent pointer dice la distanza dalla
posizione corrente nel flusso. Banda di 1 byte -> pu essere sovrascritto da un URG successivo. Se viene segnalato un dato urgente da
livello applicativo sul flusso -> tutti gli header portano la segnalazione del dato urgente.
PUSH: Se a 1, il segmento viene mandato immediatamente senza bufferizzazione. Anche se in realt sono le driver a decidere.
TCP Comunicazione
TCP pu spezzare i messaggi applicativi in segmenti di dimensione variabile, e tende a frammentare messaggi in segmenti
N troppo corti: grosso overhead di trasmissione
N troppo lunghi: frammentazione a livello di IP e possibili perdite
TCP usa CONTINUOUS REQUEST per efficienza e affidabilit
I messaggi prevedono ack, che essendoci traffico nei due sensi, gli ack sono inseriti sul traffico in direzione opposta (piggybacking)
USO di finestra scorrevole, espressa in byte, determinata e decisa dal ricevente e comunicata per ogni invio di segmento.
TCP Ritrasmissione
TCP usa GO BACK-N, in caso di non ricezione di un segmento
il ricevente pu scartare quelli successivi e attendere il segmento mancante
il mittente deve rimandare i segmenti da quello che manca
reinvio anche ripetuto fino ad una eccezione (fallimento)
il ricevente deve favorire il reinvio di segmenti mancanti
In realt il ricevente ottimizza e non scarta immediatamente i segmenti fuori ordine (ma li mantiene se pu per integrarli).
DOPO quanto tempo si ritrasmette, QUANTE VOLTE si esegue le ritrasmissione, COME si frammentano i segmenti decide tutto la driver.
Il protocollo a stream pu rimandare parti del flusso ossia segmenti con dimensioni diverse senza garanzie di lunghezze predefinite o
stabili.
TCP Conferme
TCP conferma con ack cumulativi (numero di ack non uguale al numero di messaggi ricevuti)
Un ack specificato del ricevente porta l'indicazione di tutto ci che stato ricevuto nello stream fino al momento dell'ack. In caso di
perdita, si continua a mandare ack per l'ultimo ricevuto.
Socket in Java
Progetto C/S
Le socket rappresentano il terminale locale (end-point) di un canale di comunicazione bidirezionale (da e per lesterno). In Java
(standard) si risolve il problema della comunicazione tra macchine distinte, diverse e fortemente eterogenee.
Le Socket possono realizzare due tipi di comunicazione:
Con connessione, in cui viene stabilita una connessione tra Client e Server (esempio, il sistema telefonico) (socket STREAM)
o Protocollo Internet TCP
o Classe Socket, per socket lato Client
o Classe ServerSocket, per socket lato Server
Senza connessione, in cui non c connessione e i messaggi vengono recapitati uno indipendentemente dallaltro (esempio, il
sistema postale) (socket DATAGRAM)
o Protocollo Internet UDP
o Classe DatagramSocket, per socket (C/S)
Sistema di nomi
Necessit di un sistema di identificazione degli enti in gioco. Per risolvere il problema dellidentificazione reciproca dei processi (Client e
Server nella rete ad ogni processo deve essere associato un nome globale: visibile in modo univoco, non ambiguo e semplice. Questo
viene risolto dai livelli bassi di protocollo (trasposto e rete).
Un nodo identificato univocamente da:
Indirizzo IP (4 byte / 32 bit) -> livello IP (della macchina)
o Identificativo della macchina nella rete
o Esempio 137.204.57.186
Porta (numero intero di 16 bit) -> astrazione in TCP e UDP
o Porta allinterno della macchina a cui deve essere collegata la socket
o 4 cifre esadecimali XXXXh (valori tra 1 e 65535). Le prime 1024 sono riservate (well-known port)
Uso di questo NOME GLOBALE che rappresenta lend-point di un canale di comunicazione.
Per raggiungere una risorsa con NOME LOCALE: un processo (o pi) si lega a una porta per ricevere o spedire dei messaggi. In questo
modo possibile identificare un processo senza conoscere il suo PID locale.
Socket Datagram
Le socket datagram permettono a due thread diversi di scambiarsi messaggi senza stabilire una connessione tra i thread coinvolti.
Classe java.net.DatagramSocket. Modello non affidabile.
Uno dei costruttori presenta la seguente interfaccia
DatagramSocket( InetAddress localaddress, int localport) throws SocketException;
Una volta invocato il costruttore la socket pronta a realizzare uno scambio di messaggi con unaltra socket.
Lo scambio di messaggi con socket avviene tramite meccanismi primitivi di comunicazione. Su una istanza di DatagramSocket si fanno
azioni di:
Modello di comunicazione
Le socket datagram per lo scambio di messaggi devono essere state inizializzate correttamente e devono conoscersi.
Il mittente deve specificare nel messaggio un ricevente. Si devono specificare informazioni di tipo applicativo e di controllo (messaggio
e inirizzo IP e porta del destinatario). Quando il pacchetto arriva al destinatario le driver inseriscono nelle informazioni di controllo IP e
porta del mittente. Lo stesso datagramma viene usato per la richiesta e la risposta. Ovviamente nessuna garanzia di consegna con
qualit a causa del protocollo di supporto usato (UDP e IP).
Classi accessorie
DatagramPacket( byte [] buf, // array di byte dati
int offset, // indirizzo inizio
int length, // lunghezza dati
InetAddress address, int port); // numero IP e porta
Classe per preparare e usare datagrammi. Contiene una parte relativa ai dati e una relativa al controllo. Fornisce anche molte funzioni
di utilit come getPort, getData o getAddress.
Parte dati -> specifica un array di byte da/su cui scrivere e non indicazioni di comunicazione con diversi costruttori
Parte di controllo -> InetAddress e interi per la porta
InetAddress una classe che serve a rappresentare gli indirizzi IP (presenta solo metodi pubblici statici):
public static InetAddress getByName (String hostname);
fornisce un oggetto InetAddress per lhost specificato (null def. locale)
public static InetAddress[] getAllByName(String hostname);
fornisce un arra di oggetti InetAddress per pi indirizzi IP sullo stesso nome logico
public static InetAddress getLocalHost();
fornisce InetAddress per macchina locale
sock.send(DatagramPacket p) in invio bisogna preparare tutte le opportune strutture dati che servono a contenere la parte
dati del datagramma e larea relativa alle informazioni di controllo sul ricevente (fornite dal mittente del pacchetto.
sock.receive(DatagramPacket p) in ricezione si deve avere preparato tutto ci che serve a ricevere tutte le informazioni (sia
dati che controllo). Uno stesso pacchetto pu essere riutilizzato.
Esempio
Creazione socket
DatagramSocket socket = new DatagramSocket();
Parte mittente di invio...
Preparazione informazione da inviare e invio
byte[] buf = {'C','i','a','o'};
InetAddress addr = InetAddress.getByName("137.204.59.72"); int port = 1900;
DatagramPacket packet = new DatagramPacket(buf, buf.length, addr, port);
socket.send(packet); // invio immediato
In ricezione
Creazione socket
DatagramSocket socket = new DatagramSocket();
Parte ricevente di comunicazione: Preparazione, attesa, e ricezione
int recport; InetAddress recaddress; byte[] res = new byte[200];
DatagramPacket packet = new DatagramPacket(res, res.length, recaddress, recport);
packet.setData(res); // riaggancio della struttura dati
socket.receive(packet); // ricezione con attesa sincrona
// estrazione delle informazione dal datagramma
recport = packet.getPort();
recaddress = packet.getAddress();
res = packet.getData();
// uso delle informazioni ...
Comunicazione Multicast
MulticastSocket(int multicastport);
Socket legate a indirizzi IP di gruppo di classe D (necessario per riferimento) attraverso un gruppo di multicast su cui ricevere messaggi
(IP e porta). I nodi che devono ricevere devono prepararsi alla ricezione considerato che la comunicazione non pi punto-punto.
Il gruppo viene creato ed alimentato da ingressi, come registrazione o manifestazione di interesse, fino alluscita (join e leave). In java si
pu essere pi selettivi usando le porte: il gruppo composto solo da chi ha usato la stessa porta -> Si possono avere pi gruppi sullo
stesso indirizzo IP di classe D, distinti dalla porta.
Preparazione gruppo: IP classe D e porta libera
InetAddress gruppo = InetAddress.getByName("229.5.6.7");
MulticastSocket s = new MulticastSocket(6666);
Operazioni di ingresso/uscita dal gruppo (per ricevere)
// unisciti al gruppo ... e esci dal gruppo
s.joinGroup(gruppo); s.leaveGroup(gruppo);
// il sistema operativo pu tenere conto della porta per selezionare i messaggi
Opzioni Socket
La ricezione da socket (es., receive()) sincrona bloccante
SetSoTimeout (int timeout) throws
Questa opzione definisce un timeout in msec, dopo il quale la operazione termina (e viene lanciata una eccezione da gestire). Se
timeout a zero, nessuna sospensione.
SetSendBufferSize (int size) throws
Il buffer di invio e ricezione della driver pu essere variato
SetReceiveBufferSize (int size) throws
SetReuseAddress()
Si possono collegare pi processi ad un certo indirizzo fisico. Sono previste le get corrispondenti.
Socket a Stream
Nel caso delle socket Stream tra cliente e servitore di interpone una terza entit: la Connessione. La comunicazione avviene con
semantica at-most-once: comunicazione bidirezionale, affidabile (garanzie forti di QoS), con dati (byte) consegnati in sequenza una sola
volta.
La connessione tra processi client e server definita univocamente da una quadrupla e dal protocollo (non dai processi)
<indirizzo IP Client; porta Client; indirizzo IP Server; porta Server>
In questo modo basta cambiare anche solo una porta per ottenere una nuova connessione.
Protocollo utilizzato TCP+IP. TCP protocollo di trasporto (livello 4 OSI) che fornisce lastrazione della porta e IP, protocollo di rete
(Livello 3 OSI) per lidentificazione del nodo.
In Java per Client e Server esistono due tipi distinti di Socket (classi distinte per ruoli di Cliente e Servitore) e sono necessarie entrambe
per realizzare una comunicazione.
Le classi java.net.Socket e java.net.ServerSocket. Si nascondono i dettagli realizzativi dei protocolli, ad esempio nei
costruttori delle classi.
La classe Socket consente di creare una socket attiva connessa stream (TCP) per il collegamento di un client a un server.
I costruttori della classe creano la socket, la legano a una porta locale e la connettono a una porta di una macchina remota su cui sta il
server. La connessione permette poi una comunicazione bidirezionale (full duplex).
La creazione della socket produce in modo atomico anche la connessione al server corrispondente (deve essere presente).
Gestione
APERTURA ottenuta con il costruttore in modo implicito. La creazione con successo di una socket a stream produce una
connessione bidirezionale a byte (stream) tra i due processi interagenti e impegna risorse sui nodi e tra i processi. Ha un costo anche
per il destinatario.
CHIUSURA come operazione necessaria per non impegnare troppe risorse di sistema. Le risorse sono le connessioni: costa definirle e
crearle, cos si devono gestirle al meglio, mantenerle e distruggerle. Si devono mantenere le sole connessioni necessarie e limitare le
aperture contemporanee di sessioni chiudendo quelle non utilizzate.
Il metodo close() chiude loggetto socket e disconnette il Client dal Server
public synchronized void close() throws SocketException;
Viene eseguita in modo atomico (in mutua esclusione) perch possono esserci pi thread che condividono una stessa socket.
Supporto
Per informazioni sulle socket si possono utilizzare i metodi aggiuntivi
public InetAddress getInetAddress(); // remote
Restituisce lindirizzo del nodo remoto a cui socket connessa
public InetAddress getLocalAddress(); // local
Restituisce lindirizzo della macchina locale
public int getPort(); // remote port
Restituisce il numero di porta sul nodo remoto cui socket connessa
public int getLocalPort(); // local
Restituisce il numero di porta locale a cui la socket legata
Esempio:
int porta = oggettoSocket.getPort();
Si possono ottenere dinamicamente (runtime) informazioni sulle connessioni correnti delle socket usate.
Quando si apre una connessione si aprono sempre due flussi di byte (leggere/scrivere dalla/sulla socket). Lettura o scrittura da/su una
socket dopo avere qualificato le risorse stream della socket come Java stream
public InputStream getInputStream()
public OutputStream getOutputStream()
I due metodi restituiscono un oggetto stream che incapsula il canale di comunicazione (di classi InputStream e OutputStream)
Attraverso gli stream (generici di byte) si possono spedire/ricevere solo byte, senza nessuna formattazione in messaggi (vedi classi)
Naturalmente, i byte arrivano ordinati e non duplicati (non possono arrivare byte successivi, senza che arrivino i precedenti); i dati
arrivano al pi una volta (at-most-once). In caso di errore? Nessuna conoscenza.
Altri oggetti stream Java possono incapsulare gli stream socket, per fornire funzionalit di pi alto livello (ad es., DataInputStream).
DataOutputStream e DataInputStream offrono una serie di metodi per linvio e la ricezione di tipi primitivi Java.
Uso tipico: realizzazione di protocolli fra Client e Server scritti in linguaggio Java (con scambio di oggetti Java): nel corso vengono usati
per la realizzazione di applicazioni C/S in Java.
DataOutputStream
DataInputStream
String void writeUTF(String s)
String readUTF()
char void writeChar(char c)
char readCHar()
int void writeInt(int i)
int readInt()
float void writeFloat(float f) float readFloat()
Esempio
Client di echo (il Server Unix sulla porta nota 7) progetto di filtro
try { oggSocket = new Socket(hostname, 7);
/* input ed output sugli endpoint della connessione via socket */
out = new PrintWriter (oggSocket.getOutputStream(),true);
in = new BufferedReader(new InputStreamReader(oggSocket.getIntputStream());
userInput = new BufferedReader(new InputStreamReader(System.in));
/* ciclo lettura fino a fine file */
while((oggLine = userInput.readLine()) != null)
{
out.println(oggLine); System.out.println(in.readLine());
}
oggSocket.close();
} catch (IOException e) { System.err.println(e);}
Per ogni ciclo si legge da standard input, si scrive sulla socket out e si attende da socket in la risposta di echo.
Costruttori
Sulle socket dalla parte server:
public ServerSocket(int localPort) throws IOException, BindException;
Crea una socket in ascolto sulla porta specificata
public ServerSocket(int localPort, int count)
Crea una socket in ascolto sulla porta specificata con una coda di lunghezza count
Il server gioca un ruolo passivo: deve attivare la coda delle possibili richieste ed aspettare i clienti (attivi: effettuano la richiesta). Il
server comincia a decidere con la introduzione volontaria della primitiva di accettazione esplicita. Le richieste accodate non sono servite
automaticamente ed necessaria una API che esprima la volont di servizio.
Accept
Il Server si deve mettere in attesa di nuove richieste di connessione chiamando la primitiva accept()
public Socket accept() throws IOException;
Linvocazione di accept blocca il Server fino allarrivo di almeno una richiesta di connessione.
La accept restituisce un oggetto della classe Socket su cui avviene la comunicazione vera di byte tra Client e Server. Client e Server dopo
la connessione sono omogenei: si comportano esattamente allo stesso modo.
Quando arriva una richiesta, la accept crea una nuova socket per la connessione di trasporto gi creata con il Client: la nuova Socket
restituita dalla accept rappresenta lo stream reale con il cliente.
La chiamata di accept sospensiva, in attesa di richieste di connessione:
Se non ci sono ulteriori richieste, il servitore si blocca in attesa
Se c almeno una richiesta, si sblocca la primitiva e si crea la connessione per questa (la richiesta consumata)
NB: Tutte le socket su un server insistono sulla stessa (unica) porta.
Supporto
La trasmissione dei dati avviene con i metodi visti per il lato Client in modo del tutto indifferente in uno o l'altro verso della connessione
i due endpoint sono del tutto omogenei (come nel protocollo TCP)
Informazioni sulle socket connesse come nel cliente:
public InetAddress getInetAddress(); // remote
Restituisce lindirizzo del nodo remoto a cui socket connessa
public InetAddress getLocalAddress(); // local
Restituisce lindirizzo della macchina locale
public int getPort(); // remote port
Restituisce il numero di porta sul nodo remoto cui socket connessa
public int getLocalPort(); // local
Restituisce il numero di porta locale a cui la socket legata
Esempio
Server daytime (Server Unix su porta 13) progetto di demone
try { oggServer = new ServerSocket(portaDaytime);
while (true) /* il server alla connessione invia la data al cliente */
{ oggConnessione = oggServer.accept(); //attesa di connessioni
out = new PrintWriter(oggConnessione.getOutputStream(), true);
Date now = new Date(); // produce la data e la invia
out.write(now.toString()+ "\r\n");
oggConnessione.close(); // chiude la connessione e il servizio } }
catch (IOException e)
{ oggServer.close(); oggConnessione.close(); System.err.println(e);}
Ad ogni cliente il server sequenziale manda la data e chiude tutto
Server Parallelo
Alla accettazione delle richieste si genera un nuovo thread
responsabile del servizio (eredita la connessione nuova e la chiude al
termine delloperazione). Il servitore in questo modo pu tornare
immediatamente ad aspettare nuove richieste e servire nuove
richieste.
Quindi di tratta di un server parallelo multiprocesso con
connessione.
Limite al numero di socket: La socket come un file, ad ogni apertura
-> nuovo file descriptor -> Tabella dei file aperti, quindi un limite
abbastanza largo.
Opzioni
Opzioni delle Socket per cambiare il comportamento
SetSoLinger (boolean on, int linger) //Linger = stare intorno
Dopo la close, il sistema tenta di consegnare i pacchetti ancora in attesa di spedizione. Questa opzione permette di scartare i
pacchetti in attesa dopo un intervallo di linger in sec. La parte di out deve durare linger secondi dopo la close che, quindi,
durer massimo linger secondi.
SetTcpNoDelay (boolean on) throws ...
Il pacchetto inviato immediatamente, senza bufferizzare
SetKeepAlive (boolean on) throws...
Abilita, disabilita la opzione di keepalive. Vengono mandati dei messaggi di keepalive quando non succede niente nella
connessione.
Le opzioni sono disponibili nella interfaccia SocketOptions che prevede anche tutte le get corrispondenti.
RMI
(Remote Method Invocation)
RMI introduce la possibilit di richiedere esecuzione di metodi remoti in JAVA integrando il tutto con il paradigma Object Oriented.
un insieme di strumenti, politiche e meccanismi che permettono ad unapplicazione Java in esecuzione su una macchina di invocare i
metodi di un oggetto di una applicazione Java in esecuzione su una macchina remota.
Localmente viene creato solo il riferimento ad un oggetto remoto, che effettivamente attivo su un nodo remoto.
Un programma cliente invoca i metodi attraverso questo riferimento locale mantenuto in una variabile interfaccia.
La variabile locale, essendo di una certa, definita, interfaccia pu contenere istanze di classi che la implementano (anche diverse) ->
CAST per recuperare listanza giusta. Semantica per riferimento tipica dei linguaggi ad oggetti: una classe pu contenere riferimenti ad
altre classi (oltre a tipi primitivi). Questa, quando viene riferita, viene considerato tutto il grafo di oggetti legati alla classe. Quindi
quando, ad esempio, bisogna esternalizzare la classe si deve considerare tutto il grafo e non solo il primo livello.
Linterfaccia rappresenta un contratto di interazione (astratto) esponendo i metodi verranno implementati. Essendo interfacce possono
realizzare anche ereditariet multipla (impossibile tra classi). Grazie alla portabilit del codice java (via BYTECODE) si risolve il problema
delleterogeneit (JVM).
Architettura di RMI
Per realizzare laccesso ad un oggetto remoto tramite un riferimento remoto, in RMI (Java) si utilizzano due entit proxy (delegati):
Stub dalla parte del Cliente
Skeleton dalla parte del Servitore
Questi componenti nascondono al livello applicativo la natura distribuita dellapplicazione (pattern Proxy). Non possibile riferire
direttamente loggetto remoto -> necessit di una infrastruttura attiva e distribuita. Si definisce prima il contratto e successivamente di
definiscono, in modo quasi automatico, le entit proxy. Sono
classi gi pronte. In questo modo lutente si occupa solo della
parte applicativa. Solo interazioni SINCRONE BLOCCANTI.
Client e Server sono scritti dallutente, Stub e Skeleton sono
generati in modo quasi automatico a partire dal contratto
definito. Remote Reference Layer e Transport Layer fanno
parte della JVM. Il RRL, quando trasferisce variabili per
riferimento, trasferisce lintero grafo.
Server SEMPRE Parallelo -> metodi synchronized
Il trasporto SEMPRE connesso (TCP) -> perch si prevede una
necessit di banda molto elevata e con semantica at-most-once.
rmiregistry sistema di nomi in cui i servitori si devono registrare.
I Clienti per ottenere e raggiungere fanno una richiesta al rmiregistry in cui il servitore si registrato.
In tutto 3 entit (JVM): Cliente, Servitore, Registry. Schematizzando:
Stub e skeleton (sotto il controllo utente):
o Stub: proxy locale su cui vengono fatte le invocazioni destinate alloggetto remoto
o Skeleton: entit remota che riceve le invocazioni fatte sullo stub e le realizza effettuando le corrispondenti chiamate
sul server
Il livello Remote Reference Layer (RRL):
o Responsabile della gestione dei riferimenti agli oggetti remoti, dei parametri e delle astrazioni di stream-oriented
connection
Il livello di Trasporto connesso, Transport Layer
o Responsabile della gestione delle connessioni fra i diversi spazi di indirizzamento (JVM diverse)
o Gestisce il ciclo di vita delle connessioni e le attivazioni integrate in JVM
o Pu utilizzare protocolli applicativi diversi, purch siano connection oriented -> TCP a livello di trasporto
o Utilizza un protocollo proprietario
Il sistema di nomi, Registry: servizio di nomi che consente al server di pubblicare un servizio e al client di recuperarne il proxy
Caratteristiche RMI
Il cliente invoca un metodo di un oggetto remoto attraverso un riferimento remoto (variabile interfaccia). Rispetto al locale:
Sintassi: uguale -> trasparenza per il cliente. Chiamata sempre sincrona e bloccante con attesa.
Semantica: diversa
Chiamate locali -> affidabilit massima
Chiamate remote: comunicazione con possibilit di fallimento -> semantica at-most-once con uso TCP
Server remoto come locale: ogni chiamata esegue in modo indipendente e parallelo
I componenti remoti sono riferiti tramite variabili interfaccia (che possono contenere solo istanze di classi che implementano la
interfaccia)
Definizione del comportamento, con
o Interfaccia deve estendere java.rmi.Remote (segnala che deve essere visibile da remoto)
o Ogni metodo deve propagare java.rmi.RemoteException (eccezioni da remoto)
Implementazione comportamento, classe del Server
o Deve implementare linterfaccia definita
o Deve estendere java.rmi.UnicastRemoteObject
Passi per lutilizzo di RMI
1. Definire interfacce e implementazioni (server) dei componenti utilizzabili in remoto
2. Compilare le classi (con javac) e generare, successivamente, stub e skeleton (con rmic) delle classi utilizzabili in remoto
3. Pubblicare il servizio nel sistema di nomi, registry
a. Attivare il registry
b. Registrare il servizio (il server deve fare una bind sul registry)
4. Ottenere (lato client) il riferimento alloggetto remoto tramite il name service (facendo una lookup sul registry)
A questo punto linterazione tra il cliente e il server pu procedere
Esempio Echo
Intefaccia
public interface EchoInterface extends java.rmi.Remote {
String getEcho(String echo) throws java.rmi.RemoteException;
}
Deve obbligatoriamente estendere Remote. I metodi sono normali con un solo risultato, nessuno, uno o pi parametri di ingresso. I
parametri devono essere passati per valore (dati primitivi o oggetti Serializable) o per riferimento remoto (oggetti Remote).
Server
Client
// Costruttore
public EchoRMIServer()
throws java.rmi.RemoteException
{ super(); }
try
{
// Connessione al servizio RMI remoto
EchoInterface serverRMI =
(EchoInterface)java.rmi.Naming.lookup(
"//localhost:1099/EchoService");
}
}
RMI Registry
Localizzazione del servizio: un client in esecuzione su una macchina ha bisogno di
localizzare un server a cui connettersi, che in esecuzione su unaltra macchina ->
Servizio standard (naming service) in una locazione ben nota, che il client
conosce, funziona come punto di indirezione.
Sistema di nomi realizzato da un utente. Processo che ha lobiettivo di gestire una
tabella costituita da coppie nome del servizio e riferimento delloggetto che fornisce il
servizio. Lavora con una logica di unicit di nomi. un Server RMI.
RMI pensato per sistemi piccoli perch i riferimenti, rimanendo attivi, possono riempire rapidamente (e a lungo) la memoria visto che
possono essere anche remoti.
Classe Naming
Metodi della classe java.rmi.Naming:
public static void bind(String name, Remote obj)
public static void rebind(String name, Remote obj)
public static void unbind(String name)
public static String[] list(String name)
public static Remote lookup(String name)
Ognuno di questi metodi richiede la informazione al RMI registry identificato con host e porta come locazione name -> combina la
locazione del registry e il nome logico del servizio, nel formato: //registryHost:port/logical_name
registryHost = macchina su cui eseguono il registry e i servitori
port = 1099 a default
logical_name = il nome del servizio che vogliamo accedere
Attivazione registry (sullhost del server): usare il programma rmiregistry di Sun lanciato in una shell a parte specificando o meno la
porta (default 1099): rmiregistry oppure rmiregistry 10345.
N.B.: il registry attivato cos in una nuova istanza separata della JVM. possibile avviare il registry anche nella stessa JVM del Server.
Compilazione ed Esecuzione
Lato server
1. Compilazione interfaccia e implementazione parte server
javac EchoInterface.java
EchoRMIServer.java
Hash generato utile alla generazione di Stub e Skeleton.
2.
3.
Lato client
1. Compilazione: javac EchoRMIClient.java
2. Esecuzione: java EchoRMIClient
Stub e Skeleton
Rendono possibile la chiamata di un servizio remoto come se fosse locale (agiscono da proxy). Sono generati dal compilatore RMI.
Procedura di comunicazione
1. Il client ottiene un riferimento remoto con una richiesta (lookup) al registry (default porta 1099)
2. Il client chiama metodi sullo stub e aspetta il risultato (sincrono bloccante) da questo
3. Lo Stub:
Effettua la serializzazione delle informazioni per la chiamata (id del metodo identificazione - e argomenti)
Invia le informazioni allo skeleton utilizzando le astrazioni messe a disposizione dal RRL
4. Lo Skeleton:
Effettua la de-serializzazione dei dati ricevuti
Invoca la chiamata sulloggetto che implementa il server (dispatching)
Effettua la serializzazione del valore di ritorno e invio allo allo stub
5. Lo Stub:
Effettua la de-serializzazione del valore di ritorno
Restituisce il risultato al client
Oggetti Remoti
Metodo Locale
Per valore
Per riferimento
Metodo Remoto
Per valore
Per valore (Serializable Object)
-> mandare il contenuto.
Deep Copy: viene copiato lintero grafo
associato alla classe.
Per riferimento remoto (Remote Object)
possibile anche creare allinterno del codice (del server) un proprio registry:
public static Registry createRegistry(int port)
che un metodo della classe LocateRegistry. In questo caso, il registry viene creato nella stessa istanza della JVM.
EchoRMIServer echormiserver =
(EchoRMIServer)remote;
switch(opnum){
case 0: // operazione 0
String message;
try{ // de-serializzazione parametri
ObjectInput objectinput =
remotecall.getInputStream();
message =
(String)objectinput.readObject();
}
catch(){}
finally{ // libera il canale di input
remotecall.releaseInputStream();
}
// invocazione metodo
String message1 =
echormiserver.getEcho(message);
try{ // serializzazione del valore di ritorno
ObjectOutput objectoutput =
remotecall.getResultStream(true);
objectoutput.writeObject(message1);
}
catch(){}
break;
// gestione di eventuali altri metodi
default:
throw new UnmarshalException("invalid ...");
} //switch
} // dispatch
CLASSPATH ed esecuzione
Come la variabile dambiente PATH di Unix esiste per java la variabile CLASSPATH che dice a RMI dove cercare le cose di cui ha bisogno.
Sotto Linux: ci possibile aggiungendo nella propria directory HOME il file ".profile" (creandolo se non esiste). In particolare, il file
.profile deve contenere le seguenti linee per aggiungere il direttorio corrente al CLASSPATH:
CLASSPATH=.:$CLASSPATH
export CLASSPATH
(export -> passa la variabile ai processi figli della shell relativa)
Esempio
Client: java -Djava.security.policy=echo.policy EchoRMIClient
Server: java -Djava.security.policy=echo.policy EchoRMIServer
Corso di
Reti di Calcolatori T
Progetto C/S con Socket in C
Antonio Corradi
Anno accademico 2012/2013
Socket in C 1
COMUNICAZIONE e SOCKET
Necessit di Strumenti di Comunicazione per supportare
scambio di messaggi
Necessit di definire e di diffondere l'uso di strumenti
standard di comunicazione
Scenario con strumenti diversi, applicativi e di livello diverso
Livelli
Interfacce di comunicazione
Named Pipe
Applicazione
Presentazione
Sessione
Mail Slot
SPX
Sockets
APPC
NetIPC
Specifiche di protocollo
Directory
Applicazione
Presentazione
X.400
FTAM
TCP / UDP
Trasporto
IPX
RPC
Livelli
NetBIOS
TLI
Sessione
Trasporto
Presentazione
Rete
IP
Dati
Fisico
Sessione
Trasporto
Uso di file
solo tra processi che condividono il file system sullo stesso nodo
Processo
Processo
fd 0
fd 1
File
pipe
rete
Tabella dei file
aperti del processo
Socket descriptor
dominio
servizio
protocollo
indirizzo locale
porta locale
connessione remota
Socket Connessa
protocollo di trasporto;
e quadrupla
< indirizzo locale; processo locale; indirizzo remoto; processo remoto>
Socket in C 4
UNIX: PRIMITIVE
UNIX deve fornire funzioni primitive di comunicazione
UNIX Berkeley introduce il meccanismo di socket standard,
strumenti di comunicazione locali o remote con politiche differenziate, in
alternativa ai problemi degli strumenti concentrati, trasparente e ben
integrata con processi e file
SOCKET su cui i processi possono scrivere/leggere messaggi e
stream, con molte opzioni e requisiti
UNIX: TRASPARENZA
Le socket come strumento con interfaccia omogenea a quella usuale
UNIX per i servizi da invocare in modo trasparente
Socket
endpoint della comunicazione
Socket descriptor integrato con i file descriptor
con protocolli di trasporto diversi e default TCP/IP (sia UDP sia TCP)
Chiamata
open( )
close( )
read( )
write( )
lseek( )
fctl( )
ioctl( )
Significato
Prepara un dispositivo o un file ad operazioni di
input/output
Termina l'uso di un dispositivo o un file
precedentemente aperto
Ottiene i dati da un dispositivo di input o da un file, e li
mette nella memoria del programma applicativo
Trasmette i dati dalla memoria applicativa a un
dispositivo di output o un file
Muove I/O pointer ad una specifica posizione in file
/dispositivo
Controlla le propriet di un file descriptor e le funzioni
di accesso
Controlla i dispositivi o il software usato per accedervi
Processo utente
Kernel
Socket in C 6
descrizione
PF_UNIX
PF_INET
...........
Socket in C 7
SCELTE di COMUNICAZIONE
Tipi di servizio e socket
datagram: scambio di messaggi senza garanzie (best effort)
stream: scambio bidirezionale di messaggi in ordine, senza errori, non
duplicati, nessun confine di messaggio, out-of-band flusso (stream virtuale
e non reale) semantica at-most-once
Socket in C 8
Possibile
Possibile
No
No
TCP
UDP
ICMP
No
SPP
IDP
Possibile
SPP
AF_INET
AF_INET
AF_INET
AF_INET
AF_NS
AF_NS
AF_NS
AF_NS
AF_UNIX
AF_UNIX
Stream
Datagram
Raw
Raw
Stream
Seq-pack
Raw
Raw
Datagram
Stream
IPPROTO_TCP
IPPROTO_UDP
IPPROTO_ICMP
IPPROTO_RAW
NSRPROTO_SPP
NSRPROTO_SPP
NSRPROTO_ERROR
NSRPROTO_RAW
IPPROTO_UDP
IPPROTO_TCP
TCP
UDP
ICMP
(raw)
SPP
SPP
Error Protocol
(raw)
UDP
TCP
Socket in C 9
(Inizio registrazione)
Dominio es Internet
In Internet
Nodi nomi IP
{identificatore_rete, identificatore_host}
Porta numeri distintivi sul nodo (1-1023 di sistema, 1024-65535 liberi)
Socket in C 10
(2:50)
Porta s.sin_port
Indirizzo s.sin_addr.s_addr
sempre AF_INET
numero di porta
indirizzo Internet del nodo remoto (numero IP)
Socket in C 11
(9:05)
sa_data
14 BYTE
struct sockaddr_in
Sin_family
(AF_INET)
sin_port sin_addr
2 BYTE
2 BYTE
sin_zero
000000000000
4 BYTE
8 BYTE
14 BYTE
(16:50)
#include <netdb.h>
ritorna un nome fisico
struct hostent * gethostbyname (name)
char * name;
gethostbyname restituisce un puntatore alla struttura hostent oppure NULL
se fallisce; il parametro name ricercato nel file /etc/hosts che si comporta
come una tabella di corrispondenze, ad esempio
137.204.56.11
137.204.56.12
137.204.56.13
didahp1
didahp2
didahp3
hp1
hp2
hp3
(20:20)
P
primo
char ** P;
4 byte
a
b
c
13
0 bin
FUNZIONE GETHOSTBYNAME
Struttura hostent (intesa come descrizione completa di host)
struct hostent {
/* nome ufficiale dell'host */
char * h_name;
char ** h_aliases;
/* lista degli aliases */ lista di stringhe
int
h_addrtype; /* tipo dell'indirizzo host */
int
h_length;
/* lunghezza del'indirizzo */
char ** h_addr_list; /* lista indirizzi dai nomi host */ lista dei possibili ip della macchina
#define h_addr h_addr_list[0] /* indirizzo nome host */
indirizzo canonico -> il primo della lista
}
Socket in C 14
(27:58)
USO GETHOSTBYNAME
Esempio di utilizzo della gehostbyname per risolvere lindirizzo
logico: si usa una variabile di appoggio riferita tramite puntatore che
ha valore in caso di successo per dare valore a peeraddr
#include <netdb.h>
Socket in C 15
(33:42)
FUNZIONE GETSERVBYNAME
In modo simile, per consentire ad un utente di usare dei nomi logici
di servizio senza ricordare la porta, la funzione getservbyname()
di utilit restituisce il numero di porta relativo ad un servizio
Anche se non ci sono corrispondenze obbligatorie, la pratica di uso ha
portato ad una serie di porte note (well-known port) associate stabilmente
a servizi noti, per consentire una pi facile richiesta
7/tcp
11/tcp users
13/tcp
13/udp
17/tcp quote
20/tcp
21/tcp
# Echo
# Active Users
# Daytime
#
# Quote of the Day
# File Transfer Protocol (Data)
# File Transfer Protocol (Control)
Socket in C 16
(36:25)
USO GETSERVBYNAME
Esempio di utilizzo della getservbyname per trovare numero di porta
usando una variabile di appoggio riferita tramite puntatore che
permette di ritrovare il numero di porta nel campo s_port
#include <netdb.h>
struct servent * getservbyname (name, proto)
char *name, *proto;
(37:50)
PRIMITIVE PRELIMINARI
Per lavorare sulle socket sono preliminari due primitive di nome
Per il nome logico LOCALE, si deve creare socket in ogni processo
risultato positivo o nullo
s = socket (dominio, tipo, protocollo)
negativo se errori nei parametri
int s,
/* file descriptor associato alla socket */
crea un fd nella tabella dei file aperti
dominio,
/* UNIX, Internet, etc. */
tipo,
/* datagram, stream, etc. */
protocollo;
/* quale protocollo */
Socket in C 18
Se risultato negativo es porta occupata o altri errori del genere tipo ip non locale o
un socket descriptor non valido
Per lavorare senza connessione queste due primitive bastano come intro.
SOCKET DATAGRAM
Le socket datagram sono dei veri end-point di comunicazione e
permettono di formare half-association (relative ad un solo
processo), ma usabili per comunicare con chiunque del dominio
Si possono scambiare messaggi (datagrammi) sapendo/avendo:
processo Mittente o Cliente
* dichiarazione delle variabili di riferimento a una socket
* conoscenza dell'indirizzo Internet del nodo remoto
* conoscenza della porta del servizio da usare
SOCKET DATAGRAM
Le socket datagram sono degli end-point per comunicazione
con chiunque del dominio
processo Mittente o Cliente
processo Ricevente o Server
Socket A
(bound)
Socket B (bound)
PROTOCOLLO DATAGRAM
Le socket datagram sono usate con un protocollo che si basa
sulla sequenza di primitive qui sotto (alcune opzionali, quali?)
Client
Dichiarazione argomenti delle chiamate
Creazione socket
Collegamento socket
bind()
sendto() o write()
Invio dati
Ricezione dati
Chiusura
socket()
recvfrom() o read()
close() o shutdown()
Server
Dichiarazione argomenti delle chiamate
Creazione socket
socket()
Collegamento socket
bind()
Invio dati
Chiusura
Azioni
simmetriche
o read()
sendto() o write()
Azioni
simmetriche
close() o shutdown()
Socket in C 21
PRIMITIVE di COMUNICAZIONE
Per comunicare ci sono due primitive, di invio e ricezione datagrammi
nbytes = sendto (s, msg, len, flags, to, tolen)
int s, nbytes; char *msg; /* area che contiene i dati */
int len, flags; /* indirizzo, lunghezza e flag di operazione */
struct sockaddr_in *to; int tolen; /* indirizzo e lunghezza*/
nbytes = recvfrom (s, buf, len, flags, from, fromlen)
int s, nbytes; char *buf; /* area per contenere dati */
int len,flags; /* indirizzo, lunghezza e flag di operazione */
struct sockaddr_in *from; int * fromlen; /* ind e lung. ind.*/
Socket in C 24
Client Process
bind()
socket()
recvfrom()
<attesa
richiesta>
sendto()
2
recvfrom()
<attesa risp>
<elaborazione>
sendto()
close()
close()
Socket in C 25
Socket in C 30
SOCKET STREAM
Le socket stream prevedono una risorsa che rappresenta la
Socket B
in ascolto
(bound)
Socket in C 31
Socket B
(bound)
Socket C
(bound)
Connessione
Creazione socket
Collegamento socket
parte
asimmetrica
socket()
bind()
Richiesta di connessione
opzionale
connect()
ruolo attivo
Creazione socket
socket()
Collegamento socket
bind()
Attesa richieste
listen()
Accettazione connessione
parte
simmetrica
send() o write()
Invio dati
Ricezione dati
Chiusura
recv() o read()
close() o shutdown()
Ricezione dati
recv() o read()
send() o write()
Invio dati
Chiusura
accept()
Server
parte
asimmetrica
ruolo passivo
parte
simmetrica
close() o shutdown()
Socket in C 33
Socket in C 35
else /* procedi */
Socket in C 37
<sys/types.h>
<netinet/in.h>
<sys/socket.h>
<errno.h>
Socket in C 38
Socket in C 40
C
s=socket()
[bind()]
(2) connect()
send/receive
read/write
S
(inizio registrazione 29.10)
s=socket()
bind()
(1) listen()
(3) ns = accept() nuova socket
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
42
(6:34)
Socket in C 43
(10:38)
44
(12:12)
nodo: indirizzo IP
Processo
Client
Processo
Server
socket
server
(sd)
listen() +
accept()
socket
client
porta
client
unica
porta
server
rete (TCP/IP)
socket
connessa
(nuovo_sd)
read() e write()
(14:04)
multi-processo
connection-oriented
Richiesta di connessione
ss
Processo
Server
(padre)
Comunicazione
Client/Server
ns
(16:10)
int send
int
recv ritorna
il numero int recv
di byte realmente
int
ricevuti
s
buf /msg
len
flags
risultato
(s,
s;
(s,
s;
msg,
char *msg;
int len,flags;
nessun rendez vous
buf, len, flags)
la recv viene sbloccata al primo dato ricevuto
char *buf;
int len,flags;
socket descriptor
puntatore allarea che contiene il messaggio (IN/OUT)
lunghezza del messaggio
opzioni di comunicazione
numero di byte realmente inviato/ricevuto
1 byte che pu essere mandato
(23:23)
(25:58)
COMUNICAZIONE A STREAM
I messaggi sono comunicati ad ogni primitiva? NO
i dati sono bufferizzati dal protocollo TCP: non detto che siano inviati
subito ma raggruppati e inviati poi alla prima comunicazione 'vera'
decisa dalla driver TCP
Soluzione messaggi di lunghezza pari al buffer
o comandi espliciti di flush del buffer
Come preservare i messaggi in ricezione?
ogni receive restituisce i dati preparati dalla driver locali: TCP a stream
di byte non implementa marcatori di fine messaggio
Soluzioni messaggi a lunghezza fissa
Per messaggi a lunghezza variabile, si alternano un messaggio a
lunghezza fissa e uno variabile in lunghezza, il primo contiene la
lunghezza del secondo, ossia uso di messaggi con indicatori espliciti
di lunghezza letti con due receive in successione
Socket in C 49
32:00
USO di STREAM
Ogni stream viene creato con successo tra due endpoint (e solo
due per non avere interferenze) tipicamente su nodi diversi
i dati viaggiano nelle due direzioni e ogni endpoint li invia e li riceve
dopo che hanno impegnato la comunicazione (banda e risorse)
Ogni endpoint ha una sorgente di input e un sink di output
Come sfruttare al meglio la rete?
ogni dato che sia stato inviato deve essere ricevuto evitando di dovere
scartare dati che sono arrivati ad un endpoint e non vengono accettati
Soluzione segnali di fine flusso
Su ogni flusso viaggiano dati fino alla fine del file che segnala che non
ci si devono aspettare pi dati
Ogni endpoint deve osservare un protocollo: deve leggere tutto
linput fino alla fine del flusso, e dalla sua direzione di flusso, deve
inviare una fine del flusso quando vuole terminare i dati in uscita
Socket in C 50
35:10
Socket in C 51
input chiuso anche se c' ancora roba dentro. out viene preservata.
jump
Socket in C 52
40:50
Socket in C 53
41:58
USO SHUTDOWN()
La primitiva shutdown() viene tipicamente usata per una buona
gestione delle azioni tra i due pari
Ognuno dei due gestisce il proprio verso di uscita e lo controlla
Se decide di finire usa una shutdown delloutput e segnala di non
volere pi trasmettere
Il pari legge fino alla fine del file e poi sa che non deve pi occuparsi di
input
->>>
PROCESSI NAIVE
I processi molto semplici, processi naive, si comportano da filtri e
leggono dallo standard input e scrivono sullo standard output
possono essere utilizzati in modo quasi trasparente nella
comunicazione (comandi UNIX sort, find, ecc)
Se il processo naif, usa write() e read() al posto delle send() e
recv()allora pu leggere da socket e scrivere su socket
Si deve preparare la attivazione secondo il protocollo usuale:
- Uso di fork() di un comando locale
dopo aver creato tre socket che devono avere file descriptor stdin, stdout
e stderr (0, 1, 2)
42:53
address A+1
High-order byte
MSB
High-order byte
address A
Low-order byte
LSB
Low-order byte
address A
address A+1
Host Byte Order (HBO)
Big-endian
non un unico ordinamento
Es. Intel Little-endian, Solaris Big-endian
Socket in C 56
46:50
50:00
50:57
59
53:09
API SOCKET
Molte sono le primitive per le socket, e sono tutte SINCRONE
Chiamata
socket( )
connect( )
write( )
read( )
se linger si
close( )
bind( )
Significato
Crea un descrittore da usare nelle comunicazione di rete
Connette la socket a una remota
Spedisce i dati attraverso la connessione
Riceve i dati dalla connessione
Termina la comunicazione e dealloca la socket
Lega la socket con l'endpoint locale
listen( )
accept( )
recv( )
recvmes( )
recvfrom( )
send( )
sendmsg( )
sendto( )
Socket in C 60
54:53
API SOCKET
Seguono ancora primitive per le socket
Chiamata
shutdown( )
Significato
Termina una connessione TCP in una o in entrambe le direzioni
getsockname( )
getpeername( )
getsockopt( )
setsockopt( )
perror()
syslog()
Socket in C 61
55:54
57:25
Socket in C 63
01:05:52
Socket in C
64
01:11:00
65
01:13:09
01:17:10
if((fd=open(buff,O_WRONLY|O_CREAT|O_EXCL))<0)
{printf("file esiste, non opero\n"); write(ns,"N", 1);}
else
/* facciamo la copia del file, leggendo dalla connessione */
{printf("file non esiste, copia\n"); write(ns,"S", 1);
while((nread=read(ns, buff, DIM_BUFF))>0)
{ write(fd,buff,nread); cont+=nread;}
printf("Copia eseguita di %d byte\n",cont); }
close(ns); close(fd); exit(0); }
close(ns); wait(&status); } /* padre */ chiude per non interferire con il figlio
/* attenzione: si sequenzializza ... Cosa bisognerebbe fare? */
Socket in C 67
dovrebbe tornare a fare accept. Qui si mette in wait a gestire il valore del figlio
Servitore diventa sequenziale. Se non facciamo la wait figlio -> zombie -> va gestito -> handler
01:24:51
NODO CLIENTE
Richiesta
Processo CLIENT: invio e
ricezione messaggi di 10 byte
Stream
Socket connessa
.....messag
gio3............
Connessione
Socket connessa
collegata alla
porta 22375
NODO SERVER
Socket in C 68
(5:00)
<sys/types.h>
<sys/socket.h>
<netinet/in.h>
<stdio.h>
<netdb.h>
char *ctime();
int ricevi ();
int s;
/* socket descriptor del cliente */; char * nomeprog;
struct hostent *hp; /* puntatore alle informazioni host remoto */ non istanziato
long timevar;
/* contiene il risultato dalla time() */
struct sockaddr_in myaddr_in;
/* socket address locale */
struct sockaddr_in peeraddr_in; /* socket address peer */ destinatario
main(argc, argv) int argc; char *argv[];
{ int addrlen, i; char buf[10]; /* messaggi di 10 bytes */
if (argc != 3)
{ fprintf(stderr, "Uso: %s <host remoto> <nric>\n", argv[0]); exit(1)}
Socket in C 69
7:30
peeraddr_in.sin_addr.s_addr =
((struct in_addr *)(hp->h_addr))->s_addr;
/* non si usa la htonl dopo la gethostbyname: la si provi in diversi ambienti */
Socket in C 70
10:40
peeraddr_in.sin_port = htons(22375);
/* numero di porta trasformato nel formato network via htons(). In
architetture in cui i due formati coincidono si ottiene maggiore efficienza */
s = socket (AF_INET,SOCK_STREAM,0); /* creazione della socket */
if (s == -1) { perror(argv[0]); /* controllo errore */
fprintf(stderr, "%s: non posso creare la socket\n", argv[0]); exit(1); }
nomeprog = argv[0]; /* per gestire condizioni derrore in procedure */
Socket in C 71
12:50
/* No bind: la porta del client assegnato dal sistema. Il server lo vede alla
richiesta di connessione; il processo client lo ricava con getsocketname() */
if(connect (s, &peeraddr_in, sizeof(struct sockaddr_in))== -1)
{ perror(argv[0]); /* tentativo di connessione al server remoto */
fprintf(stderr,"%s: impossibile connettersi con server\n", argv[0]);
e la porta
72
18:12
for (i=1; i<= atoi(argv[2]); i++) atoi non brava -> se incontra un carattere si ferma
{/* invio di tutti i messaggi nel numero specificato dal secondo argomento */
*buf = htonl(i); /* i messaggi sono solo gli interi successivi */
if ( send (s, buf, 10, 0) != 10) send non bloccante -> se ne occupa la driver
{fprintf(stderr, "%s: Connessione terminata per errore", argv[0]); semantica locale
fprintf(stderr, "sul messaggio n. %d\n", i); exit(1);
}
}
buf -> variabile locale del main -> viene allocata dalla
stack non inizializzata -> per inizializzarla : variabile
globale -> tutto inizializzato a zero
Socket in C 73
27:00
29:20
se ne possono ricevere di
meno -> rileggo.
Ma non di pi
if (j == -1) { perror(nomeprog);
fprintf(stderr,"%s: errore in lettura\n, nomeprog); exit(1); }
i += j; if (j == 0) break; }
} /* si assume che tutti i byte arrivino se si verifica il fine file si esce */
return i; }
/* Il ciclo interno verifica che la recv() non ritorni un messaggio pi corto di
quello atteso (n byte)
La recv ritorna appena vi sono dati e non attende tutti i dati richiesti
RICEZIONE MESSAGGI
Nelle applicazioni Internet molto comune trovare funzioni come
quella appena vista di ricezione
Dobbiamo ricordare che la ricezione considera un successo un
qualunque numero di byte ricevuto (anche 1) e ne segnala il numero
nel risultato (a meno di opzioni: vedi low watermark)
Per evitare tutti i problemi, dobbiamo fare ricezioni / letture ripetute
Esiste il modo di cambiare il comportamento della receive intervenendo
sui low-watermark (vedi opzioni socket)
41:51
<sys/types.h>
<sys/socket.h>
<netinet/in.h>
<signal.h>
<stdio.h>
<netdb.h>
43:30
44:15
Socket in C 79
45:40
48:08
DAEMON di SERVIZIO
case 0:
50:35
DAEMON - SERVIZIO
switch (fork()) {
case -1: /* Non possibile generare un figlio ed allora esce */
exit(1);
case 0: /* Esecuzione del processo figlio che gestisce il servizio */
server();
/* ulteriore figlio per il servizio */
exit(0);
default: /* successo in generazione demone */
close(s);
/* Il processo daemon chiude il socket descriptor e torna ad accettare
ulteriori richieste. Questa operazione consente al daemon di non superare il
massimo dei file descriptor ed al processo figlio fare una close() effettiva sui
file */
} /* fine switch */
} /* for fine ciclo del daemon*/
Socket in C 82
51:44
PROCESSO di SERVIZIO
procedura SERVER: routine eseguita dal processo figlio del daemon
qui che si gestisce la connessione: si ricevono i pacchetti dal
processo client, si elaborano, e si ritornano i risultati al mittente;
inoltre si scrivono alcuni dati sullo stdout locale
char *inet_ntoa(); /* routine formato indirizzo Internet */
char *ctime();
/* routine di formato dell'orario ottenuto da time () */
int ricevi ();
server()
{ int reqcnt = 0;
/* conta il numero di messaggi */
char buf[10];
char *hostname;
int len, len1;
necessaria
per diverse
responsabilitIl
53:20
PROCESSO di SERVIZIO
/* Cerca le informazioni relative all'host connesso mediante il suo indirizzo
Internet usando la gethostbyaddr() per rendere leggibili gli indirizzi */
hp = gethostbyaddr ((char *)&(ntohl(peeraddr_in.sin_addr) ,
sizeof (struct in_addr), peeraddr_in.sin_family);
if (hp == NULL) hostname =
qui hostname = "137.0.89.1"
inet_ntoa(ntohl(peeraddr_in.sin_addr));
/* Non trova host ed allora assegna l'indirizzo formato Internet */
else
{ hostname =(hp->h_name); /* punta al nome dell'host */ }
/*stampa un messaggio d'avvio*/
time (&timevar);
printf("Inizio dal nodo %s porta %u alle %s",
hostname, ntohs(peeraddr_in.sin_port),
ctime(&timevar));
Socket in C 84
55:00
CICLO di SERVIZIO
/* Loop di ricezione messaggi del cliente
Uscita alla ricezione dell'evento di shutdown, cio alla fine del file */
while (ricevi (s, buf, 10) )
{reqcnt++; /* Incrementa il contatore di messaggi */
sleep(1); /* Attesa per simulare l'elaborazione dei dati */
if(send(s,buf,10,0)!=10) /* Invio risposta per ogni messaggio*/
{printf("Connessione a %s abortita in send\n", hostname);exit(1);}
85
56:16
ADDENDUM PRIMITIVE
In alcuni kernel, le primitive sospensive hanno un qualche problema
in caso di interruzione con segnali, dovuto a interferenza tra spazio
kernel e utente
Una primitiva sospensiva interrotta da un segnale deve essere riattivata
dall'inizio usando uno schema come il seguente
(errno == EINTR verifica che si sia stata una interruzione da segnale)
for (;;)
{ int g, len = sizeof (from);
g= accept (f, (struct sockaddr *)&from, &len);
if (g < 0) { if (errno == EINTR) /* ripetizione primitiva */
syslog(LOG_ERR, ..."p); continue; }
/* altro codice in caso di successo e uscita dal ciclo for*/
}
59:55
(torna un po' indietro)
01:09:00 (select)
ATTESE MULTIPLE
Le primitive su socket bloccano il processo che le esegue
In caso di possibile ricezione da sorgenti multiple (eventi multipli che
possono sbloccare un processo) necessaria la possibilit di
attendere contemporaneamente su pi eventi di I/O legati a pi
socket (o file)
La gestione delle socket ha portato ad una primitiva legata alla gestione
di pi eventi all'interno di uno stesso processo e al blocco imposto dalle
primitive sincrone
Le operazioni bloccanti (lettura) o con attese pregiudicano il servizio di
altre ad un processo server (con molti servizi da svolgere) che
potrebbe sospendersi su una primitiva e non potere servire altre
richieste su socket diverse
01:16:15
SELECT()
Primitiva per attesa multipla globale sincrona o con durata massima
select() primitiva con time-out intrinseco
Azioni di comunicazione potenzialmente sospensive
Lettura accept, receive (in tutte le forme), eventi di chiusura
Scrittura connect, send (in tutte le forme), eventi di chiusura
Eventi anomali dati out-of-band, eventi di chiusura
Socket in C 88
1:54
7:24
8
0
0
7
1
1
6
0
0
5
1
1
4
1
0
3
0
0
2
0
0
1
0
0
0
0
0
eventi
si esaminano solo i file descriptor il cui bit ad 1, ossia per socket 4,5,7,9
91
9:50
file descriptor
MASCHERA
9 8 7 6 5 4 3 2 1 0
0 0 1 0 1 1 0 0 0 0
void FD_SET(int fd, fd_set &fdset);
riporta a 0 fd
int
Socket in C 92
11:56
13:23
ESEMPIO di SELECT()
Gestione di socket e select (maschere) #include <stdio.h>
do_select(s) int s; /* socket descriptor di interesse */
{struct fd_set read_mask, write_mask; int nfds, nfd;
for (;;) {/* ciclo infinito */
/* azzera le maschere e set posizione*/
FD_ZERO(&read_mask); FD_SET(s,&read_mask);
FD_ZERO(&write_mask); FD_SET(s,&write_mask); nfds=s+1;
nfd=select(nfds,&read_mask,&write_mask, NULL,
(struct timeval*)0); sblocco -> evento
if (nfd==-1) /* -1 per errore, anche 0 per timeout*/
{perror("select: condizione inattesa"); exit(1);}
/* ricerca successiva del file descriptor nella maschera e trattamento */
if (FD_ISSET(s,&read_mask)) do_read(s); non bloccante perch l'evento c' gi
if (FD_ISSET(s,&write_mask)) do_write(s);
}}
Socket in C 94
17:41
Socket in C 95
20:50
23:46
Socket in C 97
25:09
SERVER - PREPARAZIONE
int main
{
98
27:54
SERVER - CICLO
for (;;) /* ciclo di select per il processo servitore*/
{ HANDLE h; /* verifica delle richieste presenti */
select (maxhp1, &temp_hs, 0, 0, 0); Bloccante
for (h = listener + 1; h < maxhp1; h++)
{ if (FD_ISSET(h, &temp_hs)) /* richieste sulle connessioni */
/* per ogni dato su connessione, trattamento in handle() */
if (handle (h) == 0)
/* se il caso di chiusura della connessione da parte del cliente */
{ FD_CLR(h, &read_hs); close(h); }
}
if (FD_ISSET(listener, &temp_hs)){ /* nuova connessione */
h = accept (listener, 0, 0); FD_SET(h, &read_hs);
if (maxhp1 < = h) maxhp1 = h + 1;
}
temp_hs=read_hs; }
}
Socket in C
99
32:23
SERVER - INIT
/* funzione di preparazione della socket di listen sulla porta */
HANDLE create_server_endpoint (u_short port)
{struct sockaddr_in addr;
HANDLE h; /* file desriptor della socket iniziale */
h = socket (PF_INET, SOCK_STREAM, 0);
/* set di indirizzo per il server */
memset ((void *) &addr, 0, sizeof addr);
addr.sin_family = AF_INET;
addr.sin_port = ntohs(port);
addr.sin_addr.s_addr = INADDR_ANY;
/* usuali primitive da parte server */
bind (h, (struct sockaddr *) &addr, sizeof addr);
listen (h, 5);
return h;
}
Socket in C
100
SERVER MULTIFUNZIONE
Spesso significativo avere un unico servitore per pi servizi come
un unico collettore attivo che si incarica di smistare le richieste
Il servitore multiplo pu
portare a termine completamente i servizi per richiesta
incaricare altri processi del servizio (specie in caso di connessione e
stato) e tornare al servizio di altre richieste
Unico processo master per molti servizi deve riconoscere le richieste ed
anche attivare il servizio stesso
Problemi:
Un unico servizio che fa il dispatching
Il server pu diventare il collo di bottiglia del sistema
-> servizi semplici fatti dal demone
Necessit di decisioni rapide e leggere
7:15
CONFIGURAZIONE
INETD
#
#
#
#
#
CONFIGURAZIONE INETD
# Echo, discard, daytime, and chargen are used for testing.
echo
stream tcp
nowait root internal
echo
dgram udp
wait
root internal
discard
stream tcp
nowait root internal
discard
dgram udp
wait
root internal
daytime
stream tcp
nowait root internal
daytime
dgram udp
wait
root internal
# RPC services syntax:
# <rpc_prog>/<vers> <socket_type> rpc/<proto> <flags> <user>
<pathname> <args>
# The rusers service gives out user information.
rusersd/1-2
dgram
rpc/udp
wait
root
/usr/etc/rpc.rusersd rpc.rusersd
# The spray server is used primarily for testing.
sprayd/1
dgram
rpc/udp
wait
root
/usr/etc/rpc.sprayd
rpc.sprayd
Socket in C 104
13:15
b) soluzione parallela
possibilit di generare pi processi (slave) che gestiscono ciascuno
una diversa interazione con un server
Questo permette anche di interagire con pi server contemporaneamente ad esempio con multicast
client
master
client
processi di
applicazione
client
sistema
operativo
slave
slave slave
Socket in C 105
18:54
Socket in C 106
23:26
26
linger =
stare intorno
Opzioni
SO_DEBUG
SO_REUSEADDR
SO_DONTROUTE
SO_LINGER
SO_BROADCAST
SO_OOBINLINE
SO_SNDBUF
SO_RCVBUF
SO_SNDLOWAT
SO_RCVLOWAT
SO_SNDTIMEO
SO_RCVTIMEO
SO_USELOOPBACK
SO_PROTOTYPE
Descrizione
abilita il debugging (valore diverso da zero)
riuso dell'indirizzo locale
abilita il routing dei messaggi uscenti
ritarda la chiusura per messaggi pendenti
abilita la trasmissione broadcast
messaggi prioritari pari a quelli ordinari
setta dimensioni dell'output buffer
setta dimensioni dell'input buffer
setta limite inferiore di controllo di flusso out
limite inferiore di controllo di flusso in input
setta il timeout dell'output
setta il timeout dell'input
abilita network bypass
setta tipo di protocollo
Socket in C 107
28:45
108
31:05
Socket in C 109
31:41
/* attesa in sec */ }
default
l_onoff
l_linger
0
1
1
don't care
0
valore > 0
39:46
MODALIT
MODALIT
PRIMITIVE SOCKET
Sono di molto interesse modi che non siano sincroni ma lavorino senza
nessuna attesa correlata alla comunicazione
Socket asincrone con uso di primitive ioctl o fcntl e opzioni
Le socket asincrone permettono operazioni senza attesa, ma al
completamento tipicamente lutente viene avvisato con un segnale ad hoc
SIGIO segnala un cambiamento di stato della socket (per l'arrivo di dati)
SIGIO ignorato dai processi che non hanno definito un gestore
Gestione della socket e del segnale, ad esempio per la consegna dei dati
SIGIO socket asincrona con attributo FIOASYNC con primitiva ioctl()
sincrono non bloccante (tipic. unix: sincrono bloccante)
#include <sys/ioctl.h>
si potrebbe chiedere ad una socket
int ioctl (int filedesc, int request, ... /* args */)
filedescr file descriptor
request tipo di attributo da assegnare
poi
valori da assegnare all'attributo
A chi si deve consegnare il segnale, in un gruppo di processi???
Socket in C 111
52:26
jump
MODALIT
MODALIT
CONSEGNA SEGNALI
Per dare strumenti con la necessaria visibilit a volte si devono tenere
in conto altre caratteristiche
SIGIO a chi deve essere consegnato in un gruppo di processi?
Per la consegna di SIGIO, primitiva ioctl() con attributo SIOCSPGRP
parametro process group del processo alla socket asincrona.
int ioctl (filedescr, SIOCSPGRP, &flag)
flag valore negativo
segnale solo al processo con pid uguale al valore negato
flag valore positivo segnale arriva a tutti i processi del process group
valore positivo
valore negativo
PROCESSO padre:
accetta la connessione generando una
socket connessa.
coda
Socket d'ascolto
PROCESSO figlio:
eredita la socket connessa e la qualifica come
asincrona, indicando un process group negativo
SIGIO
Socket connessa e
asincrona.
E' condivisa con
il padre.
Socket d'ascolto
Stream
dati
Connessione
SIGIO
Socket connessa e
asincrona.
E' condivisa con
il padre.
Socket in C 112
49:30
ESEMPIO ASINCRONO
int ls; /* socket d'ascolto */
int flag=1;
/* valore per FIOASYNC per socket asincrona */
int handler(); /* gestore delle I/O sulle socket */
signal(SIGIO,handler); /* aggancio del gestore segnale */
-1)
if (ioctl (ls,FIOASYNC,&flag) ==
{ perror("non posso rendere asincrona la socket");
exit(1);
}
flag= - getpid();
/* identificatore di processo negativo */
if (ioctl (ls,SIOCSPGRP,&flag) ==
-1)
{ perror("non si assegna il process group alla socket");
exit(1);
}
In questo caso si consegna il segnale al solo processo che ne ha fatto
richiesta e si attiva lhandler solo per lui alla occorrenza del segnale di
SIGIO
Socket in C 113
56:28
Socket in C 114
58:00
Socket in C 115
59:45
O_NONBLOCK
01:02:36
PROGETTO SERVER
In UNIX il progetto del server pu essere molto flessibile, sia
concorrente multiprocesso, sia monoprocesso,
e anche con eventuali processi leggeri
e anche il client
Tipo di
Tipo
di comunicazione
comunicazione
con connessione
con
connessione
S
E
R
V
sequenziale
iterativo
iterativo
iterativo
concorrente
singolo
singolo
singolo
processo
processo
processo
E
concorrente
R Tipo di Server
multi
multi
concorrente
concorrente
multi
processo
processo
processo
senzaconnessione
senza
connessione
Molto diffusi: per servizi
poco pesanti
non affidabili
solitamente stateless
Molto diffusi:
servizi pesanti
e affidabili
Socket in C 117
Corso di
Reti di Calcolatori T
Implementazione RPC
Luca Foschini
Anno accademico 2012/2013
Implementazione RPC 1
Invocazione remota
della prodedura p
Host A
Host B
service daemon
listening
callrpc() with
request
Host
main
invoke service
client
waiting
dispatch service
procedure
Network
remote
procedure
return() answer
(p)
return() reply
request completed,
reply assembled
Implementazione RPC 3
Implementazione RPC 4
Semantica di interazione
A fronte di possibilit di guasto, il cliente pu
controllare o meno il servizio
maybe
at-least-once
at-most-once
exactly-once
(SUN RPC)
Architettura
Portmapper
consults
registers
Server
Client
realizza
procedura
invoca la procedura
argument
result
result
argument
Client Stub
Server Stub
realizza
supporto RPC
realizza
supporto RPC
request
message
reply
message
reply
message
request
message
Network
Implementazione RPC 6
OSI
Layers
User Application
6. Presentation
XDR
5. Session
RPC ritrasmissione
4. Transport
TCP
UDP
3. Network
IP
1-2.Data-link/Physical
Hardware Interface
Network
Implementazione RPC 8
Tralasciando per ora program e version (che vediamo dopo), questo pezzo
di codice definisce la procedura PRINTMESSAGE, con argomento di
tipo string e risultato di tipo int (intero)
In locale
# include <stdio.h>
main(argc,argv)
int argc;
char *argv[];
{ char *message;
if (argc !=2) {fprintf(stderr,"uso:%s <messaggio>\n", argv[0]); exit(1);}
message = argv[1];
if (! printmessage (message)){ /* chiamata locale servizio di stampa su video */
fprintf(stderr,"%s: errore sulla stampa.\n", argv[0]);
exit(1);
}
printf("Messaggio consegnato.\n");
exit(0);
}
printmessage (msg) /* procedura locale per il servizio di stampa su video. */
char *msg;
{ FILE *f;
f = fopen("/dev/console","w");
if (f == NULL) return(0);
fprintf(f,"%s\n",msg); fclose(f);
return(1);
Implementazione RPC 12
}
01:48
03:05
Interfaccia RPC
Diversi livelli di
astrazione
flessibilit
Implementazione RPC 17
05:38
SUN RPC
In caso di RPC SUN
Un programma tipicamente contiene pi procedure
remote
Sono previste anche versioni multiple delle procedure
Un unico argomento in ingresso ed in uscita per ogni
invocazione
11:30
Identificazione di RPC
Messaggio RPC deve contenere
numero di programma
numero di versione
numero di procedura
notare:
soluzione:
AGGANCIO DINAMICO
Autenticazione
Sicurezza identificazione del client presso il server e viceversa
sia in chiamata sia in risposta
Implementazione RPC 20
16:46
Descrizione
rnusers()
rusers()
rstat()
rwall()
getmaster()
getrpcport()
100000
100002
100002
100003
(port mapper)
(demone rstad)
(demone rusersd)
(demone nfsd)
Implementazione RPC 21
19:50
26:15
Implementazione RPC 23
29:20
problemi... 35:30
Riprende a 41:08
Inoltre: possibilit di
terminazione per
timeout
Semantica at-least-once
(default con UDP): prima
di dichiarare time-out, il
supporto RPC esegue
alcune ritrasmissioni in
modo trasparente
Implementazione RPC 25
41:20
43:27
45:17
Il risultato deve essere una variabile di tipo statico alla terminazione della
procedura per non essere deallocato come le variabili automatiche
Inoltre necessario registrare la procedura remota (dettagli dopo)
main(){
registerrpc (RPC5, VER5, PRC5, proc5, xdr_u_long, xdr_u_long);
svc_run();
/* attesa indefinita senza ritorno */ funzione (non primitiva) che mantien
fprintf(stderr,"Errore: svc_run ritornata!\n");
exit(1);
Implementazione RPC 28
}
49:55
Nodo 2
Nodo 1
Nodo 2
XDR
Nodo 3
Nodo 4
Nodo 3
Nodo 4
Standard (modello
OSI) porta alla
scelta del secondo
metodo:
XDR (Sun
Microsystems)
Implementazione RPC 29
50:46
Marshalling
P r ocesso clien t
In t er fa ccia RP C
In t er fa ccia RP C
P r ot ocollo XDR
P r ot ocollo XDR
Serializing
S e rv e r
Serializing
Cli e n t
Livelli di session e,
t r a spor to, r ete,
da t a lin k e fisico
F or m a t o XDR
Deserializing
Deserializing
Livelli di session e,
t r a spor t o, r ete,
da ta lin k e fisico
Implementazione RPC 30
52:30
Stream XDR
Per ogni informazione da trasmettere si hanno due
trasformazioni, una al mittente e una al destinatario sulla rete il
solo formato XDR
Client
Server
Ogni nodo deve
provvedere solamente le
proprie funzionalit di
trasformazione
dal formato locale a
quello standard
dal formato standard a
quello locale
Protocollo XDR
Deserializing
RES
Protocollo XDR
Serializing
Deserializing
ARG
ARG
xdr_arg
xdr_arg
RES
XDR1
xdr_res
Serializing
xdr_res
XDR2
Flussi XDR
Implementazione RPC 31
53:20
Funzioni di conversione
Funzioni built-in
Implementazione RPC 32
54:48
01:00:30
Implementazione RPC 34
01:00:45
01:01:00
Primitiva svc_run
Dopo la registrazione della procedura, il processo che ha eseguito la
primitiva registerrpc() deve rimanere in attesa di chiamate
Un server si comporta come un demone mettendosi in attesa di tutte le
possibili richieste attraverso la svc_run() che esprime la attesa infinita
del server e che non termina
Uso
di
processi
servitori
che
contengono i servizi (procedure), anche
pi di uno, e sono in attesa
Le
procedure
registrate
con
registerrpc() sono compatibili con
chiamate realizzate da primitive basate
su meccanismi di trasporto UDP senza
connessione, ma incompatibili con TCP
a stream
Implementazione RPC 36
01:02:30
struct mapping {
unsigned
unsigned
unsigned
unsigned
long prog;
long vers;
int prot; // uso costanti IPPROTO_UDP ed IPPROTO_TCP
int port; / corrispondenza con la porta assegnata
};
/* implementazione a lista dinamica della tabella */
struct *pmaplist { mapping map; pmaplist next;}
Implementazione RPC 37
01:04:46
PORT MAPPER
La gestione della tabella di port_map si basa su un processo unico per ogni
nodo RPC detto port mapper che viene lanciato come demone (cio in
background)
Implementazione RPC 38
01:07:25
Fine della Techno in Aula -.-"
Inserimento di un servizio
Eliminazione di un servizio
Corrispondenza associazione astratta e porta
Intera lista di corrispondenza
Supporto all'esecuzione remota
01:10:13
Cliente1
Cliente2
Gestore trasporto
Porta A
Creazione ed utilizzo di un
gestore di trasporto lato
client
Una struttura dati di supporto,
detta gestore di trasporto, viene
usata per tenere traccia e potere
comunicare con i potenziali
servitori
Gestore trasporto
Porta B
Implementazione RPC 40
01:11:06
Nodo SERVER
porta
Numero di porta
Porta A
Port mapper
porta 111
Gestore trasporto
Programma 1
Porta A
Dispatching
Servizi
Gestore trasporto
Porta B
Programma 2
Implementazione RPC 41
Numero di porta
Porta A
Cliente1
Cliente2
Port mapper
porta 111
Gestore trasporto
Gestore trasporto
Programma 1
Porta A
Porta A
Dispatching
Servizi
Gestore trasporto
Porta B
Gestore trasporto
Porta B
Programma 2
Implementazione RPC 42
01:13:20
Flusso di operazioni
per RPC in gestione
avanzata
La chiamata
svc_register() e la
svc_run() possono
essere implementate con
funzioni di pi basso
livello
Client
Creazione di un gestore di protocollo
che utilizza una socket per accedere al
meccanismo di trasporto UDP o TCP:
Server
Creazione di gestore di protocollo
che utilizza una socket per il
meccanismo di trasporto UDP o TCP:
clntudp_create() o
clntcp_create()
Chiamata alla procedura remota:
clnt_call()
svcudp_create() o
svctcp_create
pmap_unset()
clnt_perror()
Deallocazione del gestore:
clnt_destroy()
svc_register()
svc_run()
Implementazione RPC 43
01:16:40
/* socket associata */
/* numero di porta assoc.*/
/*
/*
/*
/*
/*
/*
ricezione richieste */
stato del trasporto */
legge gli argomenti */
invia una risposta */
libera memoria allocata */
distrugge la struttura */
/*
/*
/*
/*
/*
01:18:55
Implementazione RPC 45
01:19:53
/*
/*
/*
/*
/*
/*
numero di programma */
versione */
procedura richiesta */
credenziali */
credenziali di sola lettura */
gestore associato */
};
void
dispatch
(request, xprt)
struct svc_req *request;
SVCXPRT *xprt;
Implementazione RPC 46
01:20:30
01:20:55
xptr
prognum, versnum
dispatch
protocol
gestore di trasporto
identificazione della procedura
puntatore alla procedura di dispatching
tipo di protocollo
01:22:30
01:23:40
buffer di input e di
Implementazione RPC 50
01:25:40
tipo di argomenti
outproc
tipo di risultato
in
argomento unico
out
risultato unico
tout
01:27:00
clnt_perror
(clnt,s)
CLIENT * clnt;
char * s;
clnt
s
gestore di trasporto
stringa di output
Implementazione RPC 53
9:44 07.12.12
Esempio: NFS
19:30
RPCGEN processa
un insieme di costrutti descrittivi per tipi di dati e per le procedure remote linguaggio XDR
Client
Programma
principale
client
chiamata
locale
Server
comunicazione
attraverso
l'interfaccia RPC
chiamate
locali
Procedura 1
stub
client
stub
server
Procedura 2
Parti sviluppate direttamente dal programmatore
Implementazione RPC 55
20:42
Processo di sviluppo
Data una specifica di partenza
file di linguaggio XDR
esempio.x
RPCGEN produce in automatico
file di testata (header)
esempio.x
esempio.h
file stub del client
esempio_clnt.c
file stub del server
esempio_svc.c
file di routine XDR
esempio_xdr.c
client.c
CC
client.o
esempio_clnt.o
esempio_clnt.c
client
CC
CC
esempio.h
esempio_xdr.o
RPCGEN
CC
esempio_xdr.c
esempio_svc.c
esempio_svc.o
CC
CC
server
esempio_proc_svc.c
CC
eempio_proc_svc.o
Implementazione RPC 56
27:05
namenode
namelist
name
string
next
Implementazione RPC 57
34:58
FILE .x OSSERVAZIONI
Prima parte del file definizioni XDR
delle costanti:
dei tipi di dati dei parametri di ingresso e uscita per cui per tutti i tipi di dato per i quali
non esiste una corrispondente funzione built-in
35:24
36:32
Implementazione RPC 60
37:35
38:27
Implementazione RPC 62
40:14
/*funzione di dispatching */
42:42
->66
52:10
main(argc,argv)
int argc; char *argv[];
{
CLIENT *cl; namelist nl;
char *server; char *dir; readdir_res *result;
if (argc!=3) {fprintf(stderr,"uso: %s <host> <dir>\n",argv[0]);
exit(1);
}
server = argv[1]; dir = argv[2];
cl = clnt_create(server, RLSPROG, RLSVERS, "tcp");
if (cl==NULL) { clnt_pcreateerror(server); exit(1); }
result= readdir_1(&dir,cl);
if (result==NULL) { clnt_perror(cl,server);exit(1); }
if (result->remoteErrno!=0) {
perror (dir); exit(1);}
/* stampa risultati */
for (nl=result->readdir_res_u.list; nl != NULL; nl = nl->next )
printf("%s\n",nl->name);
Implementazione RPC 66
}
OSSERVAZIONI
Creazione del gestore di trasporto per il client
CLIENT * clnt_create (host, prog, vers, protocol)
char *host; u_long prog,vers; char *protocol;
host
prog
vers
protocol
01:00:40
Implementazione RPC 68
01:01:37
Variabili static
Quali effetti produce la keyword static e perch
necessario dichiarare il risultato come variabile static?
Visibilit
sono visibili dove sono state definite: funzioni o moduli (file)
ma non sono visibili allesterno
low memory
Tempo di vita
CODE SEGMENT
allocazione globale
tempo di vita pari al programma
DATA SEGMENT
res
HEAP
STACK
high memory
Implementazione RPC 69
Implementazione RPC 70
01:03:45
Generalit XDR
Dichiarazioni di tipi atomici del linguaggio C con aggiunte
bool con due valori: TRUE e FALSE tradotto nel tipo bool_t con
Ad esempio:
01:06:20
Dichiarazione di matrici
In XDR non possibile definire direttamente strutture innestate, ma
bisogna sempre passare per definizioni di strutture intermedie
Ad esempio, la definizione della seguente struttura dati (matrice) non viene
interpretata correttamente da rpcgen che ritorna errori e non riesce a terminare:
struct MatriceCaratteri{ char matrice [10][20]; };
Mentre passando da una struttura dati intermedia, si come quella qui sotto,
rpcgen termina correttamente:
struct RigaMatrice{ char riga [20]; };
struct MatriceCaratteri{ RigaMatrice riga [10]; };
Si facciano alcune prove scrivendo i file .x e generando i file per le trasformazioni
dati e i file .h con rpcgen ...
Implementazione RPC 73
->
Si pu
specificare la lunghezza massima del vettore, oppure
lasciare la lunghezza arbitraria
Ad esempio:
typedef int heights <12>;
tradotto da RPCGEN in: struct { u_int heights_len; int *heights_val; } heights;
typedef int widths <>;
tradotto da RPCGEN in: struct { u_int widths_len; int *widths_val; } widths;
Implementazione RPC 74
listitem *next;
struct-definition:
"struct" struct-ident "{"
declaration-list
"}"
struct coordinate {
int x;
Struttura C
struct coordinate {
int x;
int y;
int y;
};
};
declaration-list:
declaration ";"
declaration ";" declaration-list
Implementazione RPC 75
Unione XDR
union read_result switch (int errno)
{
case 0: opaque data[1024];
default: void;
};
Unione C
struct read_result {
int errno;
union { char data[1024];
};
} read_result_u;
case-list:
"case" value ":" declaration ";"
"default" ":" declaration ";"
"case" value ":" declaration ";"
case-list
Enumerazione XDR
enum colortype {
RED = 0,
GREEN = 1,
BLUE = 2
};
enum-value-list:
enum-value
enum-value "," enum-value-list
Enumerazione C
enum colortype {
RED = 0,
GREEN = 1,
BLUE = 2
};
typedef enum colortype colortype;
Implementazione RPC 76
Costante XDR
Costante macro-processore C
#define MAXLEN 12
const-definition:
"const" const-ident "=" integer
Ad esempio, nella specifica di dimensione di un vettore
typedef-definition:
"typedef" declaration
Definizione C di tipo
Implementazione RPC 77
identificatore
unico
del
servizio offerto
modalit
d'accesso
alla
procedura
mediante
i
parametri di chiamata e di
risposta
program TIMEPROG {
version TIMEVERS {
usigned int TIMEGET(void) = 1;
} = 44;
program-definition:
"program" program-ident "{"
version-list
Implementazione RPC 78
01:09:40
79
01:13:50
Implementativamente:
impiego del protocollo TCP
valore nullo del timeout nella primitiva clnt_call()
i due parametri del cliente:
risultato NULL e funzione XDR xdr_void in clnt_call()
manca la chiamata svc_sendreply() al termine del servizio
Implementazione RPC 81
asincrono
Esempio
Una serie di chiamate asincrone per la stampa di stringhe
(procedura PRINTSTRING_BATCHED) sul nodo remoto: si termina
con una chiamata sincrona alla procedura nulla (NULLPROC)
che blocca il client fino alla ricezione dellavvenuta esecuzione della
richiesta di NULLPROC accodata dopo le richieste di
PRINTSTRING_BATCHED.
Client
Invio PRINTSTRING_BATCHED (string1)
Invio PRINTSTRING_BATCHED (string2)
string1
string2
stringN
Implementazione RPC 82
Client 1/3
#define PROG (unsigned long) 0x20000020
#define VERS (unsigned long) 1
#define PRINTSTRING_BATCHED (unsigned long) 2
#include <stdio.h>
#include <rpc/rpc.h>
#include <sys/socket.h>
#include <time.h>
#include <netdb.h>
main(argc,argv)
int argc; char *argv[];
{ struct hostent *hp;
struct timeval total_timeout;
struct sockaddr_in server_addr;
int sock = RPC_ANYSOCK;
register CLIENT *client;
enum clnt_stat clnt_stat;
char buf[BUFSIZ], *s=buf;
if (argc<2)
{fprintf(stderr,"uso: %s hostname\n",argv[0]);
exit(1);}
Implementazione RPC 83
Client 2/3
if ((hp=gethostbyname(argv[1]))==NULL)
{fprintf(stderr,"non ho informazioni su %s\n", argv[1]);exit(1);}
memcpy((caddr_t)&server_addr.sin_addr, hp->h_addr, hp->h_length);
server_addr.sin_family=AF_INET; server_addr.sin_port=0;
/* gestore TCP */
if((client=clnttcp_create(&server_addr, PROG,VERS, &sock,0,0))==NULL)
{clnt_pcreateerror ("clnttcp_create\n"); exit(1);}
/* il timeout sulla risposta RPC posto a zero */
total_timeout.tv_sec=0;
total_timeout.tv_usec=0;
Client 3/3
3/3
/* Ultima chiamata RPC sincrona per svuotare completamente
il buffer TCP */
total_timeout.tv_sec=20;
/* NB: timeout non nullo!! */
/* Chiamata sincrona di NULLPROC */
clnt_stat = clnt_call(client,NULLPROC, xdr_void, NULL,
Implementazione RPC 85
Server 1/3
#define PROG (unsigned long) 0x20000020
#define VERS (unsigned long) 1
#define PRINTSTRING (unsigned long) 1
#define PRINTSTRING_BATCHED (unsigned long) 2
#include <stdio.h>
#include <rpc/rpc.h>
void printdispatch();
main()
{ SVCXPRT *transp;
transp= svctcp_create(RPC_ANYSOCK,0,0);
/* il gestore TCP */
if (transp==NULL)
{fprintf(stderr,"cannot create an RPC server\n"); exit(1);}
pmap_unset(PROG,VERS);
if (!svc_register(transp, PROG, VERS, printdispatch, IPPROTO_TCP))
{fprintf(stderr,"cannot register PRINT service\n"); exit(1); }
svc_run();
fprintf(stderr,"uscita dal ciclo di attesa di richieste!\n");
Implementazione RPC 86
}
Server 2/3
void printdispatch (rqstp, transp)
struct svc_req *rqstp; SVCXPRT *transp;
{ char *s=NULL;
switch (rqstp->rq_proc) {
case NULLPROC:
if (!svc_sendreply(transp, xdr_void,0))
{ fprintf(stderr,"non posso rispondere.\n"); exit(1);
}
fprintf(stderr,"Fine!\n");
return;
case PRINTSTRING_BATCHED:
if (!svc_getargs(transp, xdr_wrapstring, &s))
{fprintf(stderr, "problemi decodificare argomenti.\n"); break; }
fprintf(stderr,"%s\n",s);
/* questo un servizio asincrono: non c' svc_sendreply() */
break;
default:
svcerr_noproc(transp); return;
}
Implementazione RPC 87
Server 3/3
3/3
svc_freeargs(transp,xdr_wrapstring,&s);
/* funzione di basso livello per deallocare
acquisiti con la chiamata svc_getargs() */
}
gli
argomenti
Implementazione RPC 88
Bibliografia
J. Bloomer, Power Programming with RPC, Ed. OReilly (1992)
Implementazione RPC 89
Corso di
Reti di Calcolatori T
Sistemi RPC e sistemi di Nomi
Antonio Corradi
Anno accademico 2012/2013
RPC e Sistemi di nomi 1
1:37
RPC: PROPRIET
PROPRIET
Remote Procedure Call
consente il controllo dinamico del tipo dei parametri e del risultato
include il trattamento dei parametri di ingresso / uscita dal cliente al
servitore (e viceversa) detto marshalling o almeno serializzazione
(livello di presentazione: marshalling)
3:20
RPC STORIA
Prima sistemazione dovuta a Birrel e Nelson (1984)
partendo da quanto usato in Xerox, Spice, Sun, HP, etc.
Molte implementazioni
Default: cliente sincrono
bloccante
Nodo A
Cliente
call
wait
Nodo B
call
risultato
Server
ricezione
ritorno
CLIENTE
SERVITORE
send
get-request <operazione>
wait
send-reply
si devono anche prevedere trasformazioni di dati, nomi, controllo, ...
RPC e Sistemi di nomi 4
4:03
RPC PRIMITIVE
Ogni sistema usa primitive diverse Nodo A
senza troppe regole standard
Cliente
call
servizio
(param...)
Nodo B
parametri
risultato
Server
getrequest
sendreply
5:36
6:05
mai in RPC
Invece, in caso di crash del cliente, si devono trattare orfani sul nodo
servitore, ossia i processi in attesa di consegnare risultato
Politiche tipiche
- sterminio: ogni orfano risultato di un crash viene distrutto
- terminazione a tempo: ogni calcolo ha una scadenza, oltre la quale
automaticamente abortito
- reincarnazione (ad epoche): tempo diviso in epoche; tutto ci che
relativo alla epoca precedente obsoleto e distrutto RPC e Sistemi di nomi 7
8:44
HP-UX, Sun
Sistemi UNIX compatibili,
Novell Netware
Clie nt
Se rve r
chiamata
callrpc()
ser vizio
r itor no
r isposta
r ichiesta completata
9:24
P r ogr a m m a clien t
P r ocedu r a ser ver
Gli stub sono forniti
In t er fa ccia
In t er fa ccia
dall'implementazione e
St u b del clien t
St u b del ser ver
generati automaticamente
Le parti logiche di programma
RP C r u n -t im e
RP C r u n -t im e
sono "del tutto" inalterate
ci si dirige verso lo stub
che nasconde le operazioni COSTO: due chiamate per RPC
Mercury ottimizza i messaggi con stream di chiamate
10:17
Server
Programma client
Procedura server
Interfaccia
Interfaccia
RPC run-time
RPC run-time
10:42
salto a slide 17
e ritorno
Lo sviluppo prevede
la massima trasparenza
STUB prodotti in modo automatico
Lutente finale progetta e
si occupa solo delle reali parti
applicative e logiche
Client
Server
Programma client
Procedura server
Interfaccia
Interfaccia
RPC run-time
RPC run-time
11:40
stub servitore:
< attesa della richiesta>
<unmarshalling argomenti>
invoca operazione locale
ottieni risultato
<marshalling del risultato>
<send risultato>
fine stub servitore;
operazione(parametri)
Server
Risultato
Server
stub
Cliente
stub
MSG
richiesta
valore
Risultato
Argomenti
MSG
richiesta
MSG
risposta
protocollo
RPC
MSG
risposta
protocollo
RPC
TCP/IP
RPC e Sistemi di nomi 13
13:39
PASSAGGIO di PARAMETRI
I parametri devono passare tra ambienti diversi
passaggio per valore o per riferimento
Trattamento default dei parametri per valore
impaccamento dei parametri (marshalling) e disimpaccamento
(unmarshalling) con dipendenza dal linguaggio utilizzato
Per tipi primitivi o una entit con valori privati
marshalling / unmarshalling per la presentazione
Per tipi utente costruiti e dinamici, ad esempio, una lista o un albero
e la memoria dinamica (?) la logica guida la trasformazione
si deve (?) copiarla o (?) muoverla e ricostituirla sul server per poi
riportarla sul nodo iniziale
PASSAGGIO di PARAMETRI
Passaggio parametri dal cliente al servitore
nel caso di passaggio per valore
passaggio con trasferimento e visita (valore perso sul server)
nel caso di passaggio per riferimento
passaggio senza trasferimento ma rendendo loggetto remoto
uso di oggetti che rimangono nel nodo di partenza e devono essere
identificati in modo unico nell'intero sistema
Se si vuole riferire un entit del cliente, si passa il riferimento alla
stessa entit che i nodi remoti possono riferire attraverso RPC
Per esempio, un oggetto che sia gi in uso sul nodo del cliente deve
potere essere riferito dal nodo servitore e cambiato in stato senza
interferire con luso locale delloggetto
RPC e Sistemi di nomi 15
15:35
16:33
17:50
SUN
XDR
primo esempio di standard interno
OSF
DCE IDL
ANSA
ANSAware
HP
NCS IDL
CORBA IDL
Le differenze hanno generato dibattiti e confronti anche accesi,
spentisi visti gli scope limitati dei linguaggi stessi
RPC e Sistemi di nomi 18
Mancanza di standard
18:32
ESEMPIO di XDR
XDR eXternal Data Representation
Il formato XDR definisce le operazioni remote e tutto quello che
necessario conoscere per la generazione di stub (parametri)
Lutente deve sviluppare un file di descrizione logica dei servizi offerti da
cui si possono generare gli stub
Si prevedono pi servizi in versioni diverse e tipi primitivi e anche
definiti dallutente
file msg.x
program MESSAGEPROG {
version MESSAGEVERS {
int PRINTMESSAGE(string) = 1;
} = 1;
} = 0x20000013;
RPC e Sistemi di nomi 19
19:00
DA IDL A STUB
Gli IDL hanno lo scopo di supporto allo sviluppo dell'applicazione
permettendo di generare automaticamente gli stub dalla interfaccia
specificata dall'utente
Strumento RPCGEN (Remote Procedure Call Generator)
compilatore di protocollo RPC per generare procedure stub
RPCGEN produce gli stub per il server e il client da un insieme di
costrutti descrittivi per tipi di dati e per le procedure remote in linguaggio
RPC
Server
Client
Programma
principale
client
chiamata
locale
comunicazione
attraverso
l'interfaccia RPC
chiamate
locali
Procedura 1
stub
client
Parti fornite da RPCGEN
Parti sviluppate direttamente dal programmatore
stub
server
Main
Procedura 2
20:08
21:30
RPC BINDING
binding delle entit
Il binding prevede come ottenere l'aggancio corretto tra i clienti e il server
capace di fornire la operazione
BINDING
24:40
27:35
BINDING RPC
Parte di NAMING statica, SERVIZIO
risolto con un numero associato staticamente alla interfaccia del servizio
(nomi unici)
Programma cliente
Procedura servitore
Interfaccia
Interfaccia
RPC run-time
RPC run-time
Comunicazione di rete
30:00
SISTEMI di NOMI
Le RPC hanno portato a molti sistemi di nomi, detti Binder, Broker,
Name Server, ecc, tutte entit di sistema per il binding dinamico
Un binder deve fornire operazioni per consentire agganci flessibili
lookup
(servizio, versione, &servitore) funzione pi usata
register
(servizio, versione, servitore)
unregister (servizio, versione, servitore)
Il nome del servitore (servitore) pu essere dipendente dal nodo di
residenza o meno
se dipendente, allora ogni variazione deve essere comunicata al binder
NO
CONTROLLO e ASINCRONICIT
ASINCRONICIT
Necessit di RPC asincrone, o meglio non bloccanti
il cliente non si blocca ad aspettare il servitore
NO
RPC ASINCRONE
Implementativamente, si usano sia supporti UDP o TCP, ottenendo
semantiche diverse
Realmente asincrone (senza risultato)
Athena (XWindows)
usa UDP e bassa latenza - semantica may-be
SUN
usa TCP ad elevato throughput - semantica at-most-once
invio di una serie di RPC asincrone e di una finale in batching
29
PROPRIET
PROPRIET
delle RPC
Analisi delle propriet di ogni sistema RPC
propriet visibili all'utilizzatore
entit che si possono richiedere operazioni o metodi di oggetti
semantica di comunicazione
maybe, at most once, at least once
modi di comunicazione
a/sincroni, sincroni non bloccanti
durata massima e eccezioni
ritrasmissioni e casi di errore
propriet trasparenti all'utilizzatore
ricerca del servitore
uso di sistemi di nomi con broker unico centralizzato / broker multipli
presentazione dei dati
linguaggio IDL ad hoc e generazione stub
passaggio dei parametri
passaggio per valore, per riferimento
RPC di SUN
RPC di SUN con visione a processi e non trasparenza allocazione
operazioni richieste al nodo del servitore
SI
RMI di JAVA
RMI in Java
visione per sistemi ad oggetti passivi con trasparenza alla allocazione (?),
senza eterogeneit, e con scelte che non privilegiano la efficienza
entit da richiedere
metodi di oggetti via interfacce
semantica di comunicazione at-most-once (TCP)
modi di comunicazione
solo sincroni
durata massima e eccezioni trattamento di casi di errore
ricerca del servitore uso di registry nel sistema broker unico centrale
non sono forniti broker multipli (distribuiti?) ma si possono anche
avere organizzazioni pi complesse
presentazione dei dati
generazione stub e skeleton
passaggio dei parametri
passaggio a default per valore,
passaggio per riferimento di oggetti con interfacce remotizzabili
eventuali legami con le risorse del server e aggancio con il sistema di
sicurezza, e aggancio con il garbage collector
RPC e Sistemi di nomi 32
30:50
SISTEMI di NOMI
Spesso nei sistemi distribuiti siamo in presenza di molto sistemi di
nomi che hanno molte propriet e sono anche molto diversi
Propriet di base dei Sistemi di NOMI
generalit
variet dei nomi disponibili e trattati
distribuibilit
uso di direttori partizionati
e/o replicati
Computer 1A
Computer 1B
Nome di
utente
Nome del
processo
Processo
Nome di
utente
Nome di
sistema
Nome del
processo
Indirizzo
Nome di
sistema
Porte di
processo
Porte di
comunicazione
Computer_id
Indirizzo
Network A
Porte di
comunicazione
Computer_id
Computer 1B
Route
Computer 2A
Computer 3A
Gateway 1
Computer 2B
Gateway 2
user-friendliness
nomi facili per lutente
Processo
Porte di
processo
Network B
Computer 3B
Gateway 3
Computer 1C
Computer 2C
NOMI
Problema fondamentale nel distribuito la necessit di ritrovare (cio
identificare) le altre entit nel sistema
Complessit del problema e difficolt di soluzioni generali
37:00
LIVELLI di NOMI
Spesso si possono considerare alcuni livelli di nomi per il distribuito
NOME in tre possibili livelli (Shock)
nome
LOGICO esterno
indirizzo FISICO
route
organizzazione per la raggiungibilit
nome specifica quale oggetto (entit) si riferisce e denota la entit
indirizzo specifica dove l'oggetto risiede e lo riferisce dopo un binding
route specifica come raggiungere l'oggetto
Funzioni di corrispondenza o MAPPING per passare da una forma
ad unaltra e per aiutare lutente finale
- mapping nomi
indirizzi
- mapping indirizzi
route
I nomi scelti dall'utente, gli indirizzi assegnati dal sistema
lutente deve specificare nomi e ritrovare route
RPC e Sistemi di nomi 35
SISTEMI di NOMI
SPAZI dei NOMI pi usati
piatto (flat)
con nessuna struttura, ma adatto per pochi utenti e poche entit
partizionato
gerarchia e contesti (DNS), ad esempio, deis33.deis.unibo.it
descrittivo
con riferimento ad una struttura di oggetto caratterizzato da attributi per
identificare la entit corrispondente (OSI X.500)
username e password
attributi con liste di valori (rigidi o meno)
antonio, acorradi
Chi distribuisce i nomi? Problemi nel caso di molti servitori di nome
Partizionato
deis33.cineca.it
deis33.deis.unibo.it
Ogni responsabile di partizione mantiene e distribuisce i nomi
Descrittivo
Nomi di gruppo
IP classe D
Ogni gruppo individua un insieme di entit denotate dal nome stesso
anche molto lontane, poco correlate, e spesso non gestite dallo stesso
servitore di nomi
Necessit di una infrastruttura di supporto al gruppo
RPC e Sistemi di nomi 37
COMPONENTI: COMUNICAZIONE
Nelle realizzazioni con molteplici Name Server il servizio prevede
una comunicazione tra loro, usando
- messaggi singoli, o datagrammi
- connessioni
- invocazioni di alto livello come RPC
Il traffico tra i diversi Name Server deve essere supportato mentre si
continua a fornire il servizio
RISOLUZIONE NOMI
Per la Risoluzione dei nomi, le richieste dal cliente devono fluire fino
al server che pu dare risposta
Il processo di risoluzione dei nomi per dare una risposta prevede
alcune fasi (non sempre presenti)
- trovare la autorit corretta
- verificare le autorizzazioni alla operazione
- eseguire la operazione
Ogni nodo specifica i name server noti e tende a limitare se possibile
le comunicazioni tra i server
Strategie usuali per limitare i costi sono:
- Politiche di caching
- Politiche di route tra server
- Creazione di contesti o vicinati tra i server
- Propagazione di conoscenza tra vicini
RPC e Sistemi di nomi 42
Name
server
Name
server
Name
server
Name
server
Name
server
Name
server
Name
agent
Name
server
Name
agent
Name
server
Name
server
Name
server
Name
server
Name
agent
(chemminchiadico?!)
ISO
TITLE
X.500
9594-1
X.501
9594-2
Models
X.509
9594-8
Authentication Framework
X.511
9594-3
X.518
9594-4
X.519
9594-5
Protocol Specifications
X.520
9594-6
X.521
9594-7
X.525
9594-9
Replication
53:15
DIRECTORY X.500
X.500 un insieme di standard di nomi, articolato e completo
La base linsieme delle informazioni che caratterizzano la struttura
di directory, organizzate in un albero logico detto Directory
Information Tree (DIT) a formare il Directory Information Base (DIB),
L'albero logico costruito in base al valore di attributi del tutto liberi
e a scelta dellutente
Root node
Country =AU
Organization =
ABC Ltd
Org. Unit =
Sales
Common Name
= F. Jones
Country=US
Locality =
New York
Country=It
Organization =
ABC Ltd
Common Name
= A. Chew
Org. Unit =
Production
Common Name
Common Name
J. Smart
= Fax Machine
RPC e =Sistemi
di nomi
45
59:18
59:20
Le operazioni previste
sono molte
La prima il bind con il
directory poi ricerche frequenti
e cambiamenti rari
La interfaccia con il direttorio
anche molto complessa tenendo
conto anche della
durata delle operazioni
RPC e Sistemi di nomi 48
DIRECTORY e NON DB
Obiettivo di un directory mantenere informazioni su un insieme di
risorse eterogene per un ambiente evitando duplicazioni di
informazioni e problemi di sincronizzazione e consentendo
una capacit espressiva ampia ed estendibile
una gestione anche molteplice con pi autorit per parti
una sicurezza anche partizionata e differenziata
USO di DIRECTORY
i Directory sono tipicamente usati (vedi costo) per rappresentare
entit eterogenee, come persone, risorse, servizi, server, ...
In generale, per informazioni concettuali che rappresentano la gestione di
oggetti comuni in un ambiente condiviso
i certificati per autenticare e autorizzare accesso
Directory
PROTOCOLLI DI DIRECTORY
Un servizio di directory garantisce le propriet di QoS, ossia di
replicazione, sicurezza, gestione multiserver, ..., tutto il supporto per
memorizzare le informazioni organizzate prevedendo molti accessi in
lettura e poche variazioni
UPnP (Universal Plug-and-Play) Standard per architetture Microsoft
Servizi di Nomi basati su variazioni di DAP (o LDAP)
Windows2000 propone Active Directory come un servizio di direttori
integrato nel e per il sistema operativo
PROTOCOLLI DI DISCOVERY
Per computazione distribuita e cooperativa in ambito locale
Una unit deve ritrovarne altre, in modo veloce e economico
si prevedono azioni come il broadcast e solleciti periodici
1 Richiesta Multicast
Rete Locale
Jini Service
2R
Jini Client
isp
o st
ad
el L
oo
kup
Se
rvic
Lookup Service
p
Ris
ost
ad
el L
oo
S
ku p
e rv
ice