1P by GN⁺ 2일전 | ★ favorite | 댓글 1개
  • 이 오픈소스 프로젝트는 Go 언어로 구현된 BitTorrent 클라이언트로, 파일 다운로드 기본 로직을 자체 구현함
  • Bencode 인코딩/디코딩을 직접 처리하며, 강력한 오류 검증 기능을 포함함
  • .torrent 파일 파싱, 정보 해시 계산, 피어 간 통신 등 핵심 기능을 포괄적으로 지원함
  • 동시 다운로드 및 파일 조립, 블록 단위 저장 관리 등 실제 활용도를 높이는 기능을 포함함
  • 기존 BitTorrent 오픈소스와 비교해 Go 언어의 심플함, 코드 구조의 명확성, 모듈화에서 강점 보유함

개요

이 프로젝트는 Go 언어로 직접 BitTorrent 클라이언트를 구현함
BitTorrent 프로토콜을 사용한 파일 다운로드 기능을 자체 개발 형태로 제공함
핵심적으로, 토렌트 파일 파싱, 피어 발견, 파일 다운로드 기능을 다룸

주요 기능

  • Bencode 인코딩/디코딩

    • 문자열, 정수, 리스트, 딕셔너리 등 모든 Bencode 타입 지원
    • 강력한 에러 처리 및 데이터 검증 적용
  • 토렌트 파일 처리

    • 단일 및 멀티 파일 토렌트 모두 파싱 가능
    • Info 해시 및 각 피스 해시 추출, 모든 표준 필드 지원
  • 피어 발견 및 통신

    • HTTP 트래커 지원
    • 피어 간 핸드셰이크 프로토콜 구현
    • BitTorrent 메시지 프로토콜 및 피어 연결 관리 수행
  • 다운로드 기능

    • 피스 및 블록 단위 관리
    • 동시 다운로드 처리
    • 다운로드 진행률 추적 및 파일 조립
    • 블록 단위 스토리지 관리로 효율성 제공

프로젝트 구조

  • cmd/ : 커맨드라인 인터페이스 및 실행 파일
  • internal/
    • bencode/ : Bencode 인코딩 및 디코딩 기능
    • torrent/ : 토렌트 파일 파싱 및 처리
    • tracker/ : 트래커 프로토콜 구현
    • peer/ : 피어 간 통신 기능
    • download/ : 다운로드 관리 기능
  • pkg/ : 외부에 노출 가능한 패키지 모음

요구 사항

  • Go 1.21 이상 필요

사용법

  • 현재는 프로젝트 초기 개발 단계로, 사용법 안내는 추후 추가 예정임

개발 현황 및 계획

  • 현재 개발 활발히 진행 중
  • 자세한 개발 단계는 checkpoint.md 파일에 기록
  • 향후 계획:
    • Magnet 링크 지원
    • 메타데이터 교환 프로토콜
    • DHT(분산 해시 테이블) 지원 예정

참고 문서

  • BitTorrent 프로토콜 명세
  • Bencode 명세

프로젝트 중요성 및 강점

  • 이 프로젝트는 Go 언어 특유의 단순한 문법과 병렬성을 활용해 BitTorrent 클라이언트의 복잡한 요소를 명확히 모듈화하여 구현함
  • 구조가 명확해 확장성·유지보수성 측면에서 학습 및 실전 적용 모두에 이점 제공함
  • 비교적 초기 단계임에도 핵심 BitTorrent 프로토콜 기능을 빠르게 실현하였음
