読者です 読者をやめる 読者になる 読者になる

FUJILOG

見た、聴いた、触れたこと。 動かしたもの、書いたもの。 ウェブとリアルの備忘録です。

1ページで理解するP2P(Torrent編)

P2Pと聴くと不慣れなために抵抗感があったので、理解補助のためにTorrentの仕組みを調べてました。
 
すると、この資料を発見。

www.gitbook.com

 

ここまでP2Pの仕組みをわかりやすく書いてくれたkyorohiro++

ということで、理解したことを1ページにまとめるエントリ。

 

 
ざっとまとめてみると…
 
  1. Torrent file
    1. bencode
      データ形式の一つ。文字列、整数、辞書、リストの4つのデータを扱う。
    2. Torrent file
      Torrent fileはbencode形式で記述される。
      その内容は、「Trackerサーバのアドレス」「配信ファイル情報」「(分割された)ブロックデータごとのSHA1 Hash値」等で構成。

  2. UPnP
    1. Port Mapping
      1. 前提:P2P通信するために、GlobalPを取得する必要がある。
      2. UPnP Multicastで接続しているルーターにポートマッピング依頼用アドレスを発行。
      3. TCPでそのアドレスを通じて、Port Mapping依頼を発行。
      4. SSDPグループに参加して、リモートデバイスのGlobalIPを取得する。
        SSDPグループの参加手順
        1. UDPソケットを作成する
        2. SSDPグループからPort Map対応可能なデバイスを検索する
        3. ルーター経由でデバイスグローバルIPを取得する

  3. Tracker
    1. TrackerはHTTPサーバ。データを配信している Peer の一覧を管理する。
    2. クライアントはTrackerに対して、Getリクエストでデータ配信しているPeerの一覧を取得する。
    3. リクエスト内容
      Getリクエストで下記データ群を送信。
      「自身のPeerを識別する20byteのIDを生成」「Torrentファイル Info辞書のSHA1 Hashを生成」「サーバ側の通信用portの用意」「アドレスを生成」
    4. リスポンス内容
      Bencoding形式でデータを返す。
      「データ配信しているPeer一覧(ID、アドレスとポート番号)」

  4. DHT(分散ハッシュテーブル)
    サーバ・クライアント方式でない方式。特徴は以下3点。
    ・Peerは受け取ったInfoHashをもとに、その対応データを持ちそうなPeerを紹介する
    ・Peerどうしはお互いの距離を知っている
    ・Peerは自身に近いPeerの情報を多く持っている
    1. TorrentのDHT機能
      DHTの名前は「Kademila」
      ・XORでPeer間の距離を計算
      UDPでPeerどうしが通信を行う
    2. RoutingTable
      ・kBucketのRootingTableでPeerの一覧を管理(※kBucket:K個のPeer情報を格納する入れ物、Peerの識別子はKID)
      ・RootingTableは、0〜160までの161個のkBucketを保持する事ができる
      ・RootingTableを所持しているPeerとのXORを計算し、その値をもとにどのkBucketに追加するかを決める
    3. FindNode
      ・FindNodeクエリとFindNodeレスポンスでDHTネットワークを構築する
      ・FindNodeクエリを利用すると、指定したKIDにもっとも距離が近いNodeを教えてもらえる
      ・リスポンスを受けたらRootingTableを更新する  
    4. GetPeer/AnnouncePeer
      ・GetPeersメッセージを利用して、データを所持しているPeerまたは最も近いPeerを探すことができる
      ・GetPeerを繰り返して、上位K個のNodeが固定されたら、AnnounePeerメッセージを利用してデータを記録する
 
さらに簡略して、Torrentの仕組みを3行で書くなら…
  • Torrent fileをもとにPeer間でデータ送受信
  • リモートデバイスと通信するにはNAT越えが必要で、UPnPでリモートデバイスのGlobalIPを取得
  • クライアント・サーバ方式であればTrackerを、Trackerを介さない方式であればDHT(分散ハッシュテーブル)でP2Pを実現
 
UPnPでGlobalIPを取得する、Peer間のデータ受け渡しは分散ハッシュテーブルで実現されるという箇所が、技術の要のようでした。
 
 
■補足
UPnPUniversal Plug and Play):UPnPは、機器を通信ネットワークに接続すると、複雑な設定作業を行わなくても他機器と通信したり、その機能を利用できるようにするプロトコル
 
SSDP(Simple Service Discovery Protocol):SSDPは、ネットワーク上の機器を自動的に発見・接続するUPnPで用いられるプロトコルの一つで、機器の探索や応答を行うためのもの。