# [−][src]Crate vivaldi

An implementation of the Vivaldi algorithm for efficient RTT latency estimations using an n-dimensional Euclidean model.

## The Algorithm

The Vivaldi algorithm was presented by Frank Dabek, Russ Cox, Frans Kaashoek & Robert Morris in 2004, with subsequent improvements suggested in follow-up papers by others.

Most people think the internet is made up of a series of tubes. Indeed it
seems they are wrong - **it's made of springs**.

The authors describe their development of an algorithm to map communication latencies between nodes to coordinates in N-dimensional Euclidean space, with the distance between two points roughly equating to the RTT between two nodes.

It models the RTT as the natural length of a physical spring respecting Hooke's Law (which I thought was pretty cool) with the potential energy of each spring acting as an analogue of estimation error. Minimising the potential energy of the springs in the system minimises the estimation error of the model. A number of improvements are made to improve convergence time and accuracy as described in the paper. It's a good one, you should read it!

## Use It

This implementation is for the algorithm described in the original paper - there's no update filters (which requires storing more state per node) or gravity as proposed in the follow-up texts. The caller is responsible for storing the last known coordinate of each node to later derive RTT estimations for any pair of nodes.

The Vivaldi algorithm typically piggybacks on top of your normal application network messages with the coordinates being embedded in request/response metadata. The application measures the RTT of the request and uses it along with the coordinate sent by the remote to update the local model.

## Dimensionality

Although this implementation is generic over any number of dimensions, principle component analysis by the authors shows there is little benefit beyond 3 dimensions, with 2 dimensions being adequate if overhead is to be kept to a minimum.

## Modules

vector | Vector defines N-dimensional Euclidean vectors and traits to implement them. |

## Structs

Coordinate | Coordinate represents a point in the Vivaldi model. |

Model | A Vivaldi latency model generic over N dimensional vectors. |

## Functions

estimate_rtt | Returns an estimate round-trip time given two coordinates. |