P2P(Peer to Peer)
애플리케이션 계층에 속하는 프로토콜들은 대부분 항상 켜져있는 서버에 의존 중이다.
반면, 항상 켜진 서버에 최소한으로 의존하면서 간헐적으로 연결되는 두 호스트가 직접 통신하는 것을 P2P(Peer to Peer)라고 칭한다.
확장성
P2P에서는 수신한 데이터(JPG파일, 영화 등의 영상물, 소프트웨어 패치 등)의 일부를 다른 호스트들에게 분배할 수 있어서, 데이터를 클라이언트 수만큼 복사해 클라이언트들에게 넘겨야하는 서버-클라이언트 구조에서보다 확장성이 높다.
이를 분배시간에 대한 수식으로 살펴보면
(파일이 F비트, 업로드/다운로드 속도가 u라고하면 F/u로 구한다.)
서버-클라이언트 구조
1. 클라이언트가 N개라고하면, 서버가 파일을 N회 업로드할 때의 시간
2. 가장 낮은 다운로드 속도를 가진 클라이언트가 파일을 전부 다운로드하는 시간
따라서 모든 피어가 파일을 나눠가지려면 최소한 1번과 2번의 최댓값만큼의 시간이 지나야한다. 이는 서버-클라이언트 구조에서는 파일을 받은 피어의 수 N에 따라 분배시간의 최소값이 선형적으로 증가함을 알 수 있다/
P2P 구조
1. 가장 먼저 파일을 갖고 있는 서버는 파일을 1회만 업로드하면 된다. 따라서 파일을 1회 업로드할 때의 시간
2. 가장 낮은 다운로드 속도를 가진 피어가 파일을 전부 다운로드하는 시간
3. P2P에서 모든 피어는 다운로드 한 데이터를 다시 업로드해야한다. 따라서 P2P 구조 내의 모든 피어들이 파일들을 업로드하는데 걸리는 시간 (NF/(서버를 포함한 피어들의 업로드속도 합))
따라서 모든 피어가 파일을 나눠가지려면 최소한 1,2,3번의 최댓값만큼의 시간이 지나야한다.
여기에 대해서는 뒤에서 더 다루겠다.
이는 P2P 구조에서는 피어의 수 N에 다라서 분배시간이 늘어나긴하지만, 선형적으로는 증가하지 않는다는 것을 알 수 있다.
비트토렌트
비트토렌트는 파일분배를 위한 P2P 프로토콜로, 특정 파일을 다운로드 받기 위해 참여하는 모든 피어들의 모임을 토렌트(torrent)라고 부른다. 따라서 토렌트에 참여 중인 피어들은 모두 특정 파일을 공유 중이다.
토렌트에 참여 중인 피어는 파일 전체를 받는게 아니라, 256킬로바이트로 분할된 청크(chunk)를 다른 피어로부터 다운로드한다. 이 청크들을 모아 전체 파일을 다운로드한다.
이 아래부터는 사용자A가 토렌트에 참여하여 파일을 받는 과정을 순서대로 작성한다.
1. 토렌트에 참여하기 - 트래커
트래커(tracker)는 토렌트에 있는 인프라스트럭처 노드다.
"인프라스트럭처 노드"라는 표현이 좀 애매한데, 결국 트래커는 P2P에는 직접 참여하지 않지만, 시스템이 구동되도록 돕는 서버다.
1. A가 토렌트에 가입하면 트레커에 이를 알리고, 주기적으로 자신이 아직 있음을 알린다.
2. 트레커는 A가 가입했음을 확인하고, 피어들의 정보를 보낸다.
트레커는 토렌트 내에서 임의로 50개의 피어들을 뽑아 IP 주소를 A에게 보낸다.
그러면 A는 이 IP주소를 토대로 TCP 연결을 시작한다. 이 연결된 피어들을 '이웃 피어'라고 부른다.
3. 시간이 지남에 따라 이웃 피어들의 상태가 변한다.
A의 이웃 피어들의 일부는 토렌트를 떠나거나, 새 피어들이 A와 연결을 시도한다. 따라서 이웃 피어들은 시간에 따라 변한다.
2. 토렌트에 참여하고 피어 확인하기
4. 데이터를 주고 받을 피어 찾기 - random first selection
피어들은 청크를 다운만하고 업로드는 하지 않는 무임승차족(free-rider)을 방지해야하기 때문에, 피어는 활성화(unchoked)된 피어들로부터 온 다운로드 요청만 허용한다. 따라서 A는 다른 피어로부터 활성화를 받아야한다.
모든 피어들은 30초마다 임의의 피어들에게 신호를 보내는데, 이 신호에 빠르게 응답한다면 해당 신호를 보낸 피어로부터 활성화될 수 있다. 따라서 A는 토렌트에 참여한 직후에는 청크가 없지만, 어떤 피어로부터 온 신호를 잘 받으면 청크를 다운로드할 수 있다. 이 때 A는 청크가 없으므로 아무 청크나 랜덤하게 다운받는다. 이를 random first selection이라고 칭한다.
5. 다른 피어들 활성화하기 - 일반적 활성화
A는 무사히 random first selection을 마치고 청크를 얻었다. 그리고 다른 피어로부터도 unchoked 되어 여러 피어들이 A에게 데이터를 업로드하는 중이다. 충분한 수의 피어들이 있다면 A는 10초마다 A로 오는 모든 요청의 성능을 측정한다. 그 중에서 성능이 제일 좋은 4개의 피어를 unchoke한다. 즉, 자신에게 데이터를 빠르게 업로드한 보답으로 자신도 데이터를 전해주겠다는 이치이다.
6. 무작위 피어 활성화하기 - optimistic unchoke
A는 4개의 unchoke된 피어 외에도 임의의 피어를 선정해 신호를 보내고, 30초를 기다린다.
만약 해당 피어가 응답을 했고, 만족스러운 다운로드 속도를 가진다면 30초 후 해당 피어를 4개의 unchoke된 피어 중 한 자리를 차지한다. 다운로드 속도가 별로라면 해당 피어를 choke한다.
3. 데이터 다운받기
7. 가장 드문 것 먼저 - rarest first
A는 이제 unchoke한 피어도 많고, A를 unchoke한 피어도 많다.
이제 A는 주기적으로 피어들에게 갖고 있는 청크 목록을 요구하며, 그중에서 A가 갖고 있지 않으면서도 가장 드문 것 먼저(rarest first) 요구한다. 희귀한 청크가 더 빨리 분배된다.
8. 마지막 단계 - endgame mode
A가 파일의 99% 정도를 다운받았으면, 마지막 청크 때문에 다운이 느려지는 것을 방지하기 위해 이때는 가능한 모든 피어들에게 해당 청크를 줄 것을 요구한다. 그리고 모든 청크를 다 다운받았다면 기존 피어들에게는 요청을 취소한다.
9. seeder가 되다
A는 100% 파일 다운로드를 완료했다. A는 seeder가 된다.
seeder가 됐을 때에도 업로딩은 가능하기 때문에, 토렌트에 처음 들어온 피어들에게 데이터를 나눠주는 등의 역할을 한다.
seeder 역시 unchoke 피어를 고를 수 있는데, 이 때 자신이 아닌 다른 피어로의 업로드 속도가 빠른 피어를 unchoke한다.
이처럼 무임승차족을 막고, 공정한 분배를 위한 전략을 TFT(tit-for-tat)이라고 칭한다.
확장성 추가설명
따라서 P2P에서는 각 피어들이 청크를 다른 피어로부터 받자마자 즉시 다른 피어로 업로드한다. 그리고 만약 다른 피어들이 해당 조각을 가지고 있다면 업로드하지 않는다. (애초에 다른 피어가 요구하지 않을 것이므로..)
따라서 P2P 구조에서는 가장 낮은 다운로드 속도를 가진 피어가 파일을 전부 다운로드하는 시간이나, P2P 구조 내 모든 피어들이 파일조각들을 업로드하는데 걸리는 시간 중 무엇이 더 큰지 단언할 수 없다.
왜냐하면 다운로드 속도가 빠른 대신 업로드 속도가 느리다면 피어들은 모든 파일을 빠르게 받아내고 업로드를 하는게 중요하므로 업로드에서 병목이 발생할 것이다.
반대로 다운로드 속도가 느린 대신 업로드 속도가 빠르다면 피어들은 가진 조각들을 빠르게 업로드하므로 가장 다운 속도가 느린 피어가 파일을 전부 다운하는 시간에서 병목이 발생할 것이다.

