スクラッチから直接実装したBitTorrentクライアント
(github.com/piyushgupta53)- Go-TorrentはGoで作られたBitTorrentクライアント実装であり、BitTorrentプロトコルを使ってファイルをダウンロードする中核機能を実装している
- 実装範囲には**.torrentファイルのパース**、ピア発見、ピア通信、ファイルダウンロードまでが含まれ、単一ファイルと複数ファイルのトレントの両方を処理する
- Bencodeは文字列、整数、リスト、辞書型をサポートし、エラー処理と検証機能を含む
- ダウンロード機能はピース(piece)とブロック管理、同時ダウンロード、進捗追跡、ブロック単位の保存管理を提供する
- プロジェクトはまだ活発に開発中であり、今後Magnet link、metadata exchange protocol、DHT対応が予定されている
Go-Torrentが実装している機能
- Go-TorrentはGoで書かれたBitTorrentクライアント実装である
- BitTorrentプロトコルを使ってファイルをダウンロードできるようにする中核機能を実装している
- 主な実装範囲は以下の通り
- トレントファイルのパース
- ピア発見
- ファイルダウンロード
Bencodeとトレントファイル処理
- Bencodeエンコード/デコードはすべてのBencode型をサポートする
- 文字列
- 整数
- リスト
- 辞書
- エラー処理と検証を含む
- トレントファイル処理は
.torrentファイルのパースをサポートする- 単一ファイルトレント
- 複数ファイルトレント
- info hashの計算とpiece hashの抽出をサポートする
- 標準的なトレントファイルフィールドをサポートする
ピア発見と通信
- HTTP trackerによるピア発見をサポートする
- ピアのハンドシェイクプロトコルを実装している
- 完全なBitTorrentメッセージプロトコルを含む
- ピア接続管理を提供する
ダウンロードと保存管理
- ダウンロード機能は**ピース(piece)**およびブロック管理を含む
- 複数のダウンロードを同時に実行できる
- ダウンロード進捗を追跡する
- 単一ファイルと複数ファイルトレントの両方についてファイル組み立てをサポートする
- 保存管理はブロック単位のgranularityで動作する
構成、要件、開発状況
- プロジェクト構成は以下のパッケージに分かれる
cmd/: コマンドラインインターフェースとメインアプリケーションinternal/bencode/: Bencodeエンコード/デコードinternal/torrent/: トレントファイル処理internal/tracker/: トラッカープロトコル実装internal/peer/: ピア通信internal/download/: ダウンロード管理pkg/: 公開パッケージ
- 要件はGo 1.21以上である
- インストールはリポジトリをクローンした後に
go mod downloadを実行する方式である - 使い方のドキュメントはプロジェクトがさらに成熟したら追加される予定である
- 現在の実装状況はcheckpoint.mdで確認できる
- 計画されている機能は以下の通り
- Magnet link対応
- Metadata exchange protocol
- DHT(Distributed Hash Table)対応
- 参考資料はBitTorrent Protocol SpecificationとBencode Specificationである
1件のコメント
Hacker News のコメント
すばらしい。ただし信頼できない入力なので、bencode デコーダーでは動的割り当てのサイズを制限したほうがよさそう
torrent ファイルや announce レスポンス内の悪意ある入力が、文字列のパース中に非常に大きな割り当てを要求し、クライアントをサービス拒否に追い込む可能性がある。正しく作られた torrent なら、残りの入力長より長い文字列は含められないので、残りの入力長を上限にすればよさそう
すっきりしていてシンプルに見えるのがいい。README に
.torrentファイルを実際にダウンロードする使用例を1行入れるとよさそう例:
./go-torrent My-Linux-Distro-Wink-ISO.torrentさらに
torrent.ParseFromUrlまで入れるともっとよいし、こういうプロジェクトは誰でも自己鍛錬として一度はやってみる価値があるいいね。codecrafters に、この過程を少し案内してテストも提供してくれるチャレンジがある。無料の1か月で少しやってみたけど面白かった
https://app.codecrafters.io/courses/bittorrent/overview
すばらしい。自分もこういうものを考えたことがある。どれくらい難しかったのか、どの程度「完成」していると見なせるのか気になる。DHT、Magnet、各種 NAT トラバーサル機能まで扱っているのかも気になる
自分がいつもつまずいていたのは、実際に流通している大半の torrent でそのまま動くクライアントを作るには、必要な機能一覧が何なのか分からないことだった。torrent に関係するプロトコルは何十個もあるように見えるし、全体一覧どころか、それぞれが何をするのかもよく分からない
確かに難しかった。プロトコルと bencoding がどう動くのかを学び、頭の中にモデルを作ってから実際のコードを書くまでに、ほぼ1か月かかった
Magnet と DHT はまだ追加前
難易度は、経験、使うプログラミング言語への慣れ、実験する姿勢に大きく左右される。参考までに、自分も先週 Go で Bittorrent クライアントを作り始め、1週間で投稿されたプロジェクトの80%くらいまで来た
ただし自分は Go の経験が多く、プロトコルとネットワーキングの知識もかなりあり、実験がほとんど第二の天性のようになっている
興味があるなら、Bittorrent の中核仕様は実際かなり短く、1時間ほどで簡単に読んで理解できる: https://www.bittorrent.org/beps/bep_0003.html
Bittorrent の「周辺」にはプロトコル拡張のようなものが多いが、これまで見た限りではクライアントごとにサポート水準が異なる。たとえば Protocol Encryption は実質的には難読化に近く、まずその方式で通信を試み、うまくいかなければ設定に応じて通常プロトコルに戻る
Web サイトの
.torrentファイルで Linux ディストリビューション、たとえば Debian をダウンロードする程度なら比較的まっすぐ進められる。ファイルは1つで、トラッカーがあり、通常プロトコルを使うピアが多く、NAT の背後にいる場合でも接続を受け付けなくてもある程度可能自然とグレーゾーンのコンテンツに入っていくと、Magnet リンクをパースし、DHT でピアを探し、モデムでポートを自動マッピングしようとして UPnP も実装したくなるかもしれない。それでもこれも反復的に1つずつ積み上げればよい。機能が多いほど、より多くのピアを見つけて、うまく交換できる可能性が高まる
Go 開発者ではないので聞きたいのだが、なぜ古い Go 1.21 を使っているのか気になる。旧バージョンに留まる理由があるのか?
追記: 10か月前にサポート終了したようだ
Windows 7 サポートは、古い Go リリースに留まる理由の1つ。Go 1.21.4 以下で作ったプロジェクトは、すべての Windows リリースと2009年以降に作られたコンピューターで動作するが、v1.21.5 に上げると、特にメリットもなく、より最近のコンピューターと Windows 10/11 でしか動かなくなる
https://github.com/golang/go/issues/64622
README はおそらく AI が生成したものに見える。実際の
go.modファイルには Go バージョンが 1.23.1 と書かれており[1]、これは Go 1.23.1 以上が必要という意味[2][1] https://github.com/piyushgupta53/go-torrent-client/blob/6130...
[2] https://go.dev/doc/modules/gomod-ref#go-notes
とてもいい。大学時代を思い出す。Georgia Tech のネットワーキング授業の期末プロジェクトでこれをやった
コードはずっと前に失くしてしまったが、そのとき学んだ教訓はまだ残っている。こういうプロジェクトは新しい言語を学ぶにもよい方法
試してみるのに向いた種類のプロジェクト。自分も似たものをやったことがあるが、他の人が作った bencode エンコーダー/デコーダーを見て謙虚な気持ちになった
言語機能を探るにもよい方法。もちろん、大規模ライブラリのすべての機能に追いつこうとするのはかなりむなしいし、クライアント間の互換性もすでに不足していると思う
実装過程についての文書を公開する予定があるのか気になる。個人的にはコードそのものよりそちらのほうに興味がある
プロトコルのさまざまな側面を実装するアプローチや過程を深く扱う資料が多くないため
v2 と mutable torrents もやったのか気になる。お願いだから誰か mutable torrents を実装してほしい
Magnet リンクはサポートしている?
追記: ああ、予定機能だった