BitTorrent 프로토콜의 동작원리

Understanding of the BitTorrent Protocol

By Netmanias (tech@netmanias.com)

BitTorrent는 오늘날 인터넷 트래픽 중에 많은 부분을 차지하고 있는 프로토콜로서 사용자가 인터넷을 이용하여 자료를 다운로드 받을 경우 기존의 서버 – 클라이언트 방식이 아닌, 클라이언트 – 클라이언트 방식의 P2P 방식을 사용하는 프로토콜이다. 이러한 P2P 방식을 이용하여 자료를 공유하면 공유하는 사용자가 많을수록 다운로드 속도가 빨라지는 특징을 가진다. 본 문서에서는 BitTorrent 프로토콜을 이용하여 파일을 공유하기 위한 동작 원리를 알아보고, 자료를 다운로드 받기 위한 BitTorrent 클라이언트와 트래커 간의 통신 및 피어와 피어 간의 통신 방식에 대해 살펴 보도록 하겠다.

1. BitTorrent 프로토콜 특징

 

BitTorrent는 P2P(Peer-to-Peer) 방식을 사용하는 대표적인 프로토콜로서 전세계 인터넷 트래픽 중 매우 많은 부분을 차지하고 있다. BitTorrent 프로토콜은 기존의 파일 다운로드 방식인 서버-클라이언트 구조의 일대일 파일 공유 방식이 아닌 클라이언트-클라이언트 구조의 일대다 파일 공유방식을 사용하는 대표적인 프로토콜이다. 그림 1은 기존의 파일 공유 방식(a)과 P2P 파일 공유 방식(b)의 차이를 보여 주고 있다.

 

그림 1. 기존의 전송 방식과 P2P 방식의 비교

 

그림 1의 (a)와 같이 일대일 파일 공유 방식은 서버가 “이소라.mp3”라는 파일을 가지고 있고 클라이언트가 서버로부터 “이소라.mp3”를 받아가는 방식이다. 일대일 파일 공유 방식은 인터넷 환경과 서버의 성능/정책에 따라 파일 전송 속도가 결정되며, 이 속도는 전송이 완료될 때까지 유지되는 것이 일반적이다.

 

일대다 파일 공유 방식은 그림 1의 (b)와 같이 “이소라.mp3” 파일을 5개의 조각(Piece)으로 나누어 각 클라이언트 간에 조각들을 서로 교환하는 방식이다. 클라이언트는 “이소라.mp3”의 조각들을 소유/공유하고 있는 클라이언트와 세션을 생성하여 필요한 조각에 대하여 전송을 요청한다. 각 클라이언트들은 “이소라.mp3”를 공유하고 있는 새로운 클라이언트를 발견하면 자신이 가지고 있는 조각의 정보를 알려주고 새로운 클라이언트에게 자신이 필요한 조각을 요청한다. 이러한 방식 때문에 하나의 클라이언트는 여러 개의 클라이언트들과 무수히 많은 세션(Multiple Session)을 생성하게 되며 세션이 계속하여 늘어남에 따라 사용자의 다운로드 속도는 점진적으로 늘어나 클라이언트가 사용하는 인터넷 환경의 최대 대역폭까지 다운로드 속도가 증가한다.

 

BitTorrent 프로토콜은 파일을 공유하는 많은 클라이언트들과 동시에 많은 세션들을 생성하여 매우 빠른 다운로드 속도로 파일을 받을 수 있다. 하지만 무수히 많은 세션을 생성하여 파일을 공유하는 방식에 대한 문제점들이 통신 사업자에서 논의되고 있으며 이러한 문제점을 이해하기 위해서 BitTorrent 프로토콜의 원리에 대한 이해가 필수적이다.

 

2. BitTorrent 프로토콜 동작원리
 

1장에서 설명한 바와 같이 BitTorrent는 P2P 방식을 사용하는 대표적인 프로토콜이다. P2P 방식은 클라이언트와 클라이언트 간에 세션이 직접 생성되는 것과 공유하고자 하는 파일을 여러 개의 조각(Piece)으로 나누어 주고받는 것이 특징이다.


BitTorrent 프로토콜을 사용하여 파일을 다운로드 받기 위해서는 BitTorrent 클라이언트 프로그램(e.g., BitTorrent, uTorrent 등)을 설치하여야 한다. 설치 이후 사용자는 웹(토렌트 커뮤니티, 웹 서핑 등)을 통해 다운로드 받고자 하는 파일의 정보가 담긴 토렌트 파일(확장자: .torrent)을 받아 실행하여야 한다. 토렌트 파일은 공유 할 파일을 가지고 있는 사용자가 자료 공유를 목적으로 토렌트 파일을 작성하여 웹에 게시하는 것이 일반적이며, 자료를 얻고자 하는 유저는 해당 토렌트 파일을 받아 실행하면 자료를 다운로드 받을 수 있다.


