Ad hoc wireless networks perform the difficult task of multi-hop communication in an environment without a dedicated infrastructure, with mobile nodes and changing network topology. Different deployments exhibit various constraints, such as energy limitations, opportunities, such as the knowledge of the physical location of the nodes in certain scenarios, and requirements, such as real-time or multi-cast communication. In the last 15 years, the wireless networking community designed hundreds of new routing protocols targeting the various scenarios of this design space. The objective of this paper is to create a taxonomy of the ad hoc routing protocols, and to survey and compare representative examples for each class of protocols. We strive to uncover the requirements considered by the different protocols, the resource limitations under which they operate, and the design decisions made by the authors.