1. BitTorrent ?
- P2P 방식의 파일 공유 프로토콜로서, 파일을 여러개의 조각으로 나누어 서로 공유함
- 브램 코헨이라는 사람이 창안하여, BitTorrent 회사를 창립하고 이를 통해 유지보수하고 오픈소스로 배포함
- 전세계 네트워크 사용량을 보면, 동영상 스트리밍이 1위이고 2위가 P2P 이며, P2P 트래픽의 90%를 BitTorrent가 차지함.
- 클라이언트의 종류로는 BitTorrent, μTorrent 가 있음.
2.BitTorrent 의 동작 개요도와 용어설명
1) Piece
- 공유 파일의 한조각 의미함
- 토렌트는 하나 파일을 여러개의 조각으로 나누고, 조각단위로 공유함
- 조각의 크기는 토렌트 생성시 설정할 수 있음
2) Seeder : 공유 파일의 모든 조각을 가지고 있는 클라이언트
3) Leecher : 공유 파일의 일부 조각만 가지고 있는 클라이언트
4) Peer : Seeder 와 Leecher 를 총칭
5) Tracker
- 파일 공유를 위한 피어들의 정보를 가지고 있는 서버.
- 토렌트가 오픈소스이기 때문에, 관련 지식이 있다면 누구나 트래커 서버를 개설, 운영할 수 있음.
- 토렌트 파일마다 Tracker 를 여러개 가지고 있을수 있고,
유명한 트래커 일수록 많은 피어들이 있을수 있음. 피어들이 많다는 건 속도가 높다는 걸 의미 함
- 구글 검색만으로도 전세계적으로 유명한 트래커 서버주소들을 알 수 있음.
- 일반적으로 비공개 토렌트 집단들은 하나의 비공개 Tracker 서버를 통해서 이뤄지는 것이며,
비공개 Tracker 서버에 접속하는 클라이언트의 각종 정보(대표적으로 해당사용자가 얼마나 업로드를 했고, 다운로드를 했는지에 대한 정보)들을 이용하여, 운영 규칙에 맞지 않는 사용자들을 필터링함.
6) Swarm
- 트래커가 가지고 있는 것으로,
- 공유 파일마다의 Hash(고유식별자) 정보와 피어 리스트의 정보 모음.
- 다시말해서, 현재 해당 파일을 공유하고 있다고 Track서버 등록되어 있는 있는 피어들을 목록을 의미함.
- 이를 기반으로 Tracker 에게 접속하는 client들에게 peer 목록을 전송해줌.
7) Torrent File
- 토렌트에 대한 기본 정보를 가지고 있는 메타 파일
- 파일 구조
Name | Parameter | Description |
Torrent | File name | 토렌트 파일 이름 (A.torrent) |
Info Hash | 공유하는 파일의 고유한 Hash 값 | |
Tracker | Tracker URL | 트래커의 주소 여러개 포함 가능 |
Meta Data | Directory | 토렌트 파일이 저장되는 디렉토리 이름 |
Created On | 생성 일자 시간 | |
Created By | 생성자 정보 | |
Comment | 생성자가 작성한 설명 | |
Piece Length | 공유에 사용할 파일 조각의 크기 | |
Files | File name | 공유하는 실제 파일 이름 |
3.BitTorrent 동작 원리와 절차
1) 토렌트 시작
- 토렌트 파일을 실행하여 클라이언트에 등록
- 해당 토렌트 파일에 명시 된 Tracker 들에 접속 시도
2) Peer와 Tracker 간 통신 - Tracker Request (Http 프로토콜 이용)
- 클라이언트가 Tracker에게 해당 토렌트파일의 고유한 Hash 값과 본인 peer의 정보를 전송함.
(해당 토렌토의 피어 목록을 얻기 위한 목적)
- Tracker Request Parameter : 클라이언트가 Tracker 에게 요청할때, 보내는 데이터들
Parameter | Description |
info_hash | 토렌트 파일에 포함된 공유 파일의 Hash 정보 |
peer_id | 클라이언트를 식별하기 위한 ID |
port | Tracker Response 메시지에서 사용되는 클라이언트 TCP/UDP port |
upload | 클라이언트가 업로드한 공유 파일의 총계 (byte) |
download | 클라이언트가 다운로드한 공유 파일의 총계 (byte) |
left | 다운로드 받을 파일의 남은 크기 (byte) |
key (option) | 클라이언트 IP 주소가 변경되더라도 클라이언트를 인식할 수 있는 비공개 값 (peer 들간에 공유 되지 않음) |
numwant (option) | 몇 개의 Peer 들의 정볼르 받을 것인지 요청 (기본 50) |
compact | Set 1: Peer 들의 IP주소와 Port 정보 만을 받음 Set 2: IP 주소와 Port 외에 Peer-ID 등의 정보를 받음 |
no_peer_id | Peer-ID는 생략하고 정보를 요청 ( compact = 1 경우 무시 ) |
event | Started: 파일 전송 시작 상태 Stopped: 파일 전송 중지 상태 Completed: 파일 전송 완료 상태 |
ip (option) | 클라이언트의 IP 주소 |
3) Peer와 Tracker 간 통신 - Tracker Response (Http 프로토콜 이용)
- Tracker Request 를 받은 Tracker는 해당 토렌트의 Hash 값을 참조하여, Swarm 이 존재하는지 검색.
- 존재 한다면, Swarm에 포함된 Peer들을 목록으로 만들어 클라이언트에게 전송함.
Peer 목록의 개수 Tracker Request 에서의 numwant에 의해 결정되고, (기본 50)
이때, 선정되는 Peer들은 순수하게 랜덤으로 선정됨.
- 존재 하지 않는다면, Swarm 을 새로 생성하고 다른 Peer 들로부터 Tracker Request 이 있을때까지 대기함.
- Swarm 은 앞서 설명한 것처럼 Peer 들이 토렌트 시작시 전송한 Tracker Request 에 의해 목록이 생성되어 관리됨.
- Tracker Response Parameter : Tracker 가 클라이언트에게 응답할때, 보내는 데이터들
Parameter | Description |
complete | 현재 파일의 공유하고 있는 Seeder들의 개수 |
downloaded | 해당 공유 파일의 다운로드 완료 횟수 |
incomplete | 현재 파일을 받고 있는 Leecher들의 개수 |
interval | 클라이언트가 Tracker Request 를 전송하는 간격의 시간(초) |
min interval (option) | interval 의 최소시간(초) |
peers | Peer의 IP 주소 리스트 |
※ Peer 목록을 결정할 때의 문제점
- 사실 토렌트의 가장 큰 단점이라 할 수 있음.
- Tracker 가 Peer 목록을 결정할 때, 현재 네트워크망의 트래픽과 피어간의 거리 등을 고려하지 않고 완전 랜덤으로 결정됨.
다시 말해, 피어가 네트워크망 내에 가까이 있음에도 불구하고 먼 지역, 다른 나라의 피어를 목록으로 만드는 경우가 발생함.
이는 네트워크 상의 엄청난 효율성 문제를 야기함.
첫번째로 당연히 파일 공유 속도의 저하 발생.
두전째로는 다른 나라의 네트워크망과 연결될 때, ISP 사업자(LG, SK, KT)는 추가적인 금전적 비용이 발생함. (일반 사용자들의 추가적인 금전적 비용 발생은 없음) 그래서 ISP 사업자들이 토렌트를 굉장히 싫어할 것임.
- 이를 해결하기 위해 피어의 네트워크를 위치를 기반으로 하는 P4P 라는 기술을 개발함. Tracker 서버와 Torrent 클라이언트가 ISP 사업자들에게 피어들의 네트워크 위치를 요청하고 이를 기반으로 목록을 작성한다는 것임.
하지만 비영리, 비공개적으로 Trakcer 서버를 운영하는 운영자들이 ISP 사업자들과 협력한다는게 가능할지는 미지수.
4) Peer간 통신 - 세션 연결
- 트래커와 통신에 의해 피어의 목록을 받은 클라이언트는 해당 피어들에게 Hash, 본인 Peer Id를 전송하여 연결 가능여부를 파악
- Hash 를 받은 Peer 는 본인이 연결 가능하다면, Hash, 본인의 Peer Id 를 전송하여 응답.
- 서로 Hash 를 주고 받으면 세션이 연결되고 파일 전송을 준비함.
- Peer 의 수에 따라, 여러개의 세션이 연결됨.
Message | Description |
Keep-alive | 대상 Peer가 on-line 상태인지 체크 |
Choke | Request 를 받아도 응답 할 수 없는 상태임을 알림 |
Unchoke | Choke 상태를 해지하였다고 알림 |
Have | 자신이 가지고 있는 Piece 의 정보를 Peer들에게 알림 |
Request | 받고자 하는 Piece 의 index 와 Offset 정보를 대상 Peer 에게 알림 |
Piece | 실제 Piece(파일데이터)와 index, Offset 이 포함된 메시지 |
7) Peer간 통신 - Piece 전송
- 세션 연결에 성공한 Peer는 서로 자신이 보유한 파일의 Piece 정보를 전송함.
- 클라이언트는 Peer들에게 받은 Piece 정보를 토대로 자신이 필요한 Piece 를 요청하고 해당 Peer로 부터 Piece 다운로드함.
6) Peer간 통신 - Piece 다운로드 완료
- 클라이언트는 해당 Piece를 다운로드 완료하면, 다른 Peer들에게 자신이 해당 Piece 를 보유하고 있다는 정보를 전송함으로써, 해당 Piece 를 보유하고 있지 않는 Peer 들을 자신에게 다운로드 받도록 유도함.
8) 모든 Piece 다운로드 완료
- 클라이언트는 모든 Piece 를 다운로드 받으면 해당 토렌트를 Reecher에서 Seeder 로 변경하고 업로드를 대기함.
참조 : http://www.netmanias.com/ko/?m=view&id=techdocs&no=5185
'개발자의 기록 노트' 카테고리의 다른 글
[Rust] 시작하기 - 개발 환경 만들기 (0) | 2023.03.26 |
---|---|
Notepad++ Plugin : NPP Export Plugin (0) | 2017.02.15 |
[Mac OS] 맥의 OS X에서 readelf와 같은 binary utility 사용하기 (0) | 2016.04.04 |
[Mac OS] Eclipse로 맥에서 C/C++ 개발환경 만들기 (0) | 2016.01.16 |
TiddlyWiki : DB와 설치가 필요없는 간단한 one file 위키 (0) | 2015.01.02 |
The Expert (Short Comedy Sketch) : 개발자, 프로젝트 매니저 그리고 UX담당자와 클라이언트 (0) | 2015.01.02 |