# B.A.T.M.A.N.

B.A.T.M.A.N. (Better Approach To Mobile Adhoc Networking) è un protocollo di routing per reti a maglia adhoc multi-hop.
Lo sviluppo è curato dalla community Freifunk e ha il fine di rimpiazzare il protocollo OLSR.
L'idea chiave su cui si basa B.A.T.M.A.N. è la decentralizzazione della conoscenza riguardo alla miglior rotta di instradamento in una rete: nessun nodo singolo possiede tutti i dati.
Questa tecnica elimina la necessità di diffondere ad ogni nodo della rete le informazioni relative ai cambiamenti di topologia. Ogni singolo nodo si limita a memorizzare le informazioni riguardo alla direzione da cui e a cui rispettivamente riceve e invia i dati.
In questo modo i dati vengono trasmessi da nodo a nodo e i pacchetti seguono rotte individuali create dinamicamente. Così facendo si instaura una rete di intelligenza collettiva.
Agli inizi del 2007 gli sviluppatori di B.A.T.M.A.N. hanno iniziato a svolgere esperimenti su un sistema di routing a livello 2 (livello Ethernet) anziché a livello 3. Per differenziarlo dal demone di routing a livello 3 è stato aggiunto il suffisso "adv" (advanced).
Invece di inviare pacchetti UDP e manipolare tabelle di routing, esso fornisce un'interfaccia di rete virtuale e si occupa del trasporto dei pacchetti in modo trasparente e autonomo. Il modulo batman-adv è diventato parte del kernel ufficiale di Linux sin dalla versione 2.6.38.

## Funzionamento

B.A.T.M.A.N. possiede gli elementi dei classici protocolli di routing: esso rileva altri nodi B.A.T.M.A.N. e ne individua la miglior rotta. Inoltre tiene traccia dei nuovi nodi notificandone ai vicini l'esistenza. Nelle reti statiche, l'amministratore di rete decide quale rotta rende raggiungibile ogni singolo computer. Dal momento che nelle reti senza fili i cambiamenti topologici sono costanti e le soglie di partecipazione son basse, tale aspetto deve essere automatizzato il più possibile.
Ad intervalli regolari, ogni nodo invia un broadcast (messaggio generico rivolto a tutti i dispositivi) per notificare ai vicini la propria presenza, tali messaggi prendono il nome di originator-messages.
I vicini a loro volta inoltreranno questo messaggio ai propri vicini, che faranno altrettanto.
Questo metodo permette all'informazione di arrivare ad ogni singolo nodo nella rete. Per trovare la miglior rotta verso un determinato nodo, B.A.T.M.A.N. conta gli originator-messages ricevuti e memorizza da quale vicino sono stati inoltrati.
Analogamente ai protocolli basati su distance-vector, ma diversamente da altri protocolli link-state, B.A.T.M.A.N. non tenta di determinare l'intera rotta, ma usando i mittenti dei messaggi broadcast, solo il primo passo verso la miglior direzione. I dati vengono quindi passati al vicino successivo in quella direzione, che a sua volta userà lo stesso meccanismo. Tale processo è ripetuto finché i dati non arrivano a destinazione.
Oltre alle reti wireless, il protocollo B.A.T.M.A.N. può essere implementato in comuni reti cablate come Ethernet.

## Storia

L'obiettivo era di creare un protocollo che fosse il più semplice, piccolo e veloce possibile, sembrava pertanto ragionevole dividere lo sviluppo in più fasi implementando le funzioni più complesse secondo un processo iterativo:

### Prima versione

In questa fase è stato implementato l'algoritmo testandone la praticità e l'adeguatezza allo scopo. Per l'invio e la ricezione degli originator-messages (messaggi d'esistenza del nodo) è stata scelta la porta UDP 1966.

### Seconda versione

La prima versione dell'algoritmo faceva un'importante assunzione: prima un nodo riceve gli originator-message da un altro, prima può inoltrarne una risposta. Tuttavia in reti senza fili può benissimo presentarsi una comunicazione unidirezionale, pertanto nel protocollo è stato incorporato un meccanismo che concepisse tali situazioni così da risolvere le problematiche che erano sorte. Il meccanismo permette al nodo di determinare se un vicino fornisce una comunicazione bidirezionale. Solo un nodo bidirezionale viene considerato parte della rete, gli altri vengono parzialmente esclusi.

### Terza versione

La maggior innovazione in questa versione è il supporto a dispositivi di rete multipli, ciò permette ad un computer su cui è in funzione il demone B.A.T.M.A.N. di essere posizionato in un punto centrale, potendo gestire contemporaneamente più interfacce di rete (cablate o wireless che siano). Quando ciò avviene, B.A.T.M.A.N. può inoltrare pacchetti in più direzioni senza ritardi di ritrasmissione.
Sono state affrontate e contrastate circostanze speciali e fenomeni inusuali nella fase di determinazione della miglior rotta in modo da prevenire situazioni di routing circolare che possono impedire ai dati di giungere a destinazione.
Inoltre ogni nodo in grado di fornire un accesso ad Internet ora può darne notifica alla rete. Gli altri nodi possono usare tale informazione per valutare quando è presente vicino a loro una connessione ad Internet e che larghezza di banda è disponibile, possono inoltre usare un gateway specifico o permettere a B.A.T.M.A.N. di determinare, attraverso criteri quali la velocità di connessione, che gateway usare.
In questa versione è stata inclusa anche la possibilità di notificare dispositivi sprovvisti di demone B.A.T.M.A.N, funzionalità utile per connettere una rete casalinga alla rete magliata. Un'antenna installata sul tetto della casa si connetterà alla rete wireless tramite B.A.T.M.A.N. e il resto dei dispositivi della casa verranno annunciati come raggiungibili.
Come confermato da analisi teoriche, in condizioni reali questa versione di B.A.T.M.A.N. ha dimostrato alti livelli di stabilità a fronte di tempi di convergenza relativamente lenti.