P2P 네트워크는 클라이언트-서버 모델과 달리 중앙 집중형 서버가 필요하지 않다. 네트워크 내의 임의의 피어(peer)들이 직접 연결되어 데이터를 주고 받을 수 있다. 새로운 피어가 네트워크에 접속하면, 그 피어는 다른 피어로부터 파일을 받을 수 있고, 제공할 수 있다. 이로 인해 스스로 확장이 가능하며, 사용자가 늘어남에 따라서 리소스 또한 늘어나므로 리소스의 제한을 덜 받는다.
피어들은 항상 네트워크에 접속해있는 것이 아니라 필요할 때만 접속하고 데이터를 주고 받는다. 이는 동적이고 비연속적인 연결을 의미한다.
이와 같이 P2P 네트워크는 중앙 집중형 구조로 이루어지지 않았기 때문에 일반적인 클라이언트-서버 모델보다 관리 및 트래픽 제어가 복잡할 수 있다. 또한 고정된 서버가 없기 때문에 IP주소가 자주 바뀔 수 있고 피어들은 네트워크 내에서 서버와 클라이언트의 역할을 동시에 수행한다.
예시로는 비트 토렌트, 칸칸, 스카이프 등이 존재한다.

Q: 파일 f를 n개의 피어(노드)와 공유할 때 시간이 얼마나 걸릴까?
n개의 클라이언트에게 파일 f를 보내는 과정:
각 클라이언트의 다운로드 시간:
클라이언트 중 가장 느린 클라이언트의 다운로드 속도가 전체 시간에 영향을 미친다.
총 걸리는 시간:
다음 두 값 중 큰 값이 파일 배포에 걸리는 전체 시간이다.
서버의 업로드와 클라이언트의 다운로드는 동시에, 병렬적으로 진행되기 때문에 두 값을 더하지 않고, max값을 구하는 것이다.

서버에서 최초 피어에게 파일전송:
P2P에서는 서버가 모든 파일을 모든 노드에 전송할 필요가 없다. 각 피어는 서버뿐만 아니라 다른 피어들에게서 파일을 받을 수 있다.
클라이언트 다운로드 시간:
총 걸리는 시간:


클라이언트-서버는 n이 증가할수록 배포 시간또한 그에 비례하여 선형적으로 증가한다.
P2P의 경우 n이 증가할수록 분자와 분모가 함께 증가하므로 완만한 기울기로 증가한다.
(사용자가 많아질수록 리소스가 함께 증가한다.)
비트 토렌트는 P2P 파일 공유 프로토콜이다.

tracker: 트래커는 피어들의 리스트를 관리하는 중앙서버이다. 파일을 다운로드하거나 업로드하는 피어들에 대한 정보를 제공한다. 새로운 피어가 네트워크에 접속할 때, 현재 파일을 공유하고 있는 다른 피어들의 목록을 제공한다.
torrent: 토렌트는 하나의 파일을 공유하고 있는 피어들의 그룹이다. 이 그룹에 속한 피어들은 서로 파일 조각을 주고 받는다.
피어들이 서로 동시에 파일을 공유함으로써 파일 전송 속도와 효율성을 높이고 있다.
피어가 토렌트에 참여할 때:
초기 상태: 새로운 피어가 토렌트에 참여하면, 파일 조각을 전혀 가지고 있지 않다.
조각 획득: 시간이 지나면서 다른 피어들로부터 조각을 다운로드하여 파일을 점차적으로 완성한다.
트래커와 등록: 피어는 트래커 서버에 등록하여 네트워크 상에서 파일을 공유하고 있는 다른 피어들의 리스트를 받아 연결을 맺고, 파일 조각을 교환할 수 있다.
파일을 다운로드 할 때:
피어 변경:
변동성(Churn):
피어가 전체 파일을 모두 다운로드한 경우 두가지 선택을 할 수 있다.
이기적으로 떠남(selfishly leave): 더이상 네트워크에서 시더 역할을 하지 않음.
이타적으로 남음(altruistically remain): 파일을 모두 다운받았음에도 계속 네트워크에 남아 시더 역할을 계속하며, 다른 피어들이 파일을 받을 수 있도록 파일 조각들을 업로드함.
시더 역할이란 전체 파일을 모두 가진 피어가 다른 피어들에게 파일의 조각을 제공하는 역할이다.
각 피어들은 서로 다른 파일 조각들을 가지고 있다.
피어들에게 파일 조각 목록을 요청한다.
희소 조각 우선 다운로드 (Rarest first)
Tit-for-Tat:
Choking (목 졸리기):
Optimistic Unchoking (낙관적 차단 해제):

위의 방식으로 효율적인 파일 전송 및 피어 간 공정한 자원 분배를 달성할 수 있다.