저도 C나 C++로 소스가 공개된 된 Bittorrent를 구해보려고 애써봤지만
소스가 괜찮으면 성능이 별로고 성능이 좋으면 소스가 별로였습니다. ㅠㅜ
그래서 이소스 저소스를 보다보니 프로토콜이랑 알고리즘에 대해 좀
알게 됐는데 도움이 될까 해서 써봅니다..
일단 Bittorrent-이하 토렌트-의 탄생 배경 부터 보면, 사람들이 P2P 공유
프로그램을 사용하면서 실제로는 자기가 받을 것만 받고 나눠주지 않는
자비롭지 않은 행동을 합니다.
당나귀가 파일을 쪼개서 받으면서 서로 보내주게 해놨지만, 아시다시피
목적은 다운로드지 업로드가 아니기 때문에 업로드 속도제한은 반드시
다운로드보다 낮게 (최대한 0kbps에 가깝게 해놓습니다.
토렌트는 이 짓을 못하게 하려고 파일을 조각조각 나눠서 배포하되
아무 것도 없는 다운로더에게는 공짜로 조각을 약간 주고 그 조각을
가지고 함께 파일을 공유하고 있는 사람들끼리 교환 하도록 합니다.
나에게 많이 업로드 해줄 수록 고맙다고 내 것도 많이 주는거죠.
반대로 업로드를 많이 할 수록 다운로드 속도도 빨라지겠죠?
이걸 여러명이서 계속 돌아가면서 하고, 그 결과 다운로드 속도가
점점 빨라지게 됩니다.
따라서 자기 자신의 클라이언트를 수정(또는 해킹)해서 업로드 속도를
제한해도 업로드 속도가 잘 나와주지 않으면 날 친구로 생각해주지
않기 때문에 빨리 받고 싶다면 어쩔 수 없이 업로드를 좀 해줘야 됩니다.
토렌트가 채용한 파일 공유 방식은
1. 트랙커 프로그램을 깔면 일종의 웹서버 처럼 작동합니다.
2. 완전한 파일에서 만들어낸 metainfo 파일(트랙커 주소 포함)을 만들어서 등록
3. 완전한 파일을 가진 자신이 최초 시더(Seeder)가 됩니다.
4. 토렌트 파일(metainfo)을 누군가에게 줍니다. (웹배포 등)
5. 그 파일을 받은 사람이 토렌트 클라이언트 프로그램으로 트랙커에 접속하고,
6. 해당 metainfo를 다운로드 하고 있는 사람으로 등록됩니다.
7. 다운로드 하고 있는 사람들은 일정 시간마다 트랙커에서 목록을 갱신받아 서로 통신 합니다.
트랙커는 metainfo를 가졌지만 그안에 뭐가 들은지 모르는 우편배달부
처럼 되는거죠.
우리나라는 스토리지 사이트나 P2P 프로그램도 많아서 토렌트가 빛을 발하지
못했지만 외국에는 토렌트를 통한 파일 공유가 굉장히 활성화되어 있는데...
음.. 개인적으로는 우리나라만한 인프라가 없는 외국의 경우 큰 파일 공유에
적합하기 때문이라고 생각 됩니다.
단점을 따지자면... 공식 토렌트 사이트에서 배포하는 클라이언트는
자기가 가진 metainfo 파일 목록과 원본 파일의 무결성 확인이라던지
이런 개념이 전혀 없는 아주 단순한 다운로더 처럼 생겨서 파일을
다운받는 도중에 동료들이 많으면 참 좋지만, 받고난 다음에는 땡이라
파일의 공유 수명이 짧다는 문제가 있습니다.
하지만 공식 클라이언트는 단지 소스 공개 차원이고.. 요즘엔 Azureus,
ABC, BitTornado등 위 단점들을 보완한 공개 클라이언트를 많이 쓰지요.
이쁘기도 하고..
게임 업체에서 토렌트를 파일 배포에 이용하려면 불편한 점으로는..
1. 일반적으로 공유되는(동영상, 게임; 파일과 달리 회사 이외에는
Seeder를 해줄 사람이 없기 때문에 배포한 모든 파일에 대해 항상
Seeding을 하고 있어야 된다는 점..
2. 고객들로 부터 걸려오는 전화. "인터넷이 느려졌다. 업로드는 왜하냐?" -> "어떻게 할 수가..."
이럴 경우 WoW처럼 프로그램에 업로드 제한 버튼을 넣어서 다운로드까지 느려지게 하는게
최선인가요? ㅡ_ㅡ;;
3. 트랙커 관리 스트레스
하지만 (특히 서비스 초기에) 많은 유저들을 상대로 고가의 CDN 비용을
들이지 않고 훨씬 빠르게 배포할 수 있는 아주 좋은 대안이라고 생각 됩니다.
ps. 상품 중 하나긴 하지만, 토렌트를 좀 수정해서 CDN서비스 업체도 사용하던데요.