Uma rede peer-to-peer (P2P) é formada por vários nós, e a comunicação e troca de dados na rede é feita diretamente entre os nós, ao invés de arbitrada por um nó intermediário. Cada nó em uma rede P2P pode agir simultaneamente como cliente e servidor [4].
Em sistemas P2P, cada participante da rede ("par") torna disponível uma parte de seus recursos ao mesmo tempo em que usa recursos disponibilizados por outros pares. Isto estabelece um contraste com o modelo mais usual de comunicação em redes de comutação de pacotes (tais como a Internet), que é o modelo cliente-servidor: nesse modelo, apenas os servidores fornecem recursos, e os clientes apenas consomem recursos.
A estrutura de aplicação P2P foi popularizada por aplicativos de compartilhamento de arquivos, como o Napster. Hoje, com o aumento da capacidade dos computadores e dos links de acesso à Internet domésticos, outros usos de redes P2P existem, por exemplo para projetos de computação distribuída, para distribuição de fluxos de mídia em tempo real (streaming), telecomunicações (telefonia, videoconferência, etc.), entre outros.
As redes P2P são geralmente construídas sobre a camada de aplicação [6], formando uma rede sobreposta [3]. Essas redes sobrepostas são utilizadas para a descoberta de pares e indexação de conteúdo. Esse tipo de arquitetura confere uma vantagem às redes P2P em relação a outros modelos de distribuição de conteúdo: a rede P2P é abstrata (nível de aplicação), e por isso fica isolada da estrutura física da rede sobre a qual os protocolos P2P rodam.
Redes P2P podem ser classificadas como puras ou híbridas. As redes P2P puras não carregam a noção de cliente ou servidor, ou seja, não existem nós de infra-estrutura, e cada par tem um status igual na estrutura, funcionando ao mesmo tempo como cliente e servidor. Redes híbridas permitem a existência de nós especiais, frequentemente chamados de supernós (supernodes). Esses nós tipicamente têm mais recursos (especialmente banda) disponíveis.
O controle de conexões e fluxo de informações numa rede P2P pode ser distribuído ou centralizado. No modelo distribuído, as informações de controle (indexação e descoberta de pares) circulam entre os pares, assim como os dados; enquanto no modelo centralizado, existe um nó central responsável pela indexação do conteúdo e pelo gerenciamento do processo de troca de dados, porém as trocas de dados são feitas diretamente entre os pares e não são regidas por nenhum algoritmo em particular.
Em um sistema P2P, cada participante é um nó da rede sobreposta, ou seja, existe um "enlace" entre cada dois nós que conhecem um ao outro: se um participante A conhece um participante B da rede, então um "enlace" de rede sobreposta é formado com direção de A para B. Baseado em como os enlaces são formados, pode-se classificar os sistemas P2P em estruturados ou não-estruturados.
Sistemas P2P estruturados são aqueles em que existe um protocolo que garante que cada nó possa rotear de forma eficiente uma busca por qualquer dado, mesmo que ele seja muito raro. Para tal, é necessário que os nós e, em alguns casos, também os recursos, sejam organizados segundo critérios e algoritmos específicos, o que leva a redes sobrepostas com propriedades especiais. A maioria das redes deste tipo utiliza tabelas hash distribuídas [5].
Em sistemas P2P não-estruturados, a distribuição dos nós na rede é feita de forma arbitrária. Redes não-estruturadas são construídas de forma mais simples, pois um nó que queira participar da rede pode começar simplesmente copiando alguns links de outros participantes, e então ir estabelecendo suas próprias conexões ao longo do tempo. Uma desvantagem das redes não-estruturadas em relação às redes estruturadas é que, numa rede estruturada, as mensagens de busca de conteúdo devem inundar a rede, a fim de encontrar pares que estejam compartilhando os dados requisitados, o que ocasiona picos de tráfego de controle; além disso, as buscas podem às vezes não ser resolvidas, mesmo que existam na rede nós compartilhando os dados requisitados, com a probabilidade disso acontecer sendo maior à medida que esses dados sejam mais raros [5].
Uma tabela hash distribuída (DHT, Distributed Hash Table) funciona como uma tabela hash tradicional, no sentido de que associa a cada valor (ex. nó da rede) uma chave única. A diferença é que a tabela é, como o nome diz, distribuída entre os nós da rede sobreposta, ficando cada nó responsável por uma porção da tabela. Um algoritmo de DHT genérico implementa apenas uma função, busca(chave). Esta função retorna o identificador do nó responsável pela chave. [7] DHTs são usadas para tornar as buscas na rede P2P mais eficientes do que nos sistemas não-estruturados.
Um exemplo de implementação de DHT é o Chord, utilizado em aplicações como o OverCite (uma versão distribuída da base de dados bibliográfica CiteSeer). Os identificadores são organizados de forma circular, ordenados numericamente. Uma requisição de busca pela chave k é direcionada ao nó que possuir o maior identificador menor que k na "tabela de roteamento" (finger table) do nó de origem. Feito recursivamente, isto garante um uso de mensagens de O(log N). Cada nó guarda O(log N) de estado na tabela, e as saídas e entradas de nós provocam O(log² N) mensagens. [8].

Hoje, muitos dos programas P2P mais populares (eMule, BitTorrent, Gnutella) usam métodos baseados em DHT paralelamente a suas redes não-estruturadas originais para descoberta de pares, a fim de aumentar a eficiência da rede.