어려워서 지피티에게 몇 가지 물어봤더니 이렇다네요ㅇㅇ
추가탐구 - 미니청크
청크는 약 256KB라고했는데, 사실 이것도 좀 크기 때문에 미니청크라는 단위로 다시 나눈다.

청크(여기서는 pice)는 약 256KB(2^18 바이트) 이상이지만, 피어들은 16KB 이상의 데이터를 받으면 연결을 끊어버린다.
따라서 청크를 다시 잘게 쪼개어 데이터를 받는다. 이 미니청크들을 모두 모아야 청크 1개가 된다.
파이프라이닝
미니청크들을 한 번에 여러 개 보낸다. TCP에서 파이프라이닝을 다루는데, 같은 개념이다. TCP는 파이프라이닝을 사용하지만 비트토렌트에서 데이터를 여러 개 보내지 않을 수 있으므로 비트토렌트에서도 파이프라이닝을 적용시켰다.
안티스너빙
특정 피어로부터 데이터가 너무 오랫동안 오지 않으면 해당 피어로부터의 연결을 끊거나 다른 상대를 찾아 데이터를 다운로드 속도저하를 방지하는 방법이다.
ref.
<컴퓨터 네트워킹: 하향식 접근>
https://wiki.theory.org/BitTorrentSpecification
BitTorrentSpecification - TheoryOrg
Bittorrent Protocol Specification v1.0 Identification BitTorrent is a peer-to-peer file sharing protocol designed by Bram Cohen. Visit his pages at http://www.bittorrent.com BitTorrent is designed to facilitate file transfers among multiple peers across un
wiki.theory.org
[컴퓨터 네트워크] BitTorrent
23-2에 수강한 컴퓨터 네트워크 강의의 정리입니다.
velog.io
'CS > 컴퓨터 네트워크' 카테고리의 다른 글
| [네트워크] DNS란? (0) | 2026.07.08 |
|---|---|
| [네트워크] 전자메일 - SMTP 프로토콜 (0) | 2026.07.08 |
| [네트워크] 애플리케이션 계층 개요 및 HTTP 프로토콜 (0) | 2026.07.06 |
| [네트워크] 지연과 패킷손실, 네트워크 계층 프로토콜 (0) | 2026.07.01 |
| [네트워크] 인터넷이란 무엇인가? (0) | 2026.06.30 |