그림 2는 BitTorrent 클라이언트를 이용하여 파일을 다운로드 받는 절차를 보여 주고 있다.

 

그림 2. BitTorrent를 이용한 파일 다운로드

 

• 조각(Piece): 공유 파일을 작은 용량 단위로 조각 낸 파일
• 시더(Seeder): 공유 파일의 완전체를 가지고 있는 클라이언트(파일의 모든 조각을 소유)
• 리처(Leecher): 공유 파일의 불완전체를 가지고 있는 클라이언트(파일의 일부 조각만을 소유)
• 피어(Peer): 시더와 리처를 총칭함
• 트래커(Tracker): 파일 공유를 위해 피어들의 정보를 관리하는 서버
 스웜(Swarm): 각 공유 파일마다 존재하며, 공유 파일에 대한 고유 식별자(Hash)와 공유 파일을 소유하고 있는 피어 리스트 정보를 가짐. 스웜은 트래커에 의해서 관리됨

 

① 토렌트 파일 (.torrent) 다운받기
사용자는 “이소라.mp3”를 다운로드 받기 위해 웹 검색 등을 통해 토렌트 파일인 “이소라_mp3.torrent”를 다운로드 받아서 실행 하여야 한다. 해당 토렌트 파일에는 “이소라.mp3”를 위한 고유의 Hash 값이 포함되어 있으며 트래커의 URL 주소가 포함되어 있다. Hash 값은 파일 식별자로써 동일한 파일 이름을 가진 다른 컨텐츠와 구분을 위하여 생성되는 고유의 값이며 트래커의 URL은 파일을 공유하는 피어들의 정보를 관리하는 서버(트래커)를 지정하는 것이다. 만약 동일한 파일에 대하여 트래커의 URL이 서로 다르게 적혀있는 토렌트 파일을 클라이언트에서 실행하게 되면 클라이언트들의 정보를 서로 다른 트래커에서 관리하게 되므로 서로 다른 트래커를 이용하는 클라이언트들간에는 파일을 공유할 수 없다.


② 트래커에 피어 리스트 (IP 주소 리스트 ) 요청하기: Tracker Request
“이소라.mp3”를 다운로드 받고자 하는 사용자가 토렌트 파일을 실행하면 BitTorrent 클라이언트는 토렌트 파일에 포함된 “이소라.mp3”의 고유 Hash 값을 트래커(토렌트 파일에 포함되어 있는 URL)로 전송한다. 이 메시지를 Tracker Request(HTTP Get)라고 한다. 이와 같이 동일한 토렌트 파일을 사용하여 “이소라.mp3”를 공유하고 있는 모든 피어들은, 트래커에게 “이소라.mp3”의 Hash 값을 보내게 된다. 피어들로부터 Tracker Request를 받은 트래커는 “이소라.mp3”의 Hash값에 해당하는 스웜(Swarm)을 생성하고 “이소라.mp3”의 Hash 값을 보낸 피어들의 IP 주소를 이 스웜을 통해 관리한다.


③ 피어 리스트 (IP 주소 리스트 ) 받아오기: Tracker Response
Tracker Request를 받은 트래커는 해당 메시지에 포함된 “이소라.mp3”의 Hash 값을 참조하여 해당하는 스웜이 존재하는지를 확인한다. 만약 존재하지 않는다면 새로운 스웜을 생성하고 다른 피어로부터 Tracker Request가 들어올 때까지 기다린다. 기존에 만들어진 스웜이 존재하여 피어들의 정보가 있을 경우에는 스웜에 포함되어 있는 피어들을 리스트로 만들어 Tracker Response 메시지(HTTP Response)에 포함하여 응답한다. Tracker Response에 들어있는 피어 리스트는 피어들의 IP 주소로 이루어지며 Tracker Request를 보낸 피어에게 알려주는 피어 리스트는 50개 피어들의 IP 주소로 구성된다. 만약 스웜에 존재하는 피어의 개수가 50개 이상인 경우, 트래커가 50개가 넘는 피어들 중에 무작위로 피어의 IP 주소를 선정하여 피어 리스트를 구성한다.


④ 파일 다운로드 받기
피어 리스트를 받은 BitTorrent 클라이언트는 모든 피어 IP 주소로 “이소라.mp3”의 Hash 값을 보낸다. 이 메시지를 받은 피어들 중에 “이소라.mp3” 파일 공유가 가능한 피어는 동일한 “이소라.mp3”의 Hash 값으로 응답 하게 된다. 이러한 Hash 교환을 통해 피어와 피어는 세션을 생성하게 되고 생성된 세션을 통해 조각을 교환한다. BitTorrent 프로토콜은 이러한 방식으로 트래커로부터 다수의 피어들 IP 주소(기본 설정 50개)를 받아 세션을 생성하므로 하나의 클라이언트는 동시에 여러 개의 세션을 생성하게 된다.

 

 