Hacker News 의견
  • bencode 디코더에서 동적 메모리 할당 크기를 제한해주는 것이 좋겠다는 제안 전달. 토렌트 파일이나 announce에서 들어오는 입력값은 신뢰할 수 없기 때문에 악의적인 입력이 매우 큰 할당 요청을 하여 서비스 거부(DoS)를 일으킬 수 있음. 스트링 파싱에서 적절한 상한선은 남은 입력 길이로 설정할 수 있으며, 제대로 된 토렌트는 파일의 남은 길이보다 긴 문자열을 가질 수 없음

    • 이 지적을 할 일 목록에 추가함
  • 프로젝트가 깔끔하고 심플해 보여서 좋음. 사용 예시를 Readme에 원라이너로 추가하면 좋을 것 같음. 예시로 ./go-torrent My-Linux-Distro-Wink-ISO.torrent 같이 사용법을 보여주는 문장 추가 추천. 만약 torrent.ParseFromUrl 기능도 추가한다면 더 좋은 점수. 모든 사람이 자기만의 “영적 여정”을 위해 이런 경험을 해볼 가치가 있음

    • 제안을 고맙게 생각함
  • codecrafters에서 제공하는 비슷한 챌린지 소개. 이 과정에서는 프로세스 진행과 테스트 등을 도와주고 무료 한달 동안 해봤는데 꽤 재미있었음
    https://app.codecrafters.io/courses/bittorrent/overview

  • Go 개발자가 아닌 입장에서 왜 예전 Go 1.21 버전을 사용하는지 궁금함. 특별히 구버전을 고집하는 이유가 있는지 질문. 찾아보니 10개월 전에 이미 지원 중단됨

  • 정말 멋진 프로젝트임. 대학 시절 조지아텍 네트워킹 수업에서 이걸 최종 과제로 했었는데, 코드는 잃어버렸지만 배운 교훈은 평생 남음. 이런 프로젝트는 새로운 언어를 익히기에 참 좋은 방법임

  • 마그넷 링크를 지원하는지 질문함.
    Edit: 앞으로 추가될 기능임을 알게 됨

    • 아직 지원은 안 하지만 곧 추가할 예정임
  • 이런 거 어떻게 만들었는지 궁금함. 직접 프로토콜 사양을 봤는지, 아니면 다른 구현을 참고했는지 질문. 이런 걸 맨땅에서 어떻게 구현하는지 항상 궁금함

    • 흥미롭게도 최근 Go로 직접 Bittorrent 클라이언트를 만들기 시작함. 개인적으로 AI/LLM을 코딩에 쓰는 걸 선호하지 않고, 직접 진짜로 배우는 것이 목적임. 제일 먼저 한 일은 Bittorrent 프로토콜의 공식 스펙을 찾아보는 것. 사실 스펙은 생각보다 간단하지만 좀 빈약함
      https://www.bittorrent.org/beps/bep_0003.html
      추가 확장들은
      https://www.bittorrent.org/beps/bep_0000.html
      작업을 아주 작은 단위로 쪼개서 직접 결과를 확인해나가는 게 중요함. 예를 들어 .torrent 파일 파싱부터 시작했는데, bencoding을 직접 구현해야 했음. Arch Linux용 .torrent를 다운받아보니 잘못된 포맷이었고, url-list 같은 예상치 못한 키가 나오더라. 이게 뭔지 조사해보니까 bep_0019 관련이었음. 최종적으로 Debian Linux .torrent 파일을 성공적으로 파싱함
      그 후 트래커 announce HTTP 요청과 피어 프로토콜도 구현함. 피어 프로토콜은 꽤 어려웠고, 실험적 태도가 큰 도움이 됨. 데비안 토렌트에서 announce URL을 제거해 peers가 아예 없도록 설정한 다음, KTorrent에서 내 클라이언트를 직접 추가해서 주고받는 메시지를 관찰하고, 그 결과를 바탕으로 내 코드도 수정함. 굉장히 많은 시행착오와 디버깅 과정이 있었음
      일부 세부 프로토콜은 도저히 공식 문서에서 안 보여서 소소하게 ChatGPT에 물어본 적도 있고, 클라이언트마다 구현이 조금씩 달라 자세한 알고리즘들은 명확하지 않음. 어떤 블록을 받을지, 어떤 피어와 연결할지, choke/unchoke는 어떻게 동작하는지 등은 제대로 정리되어 있지 않음. 웹 검색이 큰 도움이 됨
      추가로 https://wiki.theory.org/Main_Page 사이트에도 도움 되는 정보가 있음
      지금은 KTorrent와 완전한 다운로드/업로드가 가능한 단계임. 앞으로는 트래커에서 피어를 얻고, 다운로드할 블록을 선정해서 파일에 저장하는 알고리즘 개발이 남음
      더 세부적인 과정이 궁금하면 언제든 질문 바람
  • GUI 추가는 얼마나 어려운지 질문. Go에서 GUI 구현 사례가 별로 본 적 없음

  • 이런 프로젝트에 관심 있어서 한 번 해볼까 생각했었음. 얼마나 어렵고, 얼마나 완성도가 높다고 생각하는지, DHT, Magnet, NAT traversal 같은 복잡한 기능까지 구현했는지 궁금함. 실제로 시중에 거의 모든 토렌트를 커버하려면 꼭 필요한 기능 목록이 뭔지조차 잘 모르겠음. 토렌트 관련 프로토콜이 워낙 많아서 전체 리스트도 모르겠고, 각 프로토콜이 뭘 하는지조차 파악이 안됨

    • 어려운 정도는 경험, 언어 숙련도, 실험적 태도에 따라 크게 다름. 예시로 본인도 지난 주 Go로 Bittorrent 클라이언트 만들기 시작했는데 일주일 만에 여기에 올라온 프로젝트의 80% 수준까지 옴. Go와 프로토콜, 네트워킹 지식이 많고 실험하는 게 습관이 돼 있어서 빠르게 진척됨
      Bittorrent 공식 사양 자체는 정말 짧아서 한 시간 정도면 읽고 이해할 수 있음 https://www.bittorrent.org/beps/bep_0003.html
      하지만 주변 확장 프로토콜이 워낙 많고, 각 클라이언트마다 지원 수준이 다름. 예를 들어 프로토콜 암호화(실제로는 난독화) 시도를 먼저 하고 안 되면 일반 프로토콜로 진행하는 경우가 많음
      만약 리눅스 배포판처럼 공식 .torrent 파일로 다운로드만 하고 싶으면 난이도는 확실히 낮음. 주로 파일 하나, 트래커도 있고, 대부분 표준 프로토콜 쓰는 피어만 있으니 NAT 환경에서도 내부 포트 오픈 없이 충분히 동작
      물론 일반적인(특히 회색지대) 토렌트를 원한다면 magnet 링크 파싱, 피어 발견 위한 DHT, 자동 포트 매핑 위한 UPnP까지 점점 추가해야 함. 하지만 이 역시 기능별로 하나하나 단계를 나눠가면서 구현 가능. 기능이 많을수록 더 많은 피어를 찾고 성공적으로 교환할 수 있음

    • 꽤 도전적이었고, 프로토콜이나 bencoding 방식 익히고, 전체 구조를 머릿속에 그린 다음 코드를 작성하는 데 거의 한 달 걸림. Magnet과 DHT는 아직 지원 안 함

  • v2 및 mutable torrents가 구현됐는지 질문. 반드시 mutable torrents를 구현해줬으면 하는 바람 전달