P2P
BitTorrent 동작원리
Torrent 파일 (.torrent) 다운로드
- 토렌트 파일 구조
- Torrent
- Filename
- Info Hash: 파일 식별자, ____으로 표시된 4개 값으로 생성됨. 하나라도 변경될 경우 해쉬 값 바뀜
- Tracker
- Tracker URL: 파일을 공유하는 피어들의 정보를 관리하는 서버 (트래커) 주소 (다수의 트래커를 이용할 수 있음)
- Tracker URL
- ...
- Meta Data
- Directory: 파일 다운로드 위치 = Files에 적힌 여러 개의 파일을 포함시켜 배포할 수 있음
- Created On
- Created By
- Comment
- Piece Length: 통신 시 주고받는 파일 조각의 크기
- Private
- Files
- Filname/Filesize: 공유하는 실제 파일의 이름
- Filname/Filesize
- ...
- Torrent
- 트래커 URL이 다르게 적힌 동일한 토렌트 파일을 bitTorrent 클라이언트에서 실행할 경우, 두 트래커가 가진 피어 정보가 다르기 때문에 클라이언트간 파일 공유 불가능
- 토렌트 파일 구조
Tracker Request (트래커에게 피어 리스트 요청)
- 동일한 hash값의 토렌트 파일을 실행한 BitTorrent 클라이언트들이 트래커 URL에 토렌트 파일에 포함된 정보를 전송 (Tracker Request/ HTTP Get)
- Tracker는 해당 hash에 해당하는 swarm (스웜)을 생성하고, hash 값을 보낸 피어들의 IP 주소를 swarm을 통해 관리
Tracker Response (피어 IP 리스트 받아오기)
- 트래커 서버가 Tracker request를 받으면 해당 메시지에 포함된 hash값을 참조해서 swarm 유무 판별
-> 없으면 새로운 swarm 생성 후 다른 피어로부터 tracker request 올때가지 대기
-> 있으면 swarm에 포함된 피어 IP를 리스트로 만들어 Tracker Response (HTTP Response)로 응답 (피어들에게 피어 리스트 전달) - 스웜에 피어가 50개 이상일 경우, 무작위로 피어를 선정하여 피어 리스트 구성
- Message parameter
- complete: 현재 파일을 공유하고 있는 시더들의 개수
- incomplete: 현재 파일을 받고 있는 리처들의 개수
- downloaded: 해당 공유 파일의 다운로드 완료 횟수
- interval: 클라이언트가 Tracker Request 전송하는 간격 (초)
- peers: 피어 IP 리스트
- 트래커 서버가 Tracker request를 받으면 해당 메시지에 포함된 hash값을 참조해서 swarm 유무 판별
Handshake (파일 다운로드 받기 위한 피어 간 통신/ Hash 교환)
- BitTorrent 클라이언트가 피어리스트를 받으면 피어리스트의 모든 피어 IP주소로 hash 값, peer Id 값을 보냄
- 이 메시지를 받은 피어 중 파일 공유가 가능한 피어는 hash 값으로 응답
- => Hash 교환을 통해 피어 간 세션 생성, 세션을 통해 파일 조각(piece)을 교환
- BitTorrent 클라이언트는 트래커로부터 피어들의 IP 주소 (default 50) 를 받아 세션을 생성
- 하나의 클라이언트는 동시에 여러 개의 세션을 생성함
- Bittorrent Handshake -> [Have -> Request -> Piece (Data in Piece)] 반복
- 내가 피스를 공유받으면 다른 피어들에게도 Have 를 보내서 공유받은 피스에 대해 Request를 받고 piece 전달 가능함
- Bittorrent Message
- Have: 자신이 가지고 있는 조각의 정보를 피어들에게 알림
- Request: 받고자 하는 조각의 Index / Offset 정보를 대상 피어에게 알림
- Piece: 실제 조각 (파일 데이터), Index / Offset 정보가 포함된 메시지
- Keep-alive: 대상 피어가 온라인 상태인지 체크
- Choke: request를 받아도 응답할 수 없는 상태임을 알림
- Unchoke: Choke 상태를 해지하여 request를 받을 수 있는 상태임을 알림
'Media' 카테고리의 다른 글
ffmpeg shaka packger로 인코딩, mpd 파일 생성하기 (0) | 2023.02.03 |
---|---|
node.js 비디오 비교하기 (0) | 2023.02.03 |
node.js HTTP 분할 다운로드 서버 (0) | 2023.02.03 |