[forside] . Peer-to-peer (P2P) og BitTorrent 3. november 2004 Basim Reza og Jonas Fonseca [peer-to-peer] ... [bittorrent] BitTorrent fil-distribueringssprotokol Oversigt [slide 1] Formål: - Skalerbar distribuering ved at lade klienter dele ``byrden'' - Kan køres via en almindelig HTTP web server - Kræver ingen browser-plugin hos brugeren, men kun en MIME type association til en ekstern BitTorrent-klient - Åben protokol med community og mange implementationer som er med til at sikre konsensus [slide 2] Involverede parter BitTorrent protokollen omfatter følgende parter - Tracker(s). En mere eller mindre centraliseret service der holder styr på klienter - Seeder(s): Klient, som køres parallelt med trackeren, - Almindelige klienter [slide 3] bencoding Simpelt format til serialisering af data i forhold til 4 forskellige typer strenge: Format: ':' Eksempel: 3:p2p repræsenterer strengen "p2p" heltal: Format: 'i' 'e' Eksempel: i2e repræsenterer tallet "2" lister: Format: 'l' [ ] * 'e' Kan indeholde alle typer Eksempel: l3:p2p4:datae repræsenterer listen [ "p2p", "data" ] opslagslister (dictionaries): Format: 'd' [ ] * 'e' Associationer skal forekomme i sorteret rækkefølge Eksempel: d3:p2pi2ee repræsenterer opslagslisten [ "p2p" => 2 ] [slide 4] Metainfo filen - Indeholder data nødvendig for at en klient kan starte en download - Har endelsen .torrent med MIME typen application/x-bittorrent - Indeholder en bencoded dictionary - Nogle indgange i opslagslisten er frivillige - Specificerer bla. hvordan trackeren kontaktes - To mulige formater: enkelt-fil eller multi-fil torrents [slide 5] Både enkelt- og multi-fil torrents indeholder announce: URL streng hvor tracker kan kontaktes announce-list: (valgfri) liste af URLer til backup trackere creation data: (valgfri) .torrent filens oprettelses tidspunkt i sekunder siden epoch comment: (valgfri) fritekst streng fra filens forfatter created by: (valgfri) streng med navn og versionsnummer for programmet brugt til at lave .torrent filen info: en dictionary der beskriver filerne i den pågældende torrent piece length: størrelsen i bytes af hver fildel/blok (piece) undtagen den sidste blok der evt. kan have en mindre længde - for lille længe øger .torrent filens størrelse - for stor skaber ineffektiv udveksling af data - sædvanligvis potens af 2 - regel: vælg så .torrent filen blive omkring 50-75kB pieces: streng indeholdende 20-byte SHA1 hash værdier for hver fildel (piece) [slide 6] Enkelt-fil torrents Indeholder ``info'' dictionary ud over ``piece length'' og ``pieces'' length: længde af filen i bytes (heltal) md5sum: (valgfri) 32-tegns hexadecimal streng .torrent filens checksum name: streng med filnavn Filens indhold opnås ved at sammensætte alle fildele (pieces) [slide 7] Multi-fil torrents Indeholder ``info'' dictionary ud over ``piece length'' og ``pieces'' files: liste af dictionaries med en for hver fil indeholdende length: længde af filen i bytes (heltal) md5sum: (valgfri) 32-tegns hexadecimal streng .torrent filens checksum path: liste af streng som tilsammen giver stien til filen, eksempelvis [ "a", "b", "c.txt" ] giver stien a/b/c.txt name: streng med navnet på mappen indeholdende alle filer Filernes indhold opnås ved først at sammensætte alle fildele (pieces) og dernæst opdele i filer i forhold til længden og rækkefølgen givet i ``files'' listen. [slide 8] Tracker HTTP protokol - fra klient til tracker Har til formål at opsamle og give overblik og tilstanden af en torrent-sværm Kommunikation fra klient til tracker benytter HTTP GET requests til ``announce'' URL fra .torrent filen med CGI kald metode ?=&=&etc hvor alle værdier skal være URL-encoded og parametre være en af følgende info_hash: 20-byte streng med SHA1 hash værdi af ``info'' dictionary fra .torrent filen peer_id: 20-bytes streng som mindst er et unikt ID på den lokale maskine port: hvilket portnummer klienten lytter på (typisk 6881-6889) uploaded: talstreng med total antal bytes klienten har uploaded downloaded: talstreng med total antal bytes klienten har uploaded left: talstreng med antal bytes klienten mangler at hente event: (valgfri) udeladelse betyder requesten er periodisk started: sendes ved første request stopped: sendes når klienten lukkes completed: sendes når klienten har hentet det hele ip: (valgfri) klientmaskinens adresse, hvis den er forskellig fra requestens oprindelse numwant: (valgfri) antal peers som trackeren skal tilbagesende [slide 9] Tracker HTTP protokol - fra tracker til klient Trackeren svarer med et "text/plain" dokument som er en bencoded dictionary der indeholder failure reason: (valgfri / ekslusiv) streng med en besked om hvorfor klientens forespørgsel fejlede interval: antal sekunder mellem klientens forespørgsler til trackeren peers: liste af dictionaries indeholdende peer id: streng med peer-processens selvvalgte ID ip: streng med peer-processens IP adresse eller DNS navn port: peer-processens portnummer - Trackeren vælger enten tilfældigt eller mere intelligent hvilke peers, der sendes til klienten. - Klienten kan forespørge trackeren mere ofte end specificeret ``interval'', hvis en begivenhed indtræffer, eller hvis klienten ønsker at kende flere peers [slide 10] Tracker 'scrape' konvention Giver mulighed for at få statistik om torrents, som en tracker administrerer. - Benytter HTTP GET metode ligsom standard tracker request - Scrape-URL kan udregnes fra announce-URL ved at erstatte '/announce' med '/scrape' eksempel: http://some.tld/announce.php -> http://some.tld/scrape.php - Eneste mulige parameter er ``info_hash'' med værdien sat til 20-byte SHA1 hash værdi af ``info'' dictionary fra .torrent filen Svaret er en bencoded dictionary som indeholder files: en dictionary med en association for hver torrent complete: antal peers med hele filen downloaded: antal gange en klient har fuldført download incomplete: antal non-seeder peers (leechers) name: (valgfri) navn specificeret som ``name'' i .torrent filen [slide 11] Peer wire protokol TCP-baseret protokol til udveksling af data mellem peers - Initieres ved at peers udveksler en handshake besked - Efterfølgende udveksles længde-præfiksede beskeder indtil forbindelsen lukkes - Benytter ikke bencoding blandt andet specificeres heltal med 4-byte big endian værdier - Beskeder kan indeholde både kontroldata og data fra fildele [slide 12] Peer wire protokol - vedligeholdelse af klientens tilstand For hver peer som klienten har en forbindelse til vedligeholdes følgende boolske tilstandsvariabler for både klienten og peer-processen choked(x): Om x er ``interaktiv'' Hvis sand - vil ingen forespørgsler blive besvaret af x før tilstanden ændres - bør alle forudgående ubesvarede forespørgsler kasseres interested(x): Om x ønsker at udveksle data Hvis sand vil x begynde at forespørge når modtageren y sætter choked(y) til falsk - Startværdierne for tilstandsvariablerne er choked(client) = choked(peer) = 1 interested(client) = interested(peer) = 0 - Klienten kan forespørge og downloade fra peer-processen når interested(client) = 1 og choked(peer) = 0 - Klienten giver mulighed for at uploade til peer-processen når interested(peer) = 1 og choked(client) = 0 - Ændringer skal rapporteres med det samme, specielt interested(client) da peer-processen derudfra kan afgør om klienten vil begynde at downloade [slide 13] Peer wire protokol - handshake beskeder Sendes med det samme af processen der opretter forbindelsen og kvitteres af modtageren med en handshake besked så snart det kan verificeres at det er samme .torrent de to peer-processer er interesserede i Beskedens format er <1:pstrlen><8:reserved><20:info_hash><20:peer_id> pstrlen: længde af givet ved 1-byte pstr: streng, der identificerer protokollen for BitTorrent version 1.0 er den "BitTorrent protocol" reserved: 8-bytes reserveret til a kunne ændre protokollens virkemåde info_hash: 20-byte SHA1 hash værdi af ``info'' dictionary fra .torrent filen peer_id: 20-byte streng, der identificerer peer-processen - Hvis info_hash ikke er som forventet lukkes forbindelsen - Hvis peer_id ikke svarer til hvad trackeren oplyste lukkes forbindelsen [slide 14] Peer wire protokol - tilstands beskeder [slide 15] Algoritmer [...] Ulemper - Mange TCP-forbindelser?