When designing overlay networks for distributed applications and services, several factors should be taken into consideration such as the type and characteristics of the application and service (e.g. communication pattern, data size and frequency, quality of service, and security level), the type and characteristics of the overlay network (e.g. topology, routing algorithm, protocol, and performance metrics), as well as the type and characteristics of the physical network (e.g. bandwidth, latency, reliability, and cost). Common types of overlay networks include structured overlay networks (which use deterministic and hierarchical algorithms to organize nodes into a specific topology such as a ring, tree or grid), unstructured overlay networks (which use random and decentralized algorithms to connect nodes without a predefined topology) and hybrid overlay networks (which combine elements of both structured and unstructured networks). Examples of structured overlay networks include Distributed Hash Tables (DHTs) such as Chord, Pastry, and Kademlia; examples of unstructured overlay networks include Gnutella, BitTorrent, and Tor; examples of hybrid overlay networks include CAN, Tapestry, and Skype.