# Dynamic Source Routing

Dynamic Source Routing (DSR) è un protocollo di routing per reti MANET (Mobile ad Hoc Networks).
È simile ad AODV in quanto reattivo (genera delle rotte solo su richiesta). Tuttavia, utilizza il source routing invece di affidarsi alla routing table di ogni nodo intermedio. Sono state fatte ulteriori rifiniture a DSR, incluso DSRFLOW.
Per determinare le rotte sorgente (source routes) è necessario accumulare gli indirizzi dei nodi intermedi a partire dalla sorgente verso la destinazione. Questo accumulo di informazioni è stivato in cache dai nodi che processano la route discovery e il percorso ottenuto verrà poi usato per inoltrare pacchetti. Di conseguenza ogni pacchetto conterrà tutti gli indirizzi che dovrà utilizzare per arrivare a destinazione. Questo porta necessariamente ad un aumento di risorse nel caso di percorsi o indirizzi lunghi, come IPv6. Per evitare source routing, DSR offre la possibilità di definire un campo flow id che permette un metodo hop-by-hop.

## Operatività

DSR ha due fasi primarie, Route Discovery e Route Maintenance
La Route Reply verrà generata solo se il messaggio avrà raggiunto il nodo destinazione (la rotta registrata all'interno della Route Request verrà ovviamente inserita nella Route Reply)
Nel caso di errori di trasmissione, la fase di Route Maintenance verrà scatenata da una Route Errore generata da un nodo. Il collegamento mancante verrà rimosso dalla cache route del next hop e verrà ricalcolata una nuova rotta quando verrà avviata una nuova Route Discovery.
Dynamic source routing protocol (DSR) è un protocollo reattivo (on-demand) sviluppato per ridurre il consumo di banda dei pacchetti di aggiornamento presenti nella maggior parte dei protocolli distance vector. La differenza principale fra DSR e altri protocolli reattivi è che non utilizza beaconing e quindi non utilizza periodici pacchetti di "hello" per rilevare la presenza di vicini. L'approccio base di questo e altri protocolli reattivi è l'inoltro flooding di una RouteRequest all'interno della rete.
La destinazione, all'arrivo della RouteRequest, risponde con una RouteReply utilizzando la strada scoperta dalla RouteRequest
Ogni RouteRequest ha un numero di sequenza generato dal nodo sorgente e dal cammino che attraversa. All'arrivo di una Route Request, un nodo controlla il numero di sequenza prima di inoltrarlo. Verrà quindi inoltrata solo se non è un duplicato. Il numero di sequenza viene usato per prevenire la formazione di loop e ritrasmissione multiple della stessa informazione.
I nodi possono inoltre apprendere delle rotte attraverso i vicini quando operano in modalità promiscua. (ascoltare pacchetti non indirizzati né a se stessi né in broadcast) Inoltre se un nodo intermedio conosce già la rotta per una certa destinazione può rispondere con una RouteReply gratuita.
In genere è possibile ottimizzare la fase di Discovery effettuando il piggyback di dati sui pacchetti di Request e Response.

## Vantaggi e Svantaggi

Come già detto prima questo protocollo reattivo elimina gli aggiornamenti utilizzati da protocolli distance vector. I nodi intermedi utilizzano inoltre le loro informazioni per ridurre il carico di controllo. Lo svantaggio di questo protocollo è insito nel meccanismo della route maintenance per cui non è possibile riparare localmente un link portando quindi ad inconsistenza durante la ricostruzione delle nuove rotte. Il processo di connessione richiede un ritardo maggiore rispetto ai protocolli DV. Nonostante le prestazioni siano buone in situazioni di bassa mobilità, degradano rapidamente all'aumentare della stessa.