PERMESSO PERsistent MESSagging in ad hOc networks Melli Michele Sommario Il progetto mira allo sviluppo di un servizio di messaggistica istantanea per dispositivi portatili, come laptop, PDA o smart phone connessi ad una MANET (Mobile Ad hoc NETwork). In questa relazione si discuterà del modello di comunicazione messo a disposizione da PERMESSO ad un utente che desideri inviare un messaggio ad un destinatario al momento disconnesso (messaggistica asicrona). In particolar modo si analizzerà il caso in cui nella rete è presente un dispositivo che fornisce funzioni di supporto a questo tipo di comunicazione (Persistent Server). 1. Introduzione Le Mobile ad hoc networks (MANETs) rappresentano sistemi distribuiti complessi in cui dispositivi mobili possono liberamente organizzarsi in arbitrarie e temporanee topologie di rete “ad-hoc”, fornendo alle persone e ai dispositivi la percezione di operare collegati con altri dispositivi o persone in aree in cui non esistono infrastrutture fisse di comunicazione. Considerando l’instabilità dei canali di comunicazione wireless e le possibilità di movimento degli utenti, tali reti risultano estremamente dinamiche. In questa topologia di architettura devono essere rivalutate la semantica e le proprietà della comunicazione, in quanto inevitabilmente si tratta di sistemi orientati a dinamiche di tipo best-effort in cui sono frequenti le perdite di messaggi e le cadute temporanee dei nodi. I vantaggi introdotti dalle MANETs sono tuttavia notevoli perché forniscono caratteristiche non ottenibili dalle reti “classiche” come la proprietà di non richiedere alcun server centrale, né cablaggi di cavi o access point. Per realizzare PERMESSO si è utilizzato una Java Virtual Machine ridotta (J2ME) con la configurazione minima (CLDC 1.0 e MIDP 2.0) adatta a dispositivi mobili e con capacità computazionali e di memorizzazione limitate. Questa scelta di progetto ha portato a dover implementare funzionalità come la serializzazione dei dati da inviare e il supporto dell’affidabilità visto che l’unico protocollo di trasporto messo a disposizione dall’ambiente di sviluppo è l’invio di pacchetti UDP. Si è supposto che tutti i nodi appartenenti alla Manet siano a distanza 1-hop e che ci sia reciproca visibilità tra i partecipanti. La comunicazione tra i dispositivi avviene tramite l’interfaccia wireless 802.11. 2. PERMESSO Il progetto è articolato in tre moduli: DISCOVERY: Si occupa di gestire l’ingresso e l’uscita dalla chat di un utente e di comunicare questo evento agli altri partecipanti. Il discovery è realizzato da un Primary Master che, una volta intercettato il messaggio d’ingresso inviato in broadcast dal nuovo entrato, aggiorna la sua lista dei nodi online e periodicamente la invia a tutti i partecipanti, stessa cosa accade per l’uscita. Inoltre si occupa di controllare se qualche nodo è caduto o uscito dal range di copertura della MANET abbandonando quindi il sistema senza avvisare. Il ruolo di Primary Master può essere ricoperto da un qualunque partecipante alla chat; per non caricare a lungo un singolo nodo si è deciso di far ruotare il ruolo fra i presenti. Per far fronte all’ipotesi di guasto singolo si è deciso di replicare questo ruolo nominando un Secondary Master. CHAT SINCRONA: Fornisce le funzionalità di messagistica istantanea tra due utenti appartenenti alla stessa MANET. Ricevuta la lista dei nodi online, un utente identifica tra questi i nodi “amici” (la relazione di amicizia è considerata biunivoca) con i quali, dopo avere effettuato un protocollo di hand-shaking, può scambiare messaggi di testo. Gestisce inoltre la possibilità di effettuare più comunicazione sincrone contemporaneamente. Per garantire la reliability del servizio è prevista la ritrasmissione dei messaggi persi. Si è scelto di ricorrere all’utilizzo del cumulative ack in quanto, visto il notevole numero di messaggi che vengono trasmessi con questo servizio, garantisce un minor overhead rispetto al single ack. CHAT ASINCRONA: Gestisce il caso in cui si vuole inviare un messaggio ad un utente che in quel momento non è connesso alla MANET. Per questo servizio sono previste due modalità di funzionamento: La prima prevede la presenza di un nodo particolare, chiamato Persistent Server, che si occupa di raccogliere i messaggi asincroni e di recapitarli ai destinatari quando entrano nella MANET. La seconda prevede la memorizzazione dei messaggi asincroni da parte del mittente in attesa dell’ingresso del destinatario. Se il mittente decide di uscire dalla chat o finisce lo spazio di memoria disponibile (abbiamo a che fare con dispositivi con capacità di memorizzazione limitate) esegue un algoritmo di elezione per trovare un nodo adatto a cui affidare i messaggi. 3. Servizio di Chatting Asincrono 3.1 Persistent Server Il Persistent Server non è stato implementato come un dispositivo dedicato solo alla ricezione, alla memorizzazione e al delivery dei messaggi asincroni. E’ stata prevista un’unica tipologia di dispositivo e la possibilità di attivare un flag che condiziona il funzionamento del nodo in varie fasi . Quando entra un nuovo utente il Persistent Server dovrà avvisarlo della sua presenza e inviare eventuali messaggi asincroni a lui destinati. A differenza degli altri nodi il Persistent Server attiva un thread in più (il Persistent Thread) che si occupa di ricevere su una porta dedicata tutti i messaggi asincroni inviati all’interno della rete. L’utente che utilizza il dispositivo scelto per il ruolo di Persistent Server sarà quindi in grado di usufruire dei servizi di chatting sincrono e asincrono; a differenza degli altri utenti non spedirà i messaggi asincroni ma li memorizzerà in locale. Si è fatta l’ipotesi che il Persistent Server abbia una capacità di memorizzazione superiore rispetto gli altri nodi, per questo non è stata imposta nessuna limitazione sul numero di messaggi che il dispositivo è in grado di memorizzare. 3.2 Percezione della presenza del Persistent Server Un nodo che desidera entrare nel sistema come prima cosa invia in broadcast un messaggio di tipo ENTERED. Questo messaggio non serve solamente al servizio di discovery ma viene intercettato anche dal Persistent Server il quale dovrà comunicare al nuovo entrato la sua presenza. Questo avviene inviando un messaggio di tipo PERSISTENT al nodo entrato il quale setta a true un boolean di presenza del Persistent Server che condizionerà il comportamento durante l’invio di messaggi asincroni. Dal messaggio viene inoltre estratto l’ip del nodo Persistent Server. Sia il messaggio ENTERED sia quello PERSISTENT vengono inviati sulla MAIN_PORT usata per il discovery e vengono gestiti in ingresso da un dispatcher thread. Fig.1: Protocollo per la percezione della presenza del Persistent Server Si è scelto di utilizzare questo semplice protocollo per non caricare ulteriormente la fase di discovery nella quale il dispositivo riceve e invia un gran numero di messaggi. La fase che fornisce la percezione della presenza del Persistent Server necessita però di maggior affidabilità visto che è fondamentale per il corretto funzionamento del servizio di chatting asincrono. Si è quindi deciso di inserire un successivo controllo sulla presenza del Persistent Server : se il nodo client, terminato il protocollo illustrato in precedenza, non riceve nessun messaggio dal Persistent Server, invia un messaggio in broadcast del tipo PERSISTENT REQ e attiva un thread (Persistent Presence Thread) incaricato di ricevere eventuali risposte su una porta dedicata (PERSISTENT CONFIRM PORT) diversa dalla MAIN PORT notevolmente congestionata dai messaggi utilizzati per il discovery. Il messaggio PERSISTENT REQ viene mandato verso la ASYNC PORT sulla quale il Persistent Thread del server è in ascolto per ricevere i messaggi asincroni. La risposta di conferma è un messaggio del tipo PERSISTENT come quello visto in precedenza che fa terminare il Persistent Presence Thread e rende cosciente il nodo della presenza del Persistent Server e di come raggiungerlo. Fig.2: Secondo protocollo per la percezione della presenza del Persistent Server Nel caso in cui il Persistent Server non sia presente all’interno della rete e quindi non possa rispondere al Persistent Presence Thread, e stato predisposto un timeout dopo il quale il thread termina e il dispositivo si rende conto di essere in una situazione in cui i nodi devono gestire autonomamente il servizio di chatting asincrono. Nella realizzazione di questa funzionalità si sono riscontrate alcune complicazioni in quanto la versione della J2ME utilizzata non prevedeva il timeout sulla connessione. Si è quindi pensato di utilizzare un thread separato (Killer Thread) che ha il compito di forzare l’uscita dalla receive che altrimenti risulterebbe bloccante per il Persistent Presence Thread. Fig.3: Secondo protocollo: caso senza Persistent Server 3.3 Invio lato Client e ricezione lato Server di messaggi asincroni L’utente che vuole mandare un messaggio asincrono per prima cosa seleziona dalla lista degli utenti amici il destinatario, poi scrive il testo in una Chat Form. La form è dello stesso tipo quella utilizzata per il servizio sincrono ma in questo caso prima dell’apertura non si effettua il protocollo di hand-shaking (v. relazione di Bonsi Valentina). Il messaggio (di tipo ASYNC MESS) viene spedito verso l’ ASYNC PORT del Persistent Server. Da notare la differenza tra l’indirizzo del destinatario della datagram UDP (usato per recapitare il messaggio al Persistent Server) e il campo receiver inserito all’interno del messaggio (usato dal Persistent Server per effettuare il successivo delivery al destinatario finale). Fig.4: Interfaccia grafica per l’invio di messaggi asincroni Lato server il Persistent Thread è sempre in ascolto e appena riceve un messaggio ASYNC MESS lo salva in memoria. Il mittente numera i messaggi di ogni singola sessione di comunicazione asincrona in modo crescente. Il destinatario finale ad ogni ricezione ridisegna la Chat Form inserendo i messaggi nell’ordine corretto. Ci si può trovare quindi in una situazione in cui al destinatario viene temporaneamente visualizzato un messaggio nonostante non sia ancora arrivato un’altro che lo precede. Questa situazione avviene raramente poiché il Persistent Server invia i messaggi in modo ordinato; può comunque accadere che un messaggio vada perso e che la ritrasmissione avvenga in un secondo momento. Un ordinamento FIFO è più che sufficiente in questo caso, non è necessario ricorrere all’utilizzo di timestamp fisici o logici in quanto dobbiamo ordinare messaggi provenienti da un unico mittente e che non hanno tra loro una relazione di tipo causale. 3.4 Delivering dei messaggi asincroni Un nodo, terminata la fase di discovery, come prima cosa chiede al Persistent Server se ha in memoria messaggi asincroni per lui mandando sulla MAIN PORT un messaggio del tipo ASYNC REQ dal quale il server estrae l’identificatore univoco del nodo e lo utilizza per avviare una ricerca in memoria. Se trova messaggi asincroni indirizzati al nodo, li spedisce e avvia un thread per garantire affidabilità al servizio; questo argomento verrà trattato nel paragrafo seguente. Il protocollo di richiesta di messaggi asincroni è lo stesso anche nel caso in cui non è presente il Persistent Server, cambierà solamente l’indirizzo del messaggio ASYNC REQ che invece di avere un singolo destinatario sarà spedito in broadcast a tutti i partecipanti alla MANET. I messaggi asincroni spediti dal Persistent Server vengono visualizzati sul dispositivo nelle stesse Chat Form utilizzate per il servizio sincrono e per l’invio dei messaggi asincroni (viene creata una form diversa per i messaggi provenienti dallo stesso mittente). Se colui che ha inviato il messaggio asincrono è online è possibile fare uno switch tra le due modalità di comunicazione effettuando lo stesso protocollo di hand-shaking usato per iniziare una sessione sincrona. 3.5 Reliability Utilizzando il protocollo UDP per l’invio dei messaggi è stato necessario aggiungere un controllo a livello applicativo sulla corretta ricezione per garantire maggiore affidabilità. Sono state prese in considerazione due possibilità: il cumulative ack e il single ack. La prima è stata scartata in quanto, a differenza del caso sincrono, le singole sessioni di comunicazione asincrona sono composte da pochi messaggi . Si è optato per l’utilizzo del single ack che comporta si un overhead maggior rispetto al cumulative ack, ma tuttavia accettabile. Quando il Persistent Server termina di inviare i messaggi asincroni spediti ad un nodo durante la sua assenza, avvia un thread (Ack Controller) al quale delega il compito di controllare periodicamente se ad ogni messaggio appartenente al vettore sentAsyncMessages, corrisponde un messaggio di ack nel vettore receivedAsyncAck. All’ Ack Controller viene inoltre delegata la ritrasmissione dei messaggi per i quali non è stata trovata la corrispondenza nei due vettori. C’è da sottolineare che viene creato un Ack Controller per ogni destinatario dei messaggi asincroni, ricevuti tutti gli ack il thread termina e cancella dalla memoria i due vettori. La ricezione degli ASYNC ACK e l’inserimento all’interno del vettore receivedAsyncAck è a carico del Persistent Thread perennemente in ascolto sulla ASYNC PORT. La ritrasmissione dei messaggi da parte del Persistent Server può avere quindi due possibili cause: la perdita del messaggio asincrono o la perdita dell’ack. Fig.5: Protocollo di reliability 3.6 Ingresso del Persistent Server Le specifiche di progetto indicavano di considerare il Persistent Server come un dispositivo costantemente presente all’interno della MANET. Si è deciso di introdurre un’estensione che prevede la possibilità per il Persistent Server di entrare nella rete anche quando il sistema è già in funzione e una serie di nodi stanno gestendo in modo autonomo il servizio di chatting asincrono. Il Persistent Server, in modo analogo a tutti gli altri nodi, appena entra nella MANET invia in broadcast l’ENTERED. Questo messaggio contiene le informazioni che identificano un nodo, compreso un boolean che indica se ricopre il ruolo di Persistent Server. Quando i partecipanti alla rete ricevono questo messaggio si rendono conto che è cambiata la politica di gestione della comunicazione asincrona e avviano una procedura di svuotamento delle memorie locali inviando al Persistent Server sia i messaggi asincroni spediti dal nodo stesso sia quelli che mantenevano per conto di altri utenti che avevano finito lo spazio di memorizzazione disponibile o che avevano abbandonato la rete (v. relazione di Vitalone Giuseppe). Si ricorda che il Persistent Server può usufruire degli stessi servizi di un nodo normale e quindi anche della comunicazione asincrona. I messaggi asincroni indirizzati all’utente che utilizza il Persistent Server, quindi da visualizzare, saranno mandati verso la MAIN PORT, quelli da memorizzare in vista di un successivo delivery verso la ASYNC PORT. 4. Conclusioni e sviluppi futuri Possiamo concludere che PERMESSO soddisfa a pieno le specifiche richieste: offre un servizio di chatting istantanea, persistente e affidabile nonostante i limiti del canale di trasmissione utilizzato. Il sistema presenta però limiti alla scalabilità visto l’elevato numero di messaggi scambiati durante la fase di discovery che introducono ritardi nella comunicazione. Per quanto riguarda la comunicazione asincrona si fornisce trasparenza all’utente sulla presenza o meno del Persistent Server. L’utilizzo del Persistent Server evita l’eventuale perdita di messaggi asincroni dovuta alla limitata capacità di memorizzazione di dispositivi portatili come PDA o smart phone, ha comunque il limite di non prevedere la replicazione del ruolo e di non essere quindi tollerante a guasti. Una possibile estensione potrebbe essere appunto l’introduzione del monitoraggio dello stato del Persistent Server da parte degli altri nodi e la replicazione del ruolo in caso di guasto. Per garantire maggior scalabilità si potrebbe modificare l’architettura del sistema suddividendo verticalmente la MANET e introducendo il ruolo di coordinatore in ogni partizione, così facendo si ridurrebbe l’overhead dovuto al servizio di discovery. PERMESSO è stato progettato per essere utilizzato in zone come campus universitari o sale d’attesa di aeroporti, un possibile sviluppo futuro potrebbe prevedere l’introduzione di servizi di news con la possibilità di registrazione da parte degli utenti interessati (ad esempio comunicazioni di servizio di facoltà o avvisi riguardanti specifici corsi di laurea). Bibliografia [1] I. Chlamtac, M. Conti, JJN Li, “Mobile ad hoc networking: imperatives and challenger”, Elsevier Journal of Ad Hoc Networks, vol.1, no.1, 2003. [2] K. Topley, “J2ME in a nutshell”, O’Reilly, 2002. [3] J. F. Kurose, K. W. Ross, “Internet e reti di calcolatori”, seconda edizione, McGraw-Hill, 2003. [4] A.S. Tanenbaum, M. van Steen, “Distributed Systems: principles and paradigms”, Prentice-Hall, 2002. [5] A. Corradi, Slides del Corso di Reti di Calcolatori L-S e L-A