BitTorrent는 P2P(Peer-to-Peer) 파일 분산 프로토콜로, 중앙 서버 없이 파일을 수많은 피어에게 효율적으로 배포한다. Bram Cohen이 2001년 설계했다.
핵심 개념
| 용어 | 설명 |
|---|
| Torrent 파일 | 메타데이터 (파일명, 조각 해시, 트래커 주소) |
| Tracker | 피어 목록 제공 서버 |
| Seeder | 파일 전체 보유 피어 |
| Leecher | 다운로드 중인 피어 |
| Piece | 파일 분할 단위 (보통 256KB~1MB) |
| Swarm | 동일 토렌트를 공유하는 피어 집합 |
BitTorrent 동작 흐름
1. .torrent 파일 또는 magnet link 획득
2. 트래커에 announce (자신의 IP:Port, 파일 해시)
3. 피어 목록 수신
4. 피어와 직접 연결 (TCP 포트 6881~6889)
5. 조각 선택 (Rarest First 알고리즘)
6. 업로드/다운로드 동시 진행 (Tit-for-Tat)
조각 선택 전략
python
# Rarest First 알고리즘 (의사 코드)
def select_piece(available_pieces, peer_bitfields):
# 각 조각의 희귀도 계산
rarity = {}
for piece in available_pieces:
count = sum(1 for bf in peer_bitfields if bf[piece])
rarity[piece] = count
# 가장 희귀한 조각부터 요청
return sorted(available_pieces, key=lambda p: rarity[p])[0]
DHT (분산 해시 테이블)
트래커 없이 피어를 찾는 Kademlia 기반 DHT:
각 노드는 160비트 Node ID 보유
거리 = XOR(Node_A_ID, Node_B_ID)
가까운 노드들이 같은 토렌트 정보 저장
Magnet Link: magnet:?xt=urn:btih:<info_hash>&dn=<name>
프로토콜 메시지
| 메시지 | 역할 |
|---|
| handshake | 프로토콜 버전, info_hash, peer_id 교환 |
| bitfield | 보유 조각 비트맵 전송 |
| interested / not interested | 관심 표명 |
| choke / unchoke | 업로드 제어 |
| request | 조각 요청 |
| piece | 조각 데이터 전송 |
관련 문서
- •[[sdn|SDN (소프트웨어 정의 네트워킹)]]
- •[[tls-advanced|TLS 1.3 심화]]