3. BitTorrent 프로토콜 메시지
 

3.1 토렌트 파일 (.torrent) 구조
BitTorrent를 사용하여 파일 공유를 원하는 사용자는 먼저 토렌트 파일을 생성하여야 한다. 토렌트 파일은 다운로드 받고자 하는 클라이언트에게 필요한 정보가 포함된 메타 파일(Meta File)이다. 토렌트 파일은 공유된 파일을 찾아서 다운받기 위한 일종의 지도 역할을 한다. 그림 3과 표 1은 토렌트 파일에 포함되는 내용에 대해서 설명하고 있다.

 

그림 3. 토렌트 파일 (.torrent) 구조

 

토렌트 파일을 구성하는 정보 중에 Directory, Piece Length, Private, Filename이 Hash 값을 생성하기 위해 사용되는 파라미터들이다. 이 4개의 값 중에 한 개라도 변경될 경우 해당 토렌트 파일의 Hash값이 변경되며 이렇게 변경된 토렌트 파일은 기존의 토렌트 파일과 Hash값이 다르므로 트래커에서는 다른 컨텐츠로 인식된다.


기존의 P2P에서는 한번의 공유로 하나의 파일(e.g., 나는_가수다.zip)만을 주고 받을 수 있었다. 하지만 BitTorrent는 기존의 P2P와 다르게 하나의 토렌트 파일 안에 여러 개의 파일들을 포함 시킬 수 있다(e.g., 이소라.mp3, 김범수.mp3, 임재범.mp3, …).

 

이렇게 여러 개의 파일을 공유하기 위하여 토렌트 파일에는 “Directory”를 지정하게 되며 “Files” 내에 여러 개의 파일을 포함 시켜서 배포가 가능하다. 실제로 해당 토렌트 파일을 이용하여 파일을 다운로드 해보면 “Directory”에 설정된 디렉토리인 “/서바이벌 나는 가수다 경연 3-2 (네티즌 추천곡)(320K)/”에 파일들이 저장된다(e.g., D:/download/서바이벌 나는 가수다 경연3-2 (네티즌 추천곡)(320K)/01_사랑이야(송창식)_이소라.mp3, …).

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

 

표 1. 토렌트 파일 구조

 

3.2 피어(Peer)와 트래커(Tracker) 간 통신
피어와 트래커의 통신은 HTTP(HyperText Transfer Protocol) 프로토콜을 이용한다. BitTorrent 클라이언트에서 토렌트 파일을 실행하면 토렌트 파일에 포함된 정보를 기반으로 트래커에게 피어 리스트를 요청한다. 요청을 받은 트래커는 BitTorrent 클라이언트에서 보내온 Hash 정보를 기반으로 해당 스웜에 속해있는 피어들의 리스트를 요청한 클라이언트에게 알려준다. 그림 4와 표 2는 피어와 트래커 간의 통신에 사용되는 메시지를 설명하고 있다.

 

그림 4. 피어와 트래커 간 통신 (Peer to Tracker)

 

표 2. 트래커 Request Parameter

 

3.3 피어(Peer) 간 통신
트래커를 통해 피어 리스트를 받은 BitTorrent 클라이언트는 리스트에 있는 피어들과 BitTorrent 프로토콜을 이용하여 통신을 시작한다. BitTorrent 클라이언트는 파일을 교환하기 위하여 피어들과 서로의 정보를 주고 받는다(Handshake).

 

이후 피어들은 자신이 가지고 있는 조각의 정보를 피어들에게 주기적으로 알려주며 자신이 필요한 조각은 대상 클라이언트에게 요청하여 조각을 받는다. 그림 5는 피어와 피어 간에 조각을 교환하기 위한 메시지 순서를 보여 주고 있다.

 

그림 5. 피어 간 통신 (Peer to Peer)

 

사용자(BitTorrent 클라이언트)는 BitTorrent Handshake(1~4) 이후 피어 1과 피어 2에서 Have 메시지를 받았다(5~6). 해당 Have 메시지에는 피어 1과 피어 2가 가지고 있는 조각의 정보가 포함되어 있다. 이러한 Have 메시지를 통해 사용자는 피어 1이 가지고 있는 조각을 알게 된다. 0x000001ed라는 조각을 피어 1에게 요청(Request 메시지)하여 피어 1로부터 해당 조각을 Piece 메시지를 통해 전송 받게 된다(7~8).

 

