Peer-to-peer is a decentralized architecture where each peer has the same (or similar) capabilities and where the peers cooperate to solve a given problem or to offer a service like e.g. file sharing. The architecture itself is often divided into three sub-groups [Q. Lv et al. 2002]:
Centralized peer-to-peer: All nodes have the same responsibilities, but a centralized server performs some service needed by the peer-to-peer net.
Decentralized and unstructured peer-to-peer (pure peer-to-peer): Every node has the same capabilities and responsibilities. There is no central service; everything is evenly distributed onto the nodes.
Decentralized and structured peer-to-peer: In this approach there is some structure on the net itself. The strictness of the structuring varies between different approaches, but the overall goal is to make searching/lookup mechanisms better and more effective (scalable, fast and correct). Examples are distributed hash table systems (DHT's), routing based on hints and the notion of super-nodes or super peers.
But why should one chose to build a distributed system based on the p2p architecture? The answer is simply: Scalability, Fault tolerance and Utilizing the power in the leaf nodes. And yes, there are some issues also. It's important to keep in mind: "No solution solves every problem!". If you want to use the P2P architecture you should first sit down and think through which of the three architectures that suites you the best. You should also consider the trade offs present. In the end the client-server solution might turn out to be the preffered choice for your application.
[Q. Lv et al. 2002] Q. Lv, P. Cao, E. Choen, K. Li, S. Shenker. Search and Replication in Unstructured
Peer-to-Peer Networks. In Proc. 16th Annual ACM Int'l Conference on Supercomputing, New York,
USA, June 2002