1. 다운로드의 상식을 뒤엎는 프로토콜
리눅스(Linux) 설치 이미지나 거대한 게임의 업데이트 파일 등 수 기가바이트에 달하는 데이터를 수만 명이 동시에 다운로드하려고 하면 어떻게 될까요? 일반적인 웹 서버(HTTP 다운로드)에서는 회선 대역폭이 펑크 나고 서버는 다운되고 맙니다.
이를 해결하기 위해 ‘기업이 돈을 지불하고 초강력 서버를 여러 대 준비하는(CDN)’ 것이 아니라 “다운로드하는 유저 자신의 PC 힘을 빌려, 서로 돕게 하여 다운로드하게 만드는” 이라는 획기적인 수법을 고안한 것이 2001년 브램 코언이 개발한 BitTorrent(비트토렌트) 입니다.
BitTorrent는 단순한 불법 다운로드 도구가 아닙니다. 현재에도 전 세계 인터넷 트래픽의 적지 않은 비율을 차지하고 있으며, 대형 IT 기업이 거대한 데이터를 사내 서버군에 고속 전개하기 위해서도 사용되고 있는, 컴퓨터 사이언스에 있어서 ‘분산 배포 알고리즘’의 최고 걸작 중 하나입니다.
2. 피스(단편화)와 무리(스웜)의 힘
BitTorrent의 최대 발명은 거대한 1개의 파일을 피스 (보통 256KB~수 MB 정도의 잘게 쪼개진 블록)로 분할해서 다룬다는 점에 있습니다.
기존의 다운로드에서는 파일의 처음부터 끝까지를 순서대로 서버로부터 받습니다. 그러나 BitTorrent에서는 다운로드에 참여하고 있는 사람들(스웜(Swarm)이라고 불리는 무리) 사이에서 ‘누가 어느 피스를 가지고 있는지’를 항상 서로 공유합니다.
그리고 자신이 가지고 있지 않은 피스를 다른 유저(피어)로부터 받으면서, 동시에 자신이 이미 다운로드 완료한 피스를 아직 가지고 있지 않은 다른 유저에게 업로드하여 넘겨주는 것입니다.
graph TD
Seed["시드 (100% 보유자)"] -->|"피스 1"| PeerA["피어 A (20% 완료)"]
Seed -->|"피스 2"| PeerB["피어 B (40% 완료)"]
Seed -->|"피스 3"| PeerC["피어 C (10% 완료)"]
PeerA <-->|"피스 1과 2의 교환"| PeerB
PeerB <-->|"피스 2와 3의 교환"| PeerC
PeerC <-->|"피스 3과 1의 교환"| PeerA
Note over PeerA,PeerC: 유저들끼리 가지고 있지 않은 피스를 퍼즐처럼 서로 교환한다
이 구조로 인해 원래의 서버(시드)는 참가자 전원에게 파일을 전부 전송할 필요가 없어집니다. 각 피스를 누군가 1명에게 건네주기만 하면, 나머지는 참가자들끼리 퍼즐 피스를 교환하듯이 증식시켜 나가기 때문에, “참가자가 늘어나면 늘어날수록 네트워크 전체의 다운로드 속도가 고속이 된다” 는 마법 같은 현상이 일어납니다.
3. 레어리스트 퍼스트 (Rarest First) 알고리즘
BitTorrent가 매우 효율적으로 기능하는 이유 중 하나가 다운로드할 피스의 순서를 결정하는 레어리스트 퍼스트(가장 희귀한 것부터 우선) 라는 똑똑한 알고리즘입니다.
만약 전원이 ‘파일의 맨 앞 피스’부터 순서대로 다운로드해 버리면, 무리 속에 ‘앞부분의 피스를 가진 사람만’ 있게 되고 뒷부분의 피스를 가진 사람이 극단적으로 적어지게 됩니다. 이렇게 되면 원래의 시드가 사라지는 순간, 아무도 파일을 100% 완성할 수 없게 됩니다.
그래서 BitTorrent는 무리 전체를 내다보고 “지금, 가장 유통되지 않은 (수가 적은) 레어한 피스부터 우선적으로 다운로드한다” 는 규칙을 각 피어에게 강제합니다. 이로 인해 모든 피스가 균등하게 네트워크 내에 확산되어, 원래의 시드가 없어져도 남겨진 유저들끼리의 교환만으로 파일을 완성할 수 있게 되는 것입니다.
4. 팃포탯 (Tit-for-Tat) 전략: 무임승차자 배제
P2P 네트워크에 있어서 최대의 과제는 ‘데이터를 받기만 하고 타인에게는 일절 업로드(제공)하지 않는다’는 이기적인 유저(프리라이더)의 존재입니다. 이들만 남게 되면 시스템은 붕괴합니다.
BitTorrent는 이 문제에 대해 Tit-for-Tat(팃포탯, 보복 전략) 이라고 불리는, 게임 이론에 바탕을 둔 강력한 대항책을 프로토콜 레벨에서 도입했습니다.
BitTorrent의 클라이언트 소프트웨어는 접속하고 있는 상대마다 ‘자신에게 어느 정도의 속도로 데이터를 업로드해 주고 있는지’를 항상 계측하고 있습니다. 그리고 “자신에게 많은 데이터를 주는 상대에게만, 그 보답으로 자신의 데이터를 우선적으로 전송한다 (Choke/Unchoke)” 는 동작을 자동으로 수행합니다.
즉, 업로드를 제한하고 ‘받기만’ 하는 유저는 다른 모든 유저로부터 ‘저 녀석은 데이터를 주지 않으니, 이쪽도 주지 않겠다’라고 판단되어 접속이 차단되고, 결과적으로 자신의 다운로드 속도가 극단적으로 느려지는 구조로 되어 있는 것입니다. 이타적으로 행동하는 것(업로드를 개방하는 것)이 이기적인 목적(자신의 다운로드를 빠르게 하는 것)을 충족하기 위한 최적해가 되도록 설계된, 놀라운 알고리즘입니다.
5. 트래커에서 DHT로의 진화 (분산화의 극치)
초기 BitTorrent에서는 ‘어떤 IP 주소를 가진 사람이 이 파일을 가지고 있는가’라는 명부를 관리하기 위해 트래커(Tracker) 라고 불리는 중앙 서버가 필요했습니다. 트래커가 다운되면 유저들끼리 만날 수 없게 되는 약점이 있었습니다.
하지만 현재의 BitTorrent는 DHT(Distributed Hash Table: 분산 해시 테이블) 라는 기술을 도입함으로써 트래커 서버조차 불필요(트래커리스)해졌습니다. 네트워크에 참가하는 수백만 명의 유저 자신의 PC가 연계하여 거대한 ‘분산형 명부’를 만들어 냄으로써, 중앙 서버가 완전히 존재하지 않아도 특정 파일을 가진 사람을 찾아내어 다운로드를 개시할 수 있는 궁극의 분산 시스템으로 진화를 이루었습니다.
6. 요약
BitTorrent는 ‘중앙의 거대한 서버가 전원에게 배포한다’는 20세기적인 발상을 버리고 ‘무리를 짓는 개체의 힘을 결집한다’는 인터넷 본연의 자율 분산 철학을 훌륭하게 구현한 기술입니다.
그 근간에서 움직이고 있는 ‘파일을 잘게 부순다’, ‘희귀한 것부터 모은다’, ‘협력하는 자에게 보답한다’는 로직은 오늘날의 블록체인 기술이나 분산형 클라우드 스토리지의 설계에도 막대한 영향을 계속해서 주고 있습니다.
