继续BT的研究-第二部份关于BT中的tracker 上次关于BT的研究主要是研究了BT文件的静态文件结构主是.torrent文件的结构,今天又看了libbt的代码并调试跟踪了btlist,这两天看了关于bt传输的文档,初步跟踪了bt的传输部份的代码这里做一个记录整理。 (一)关于BT的服务器 BT服务器主要有以下几个要素 (1)服务器上要运行一个tracker (2)运行一个web server (3)把.torrent的文件做好关联 (4)生成一个有效的种子文件 (5)把种子文件放到网页上 (二)关于BT中的tracker 这个就是BT之精华所在,是BT技术的灵魂,当建立连接的时候,tracker从所有下载者那里收集信息并帮助他们随机的配对,这个有点像P2P的打孔服务器,通过这个东东帮助下载者建立基于TCP的联接的通道,所有的过程是基于HTTP协议的。 所有的下载者通过周期性的与tracker联系报告他们的进度和信息,通过不同的连接上传和下载他们数据,连接是TCP连接,应用的是BitTorrentpeer协议 (三)关于BT代码的分析 这部份代码主要要看btget.c这个函数,因为这个函数库用了两个第三方的开源库,所以要想门儿清最好先了解一下libcurl和openssl两个工程。 ctx_register( ctx, dl);这一句代码是取tracker文件的 int ctx_register( strUCt btContext *ctx, unsigned download) /* * Contact the tracker and update it on our status. Also * add any new peers that the tracker reports back to us. */ { btDownload *dl=ctx->downloads[download]; btObject *resp; assert(download<ctx->downloadcount); /* contact tracker */ resp = btrequest( dl->url, ctx->myid, ctx->mykey, dl->infohash, ctx->listenport, dl->fileset.dl, dl->fileset.ul * ctx->ulfactor, dl->fileset.left,"started" ); if(!resp) return -EAGAIN; #if 0 btObject_dump( 0, resp); #endif btresponse( ctx, download, resp); btObject_destroy( resp); return 0; } 上面做出标记的部份就是去服务器取traker部份的代码,这个函数用到的就是libcurl库的功能函数 main函数有一段循环的代码应该就是收发数据的部份了,今天就记到这儿,明天再继续吧。 关于tracker文件格式做一个补充说明 例子: * Tracker GET requests have the following keys urlencoded - * req = { * info_hash => 'hash' * peer_id => 'random-20-character-name' * ip => 'ip-address' -or- 'dns-name' * port => '12345' * uploaded => '12345' * downloaded => '12345' * left => '12345' * event => 'started', 'completed' -or- 'stopped' * } * Tracker responses are bencoded dictionaries. * * resp = { * failure reason => 'error text' * - or - * interval => 12345 * peers => { * peer id => 'identifier' * ip => 'ip-address' -or- 'hostname' * port => 12345 * } * } 具体代表的含义明天再继续了,老婆刚才又生气了,原因是我刚刚让她不要干扰我工作 |