[컴퓨터 네트워크] BitTorrent

Pakxe·2023년 10월 10일
0

컴퓨터 네트워크

목록 보기
14/16
post-thumbnail

Torrent

파일을 조각(chunk)내서 관리한다. 이를 토렌트라고 한다.

토렌트에는 중요 개념 3가지가 존재한다.

1. torrent file

토렌트 파일 format

{ 
  name: 파일 이름,
  hash ID: 같은 파일이어도 이게 다르면 다르게 조각났다는 의미, 
  chunk size: 청크 하나의 사이즈(보통 256kb), 
  length: 파일 크기,
  tracker addr: 트래커 주소
} 

2. chunk

파일을 나눠서 만들어진 패킷같은 조각 = chunk
하나의 청크는 16개의 서브 청크로 구성된다.
따라서 하나의 req는 하나의 서브 청크 res이다. 그리고 이 req는 파이프라이닝이 가능하기 때문에 동시에 많은 서브 청크를 다운받을 수도 있다.
다만 서브 청크를 업로딩하는건 안되기 때문에 서브 청크 16개를 모아 완전한 하나의 청크가 되어야지 업로딩을 할 수 있다.

3. tracker

청크를 가진 피어 정보들을 가진 서버
청크를 공유하는 피어와 청크를 다운받는 피어들을 연결하기 위해서 사용한다.

이 트래커덕분에 모든 파일이 하나의 네트워크에서 돌아다니는게 아니라, 하나의 파일을 매개로 피어들이 연결되기 때문에 이 네트워크에는 다른 파일이 돌아다니지 않는다. 그리고 이 네트워크는 트래커가 주는 피어 리스트를 받아야 참여할 수 있기 때문에 최신일수록 좋다. (그래서 구글에 트래커를 쳐보면 트래커를 공유하기도 한다.)

흐름

엘리멘탈 영화를 다운받는다고 해보자. 그리고 이 영화가 5개의 청크로 나뉘어졌다고 가정한다. 난 최대한 빠르게 엘리멘탈을 받아 영화를 시청하고 싶다.

인터넷에서 엘리멘탈.torrent 파일을 다운받아 토렌트에 전달한다. 그럼 토렌트 프로그램이 이 토렌트 파일 안의 tracker addr 필드를 보고 트래커를 연결해준다. 그럼 난 이제 이 트래커의 피어가 된다.

그리고 트래커가 나에게 피어중 일부의 IP 주소 목록을 주고 난 이 IP 주소들과 TCP 연결을 맺는다. 이렇게 맺어진 피어들을 이웃 피어라고 한다. 그리고 이 이웃 피어들에게 청크 목록을 달라고 한다. 이 청크 목록을 바탕으로 없는 청크부터 다운로드 할 것 이다.

첫 청크는 랜덤으로 선택해 다운받아온다.

그 다음 청크를 빨리 다운받으려면 어떤 청크부터 다운받아야할까? 엘리멘탈을 원하는 모든 피어들이 1번부터 다운받길 원한다면 이 엘리멘탈 분배 네트워크에는 1번 청크만 가득 넘쳐나고 2, 3, 4, 5번 청크는 상대적으로 적은 피어만 갖고 있을 것이다. 따라서 어떤 청크를 다운받을 지는 현재 가장 레어(희귀)한 청크부터 다운받는다. 이런 방식으로 이 엘리멘탈 분배 네트워크에는 모든 청크가 거의 비슷한 비율로 유지된다. 만약 청크 4만 없는데, 갖고 있는 피어가 1명 뿐이고 그마저도 네트워크 상태가 안좋다면 낭패다. 하지만 ratest first방식으로 인해 많은 유저가 청크를 갖고 있게 되고, 그 중에서 나에게 가장 빠른 피어와 TCP연결을 맺고 청크를 다운로드 할 수 있게 되었다.

만약 이렇게 가져오는 중에 새로운 피어가 엘리멘탈 분배 네트워크에 들어왔다면, 이제 나도 다운받은 청크가 있으니 leecher가 되어 새로운 유저에게 업로딩을 할 수 있게 된다.

torrent algorithm

1. 조각 선택 알고리즘

토렌트는 다운로드 시작 단계, 중간 단계, 마지막 청크를 다운로드 하는 단계 각각 다른 전략을 갖는다.

strict priority: 모든 과정에 해당, 청크 다운중엔 다른 청크 신경쓰지말고 이 청크를 다운받는 것에 최우선

random first piece: 시작 단계, 유저가 가진 청크가 하나도 없는 경우, 랜덤으로 선택한다. 앞에서 언급했던 하나의 청크만 많아지는 현상을 막기 위한 전략이다.

ratest first: 중간 단계, 해당 청크를 갖고있는 피어 수가 가장 적은 청크를 선택해 다운

end game mode: 마지막 청크 단계, 마지막 청크 다운시 피어 전체에게 req를 보낸다. 마지막 청크가 느리면 결국 파일 다운이 느려지는 것과 같기 때문이다. 청크 다운이 끝나면 다른 피어들에게는 cancel req를 보낸다.

2. chocking algorithm

업로딩은 하지 않고 다운로딩만 하는 피어(free rider)를 방지하기 위한 알고리즘이다.

chocking: 일시적으로 특정한 피어에게 업로딩 거부(=일시 정지먹음)

이 알고리즘은 10초(예시)마다 각 피어들의 업로딩 속도를 체크해 choke할지 unchoke할지 결정한다. 업로딩 속도가 빠르면 그만큼 제공하는 게 많다는 이유이므로 연결을 맺어 서로 교환해 상호 이득을 취할 수 있다.

많이 다운하기 위해선 많이 업로드하고 업로드 속도가 빠른 피어가 되어야 하기 때문에 free rider를 막을 수 있는 것이다. free rider는 업로드 속도가 안나와 상호 교환 연결을 맺을 확률이 낮기 때문이다.

3. peer select algorithm

트래커에게 받은 피어 목록에서 나와 연결된 피어들은 unchoke 피어라고 하고, 연결되지 않은 피어들은 choke 피어라고 한다.

토렌트에선 업로딩하는 피어가 다운로딩 피어에게 "unchoke"를 보냄으로서 다운로드가 실행된다. 이때 unchoke되는 피어의 수는 4명까지다.

이 4명은 optimistic unchocking 3명, random selection 1명으로 구성된다.

optimistic unchocking: 일정 시간마다 업로딩 속도를 체크해 자신에게 업로딩하는 속도가 빠른 피어에 대해 unchoke를 수행한다. 이건 3명만 선택한다.

random selection: 일정 시간마다 랜덤으로 피어 1명을 선택한다. 처음 들어오는 피어에게도 unchoke될 수 있는 가능성을 주는 것이다.

이런 과정을 거쳐 모든 청크를 다운받아 완전한 파일 소유자가 되었다면 seeder된다. seeder가 되도 업로딩은 할 수 있다.

seeder 상태에서는 이젠 얻어올 필요가 없으니 unchock 피어를 고를 때 내가 아닌 다른 피어로의 업로딩하는 속도가 빠른 피어를 선택한다. 그래야 더 빨리 퍼질 수 있기 때문이다. 그리고 이렇게 업로딩을 많이 해두면 나중에 다른 파일을 받을 때도 가산점을 먹고 들어간다.

이것이 토렌트의 전략

profile
내가 꿈을 이루면 나는 또 누군가의 꿈이 된다.

0개의 댓글