Go 로 BitTorrent 클라이언트 구현하기 (Jesse Li)

Source

  • Evernote/Inbox/Building a BitTorrent client from the ground up in Go Jesse Li.md

Summary

이 문서는 Go 언어를 사용하여 BitTorrent 프로토콜의 핵심 기능을 구현하는 과정을 설명합니다. BitTorrent 가 중앙 서버 대신 피어 간(P2P) 파일 분산을 사용한다는 점을 전제로, .torrent 파일의 구조와 Bencode 인코딩 방식을 파싱하여 트래커 주소, 파일 정보, 그리고 각 조각(Piece) 의 SHA-1 해시 값을 추출하는 방법을 다룹니다. 특히 파일 무결성 검증을 위해 조각 단위로 해시를 비교하는 메커니즘을 강조하며, 실제 Debian ISO 파일을 다운로드 대상으로 삼아 구현의 타당성을 검증합니다.

Key Points

  • BitTorrent 는 중앙 서버가 아닌 피어(Peer) 간에 파일을 조각(Piece) 단위로 나누어 주고받는 P2P 프로토콜이다.
  • .torrent 파일은 Bencode 형식으로 인코딩되어 있으며, 트래커 URL, 파일 메타데이터, 조각 크기, 각 조각의 SHA-1 해시 정보를 포함한다.
  • Bencode 는 JSON 과 유사한 구조(문자열, 정수, 리스트, 딕셔너리)를 가지나 바이너리 데이터 처리에 효율적이고 스트림 파싱이 용이하다.
  • 다운로드된 각 조각의 해시를 .torrent 파일에 기록된 해시와 비교하여 파일의 무결성을 검증하고, 의도적인 오염(Poisoning)을 방지한다.
  • 본 구현은 2001 년 원본 스펙(BEP 0003) 을 따르며, DHT 나 Magnet 링크 같은 분산 피어 발견 방식은 제외하고 중앙 트래커(HTTP) 를 사용한다.