BT(センタ付きトラッカー)通信プロトコルの分析

6586 ワード

原文住所:http://blog.chinaunix.net/uid-26548237-id-3056731.html BT通信プロトコルの例分析
       BT      DHT  ,    BT            。              BT  。

           BT    ,       ,           ,  ,    ,           ,    ,       BT         。      ,   。
  • BTプロトコルの動作プロセスBTプロトコルは、主に、.torrentファイルのフォーマット、tracker HTTP/HTTPSプロトコル、peer wireプロトコル(TCPを使用)の3つの部分を含む.ここで、tracker HTTP/HTTPSプロトコルは、BTクライアントとtrackerサーバとの間の通信プロトコルであり、peer wireはBTクライアント間の通信プロトコルである.

  • 1.1 torrentファイルの構造
       .torrent     ,   B  。B              ,  4     :bytestrings、integers、lists dictionaries。integers、lists dictionaries       i、l、d      ,   e      。bytestrings      /    ,    <           >:<   >, 4:spam     “spam”。 4            .torrent     。
    
                       ,             :
    
    d8:announce39:http://tracker.publicbt.com:80/announce13:announce-listll39:http://tracker.publicbt.com:80/announceel32:http://9.rarbg.com:2710/announceel44:udp://tracker.openbittorrent.com:80/announceel42:http://tracker.torrentbay.to:6969/announceel39:http://tracker.torrent.to:2710/announceel27:http://pow7.com:80/announceel28:http://10.rarbg.com/announceel38:http://exodus.desync.com:6969/announceel42:http://tracker.novalayer.org:6969/announceel35:udp://tracker.1337x.org:80/announceee
    主な成分は以下の通りです.
    ●announce:tracker    URL,    http://tracker.cnxp.com:8080/announce。
    
    ●announce-list:  。  tracker    URL  ,    http://tracker.cnxp.com:8080/announce,http://btfans.3322.org:6969/announce 。
    
    ●creationdate:  。.torrent       ,     UNIX  ,    1152105243。
    
    ●comment:  。.torrent               。
    
    ●createdby:  。  .torrent     ,           BitComet/0.67。
    
    ●encoding:  。            ,        GBK。
    
    ●info:公開されたファイルの情報.2つのフォーマット、単一ファイルフォーマット、およびマルチファイルフォーマットがあります.単一ファイルフォーマットにはlength、md 5 sum(オプション)、name、piecelength、piecesが含まれます.マルチファイルフォーマットにはfiles、name、piecelength、piecesが含まれます.filesにはlength、path、md 5 sum(オプション)が含まれ、各ファイルにはlength、path、md 5 sum(オプション)があります.
    また、いくつかの選択肢がありますが、ここでは説明しません.
    1.2 tracker HTTP/HTTPSプロトコル
       BT      .torrent  trackerr         ,                。          ,     ,              ;     ,     tracker   。
    
    第一に、クライアントはTrackerサーバーのIPアドレスを取得する
    図1のクライアントがDNS要求パケットを送信する
    DNSサーバの応答から、TrackerサーバのIPアドレスを取得できます.
    10.rarbg.com:別名サーバ
          :tracker.publicbt.com:95.211.88.54、95.211.88.49、95.211.88.51、
    
           9.rarbg.com:                    83.149.126.97
    
               exodus.desync.com:              208.83.20.164
    
               pow7.com:                        10.rarbg.com
    
               tracker.novalayer.org:          194.54.80.150
    
               tracker.publicbt.com:           95.211.88.54、95.211.88.49、95.211.88.51
    
           tracker.torrent.to:             127.0.0.1
    
               tracker.torrentbay.to:          109.235.55.11
    
               tracker.1337x.org:               95.215.62.224
    
               tracker.openbittorrent.com: 95.215.62.26
    
           Tracker    IP  。
    
    第二、TrackerHTTP/HTTPSプロトコル
       BT      .torrent    tracker         ,   peers  (   IP       )。          ,     ,              ;     ,     tracker   。
    
    図2 BTクライアントがTrackerサーバにHTTP要求を送信する
       447     HTTP      6  。
    
    図3 HTTP部分内容
    いくつかの成分は以下の通りです.
    ● info_hash:.torrentファイルのinfo部分のsha 1検証コード、合計20バイト.Trackerサーバは、パブリケーションリストで対応するレコードを見つけます.
    ● peer_id:BTクライアントの一意性識別は,クライアント起動時に発生し,合計20 bitである.peer-idを生成する具体的なアルゴリズムはないようで,一意性を保証できることだけが要求される.
    ●ip:オプション、IPアドレス、なければサーバーが自分で見つけます.
    ●port:リスニングポート、ここでは10775です.
    ●uploaded/downloaded:アップロード/ダウンロードされたバイト数(クライアントからトラッカーサーバに「started」を送信して計算を開始).
    ●left:ダウンロードするバイト数.
    ●numwant:オプション.クライアントがTrackerサーバから取得したいピアの数.
    ●key:オプションです.IPアドレスを変更しても、このフィールドを使用してBTクライアントを識別することができる拡張された一意性識別.
    ●compact:圧縮フラグ.値が1が圧縮フォーマットを受け入れるピアのリストを表す場合、すなわち6 byteで1つのピアを表す(前の4 byteはIPアドレスを表し、後の2 byteはポート番号を表す).値が0の場合は受け入れられません.
         ,  Tracker         ,              ,  ,         。
    
    図4カプセル化されたTrackerサーバインタラクションプロセス
       Tracker     tracker         ,           info_hash     ,        。      (NatCheck)    IP     ,              。                          IP   。            。
    
    図5 HTTP上部分データ
         “660:”           ASCII   ,“660:”       16         。         :         peers  76;     peers   10 ;           peers   34;interval   1967,    BT       1967       tracker         ;       983;peer    660   ,  BT             , 6          ,            110 。
    
    1.3 peer wireプロトコル
       BT                          ,          208.131.161.209:53062  ,              。     ,   TCP     。     A   208.131.161.209:53062,   B   172.16.8.93:3012.
    
    図6ピア間通信プロセス
         TCP    ,                :
    
    (1)握手,Handshakeパケットで実現する.
    (2)所有するリソースを交換する場合.Bitfieldパケットにより実現した.この例では、ピアBはまだリソースをダウンロードしていないため、リソースの所有状況を公表するのはピアAのみである.ピアAは、グループ283を通じて自身のリソース所有状況を公表した.
    (3)interested,nointerested,choke,unchokeの4種類を含むリソースへの意思疎通.
    (4)リソースを相互に要求し,request piece,pieceパケットにより実現する.
    (5)接続を切断する.peer wireプロトコルはTCP方式を使用しているため、ピアAとピアBが接続を切断する場合は、彼らの間のTCP接続を切断するだけでよい.
    図7 Handshakeパケットの上位コンテンツ
         :Handshake:
    
       pstrlen:       ,    。
    
           pstr:       ,     。
    
           reserved: 8      。           0.                                              。  Bram                ,                                         。
    
          info_hash:       info  (key)    20   SHA1   。  nfo_hash  tracker                         info_hash     。
    
          peer_id:           20      。  peer_id     tracker                             peer_id  (     ,   Azureus,        )。
    
        BitTorrent   1.0   ,pstrlen = 19, pstr = “BitTorrent protocol”。
    
                       。              torrent,            (torrent  infohash     )。    ,             info_hash   ,         。tracker  NAT-checking            peer_id   。
    
                       ,               info_hash,             。                  ,      peer_id     peer_id    ,              。           tracker  peer   ,     peer    peer_id。   tracker  peer_id           peer_id。
    
    図8 Bitfiledパケット上位データ
       bitfield:
    
       itfield               ,            。     ,         piece( ),         。bitfield       ,  x  bitfield    。payload    bitfield, bitfield          piece( )。           piece   0。   0          piece,   1            piece。         0。
    
            bitfield          。             bitfield   bitfield        ,         。
    
    図9 request pieceパケット上位部
       request piece         。
    
              ,       。payload      :
    
       index:  ,       piece  。
    
       begin:  ,  piece          。
    
       length:  ,       。