이후 사용자는 자신이 새로운 조각을 가지게 되었으므로 Have 메시지를 통해 0x000001ed인 조각을 자신이 가지고 있다고 피어 1과 피어 2에게 알려준다(9~10). 피어 2에서 0x000001ed인 조각을 사용자에게 요청하는 경우(11), 사용자는 자신이 가지고 있는 조각이므로 피어 2에게 해당 조각을 전송하여 준다(12). 이러한 방식으로 피어와 피어 간에 조각 교환이 계속하여 발생한다.

 

표 3은 피어와 피어 간 통신에 사용되는 BitTorrent 메시지 타입이다.

 

표 3. BitTorrent 메시지

 

4. 글을 마치며
 

본 기술 문서를 통해 BitTorrent 프로토콜의 기본 동작 원리에 대하여 살펴 보았다. BitTorrent 프로토콜에는 본 문서에서 서술한 내용 외에도 tit-for-tat, End Game, DHT, uTP 등의 다양한 알고리즘 등이 사용되고 있으며 이는 다음 기회에 넷매니아즈 기술 문서를 통해 소개하도록 하겠다.


P2P는 사용자 입장에서 빠른 다운로드 속도를 제공하는 프로토콜이지만 멀티 세션을 생성하기 위해 선택하는 피어들이 “무작위”로 선택됨으로 인하여 ISP(Internet Service Provider) 갂의 IX(Internet eXchange) 트래픽이 과다하게 발생한다. 또한 소수의 P2P 사용자가 대부분의 네트워크 대역폭을 과점유하여, 회선을 공유하는 다른 사용자들이 충분한 대역폭을 보장 받지 못하는 문제점 등이 꾸준히 거론되고 있다.


본 문서 이후에 P2P를 사용함으로 인해 발생하는 문제점 중의 하나인 ISP 간의 IX 트래픽 과다 발생 문제를 해결하기 위한 방안으로 제시되고 있는 P4P 기술에 대하여 소개하도록 하겠다.


참고문헌


[1] David Erman, Dragos Ilie, Adrian Popescu , “BitTorrent Session Characteristics and Models”, 3rd International Conference HET-NETs'05, 2005,
http://www.comp.brad.ac.uk/het-net/HET-NETs05/ReadCamera05/P30.pdf
[2] Wiki Theory, “BitTorrent Protocol Specification v1.0”, http://wiki.theory.org/BitTorrentSpecification
[3] “Torrent Editor.com”, http://torrenteditor.com/

 

[출처] http://www.netmanias.com/ko/?m=view&id=techdocs&no=5185

 

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
24 [파이썬으로 구현한 알고리즘] (4) 버블 정렬(Bubble Sort) file 졸리운_곰 2018.02.27 679
23 [파이썬으로 구현한 알고리즘] (3) 선택 정렬(Selection Sort) file 졸리운_곰 2018.02.27 549
22 [파이썬으로 구현한 알고리즘] (2) 스택/큐 (Stack/Queue) file 졸리운_곰 2018.02.27 607
21 [파이썬으로 구현한 알고리즘] (1) 연결 리스트(Linked List) file 졸리운_곰 2018.02.27 946
20 텍스트 마이닝 4편. 형태소 분석(1/3) 졸리운_곰 2018.02.18 2013
19 텍스트 마이닝 3편. 형태소 분석 사전작업 졸리운_곰 2018.02.18 761
18 텍스트 마이닝 2편. 텍스트 파일 file 졸리운_곰 2018.02.18 1199
17 텍스트 마이닝 1편. 소개 file 졸리운_곰 2018.02.18 913
16 파이썬으로 MySQL DB에 데이터 저장하기, Python handles transactions with MySQL file 졸리운_곰 2018.02.14 469
15 공공 데이터 csv 파일로 저장하기 [3] 졸리운_곰 2017.10.10 663
14 공공 데이터 csv 파일로 저장하기 [2] 졸리운_곰 2017.10.10 559
13 공공 데이터 csv 파일로 저장하기 [1] 졸리운_곰 2017.10.10 517
12 JSON 데이타 가을의곰 2017.06.18 595
11 python으로 json 파일 쉽게 파싱하기 가을의곰 2017.06.18 779
10 Python에서 SQLAlchemy로 MS-SQL 연동하기 졸리운_곰 2017.05.07 439
9 python에서 sqlite 사용법 file 졸리운_곰 2017.04.26 876
8 Python의 pandas를 사용하면 몇줄의 코드만으로 Data Analysis를 쉽고 강력하게 처리할 수 있다 file 졸리운_곰 2017.03.05 648
7 파이썬으로 XML 처리하기 졸리운_곰 2016.11.15 388
6 SQLAlchemy 시작하기 졸리운_곰 2016.06.11 948
5 SQLAlchemy 시작하기 – Part 2 졸리운_곰 2016.06.11 539
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED