Project

General

Profile

Protocol core-core Version 3 » History » Version 39

Greg Burri, 07/10/2009 12:00 AM

1 1 Greg Burri
h1. Protocols
2
3
This page describes the protocols used by Aybabtu for network communication between cores and between core and GUI.
4
5 7 Greg Burri
h2. Core <-> Core
6 1 Greg Burri
7 22 Greg Burri
See source:protos/network_protocol.proto for message details.
8 21 Greg Burri
9 31 Greg Burri
h3. Downloading threads
10 29 Greg Burri
11 39 Greg Burri
There is _NbDownloadThread_ threads. Each thread will choose a free chunk and download it. A peer cannot have more than one connection per other peer. A peer which a download is active is set as not free.
12 23 Greg Burri
13
<pre>
14 27 Greg Burri
F : the list of all unfinished download
15
C : A list of chunk candidates (empty at start)
16
17 33 Greg Burri
- Take the first file in F -> f.
18
Loop :
19
   If the hash chunks of f are unknown :
20 37 Greg Burri
      If there is already a peer asking for hashes :
21
         - Take the next file in F -> f.
22
         - continue
23
      Else
24
         - Ask the hashes to the source (see the message 'GetHashes').
25 38 Greg Burri
   For each chunk not downloaded and not being downloaded -> c :
26 27 Greg Burri
      If c has a free peer :
27 37 Greg Burri
         - Add c to C
28 27 Greg Burri
   If C isn't empty :
29 30 Greg Burri
      - Take the best chunk in C based on peer.downloadRate.
30 1 Greg Burri
        If there is more than one best chunk then choose one randomly.
31
      - Grab the lock for the peer
32
      - Request the download   
33 33 Greg Burri
      - Take the first file in F -> f.
34 34 Greg Burri
   Else :
35 33 Greg Burri
      - Take the next file in F -> f.
36 23 Greg Burri
</pre>
37
38 36 Greg Burri
h3. Updating peer to hash association thread
39 23 Greg Burri
40 36 Greg Burri
This thread will periodically grab the _NumberOfChunkToUpdate_ first chunks and request to all other peers what chunk they have.
41 1 Greg Burri
42
If there is no chunk available the message will be send without hashes.
43 37 Greg Burri
44
<pre>
45
F : the list of all unfinished download
46
C : list of latest chunk hashes sent
47
48
Loop :
49
   Time.now -> t
50
   Empty C
51
   n : number of chunk = 0
52
   While take the next file in F -> f
53
      If C.count >= 'NumberOfChunkToUpdate' :
54
         - Break
55
      If we know the hashes for f :
56
         For all chunks of f -> c :
57
            - Add c to C
58
      Else :
59
         - Break
60
   - Copy C to C_latest
61
   - Send the list of the chunk to everyone. (The received responses will be compared against C)
62
   - Wait 'TimeBetweenChunksUpdate' - (Time.now - t)
63
         
64
</pre>
65 23 Greg Burri
66 8 Greg Burri
h3. Parameters
67
68 10 Greg Burri
Most parameters will be stored as constants in their component.
69
70 9 Greg Burri
|_.Name|_.Value |_.Unit|_.Explanation/Comments|
71 19 Greg Burri
| _IMAliveFrequency_ | 0.1 | [Hz] | The message _IMAlive_ is sent each 10s. |
72 14 Greg Burri
| _ChunkSize_ | 33554432 | [Byte] | (32 MB) |
73
| _LanSpeed_ | 52428800 | [Byte/s] | (50 MB/s) |
74 17 Greg Burri
| _TimeRecheckChunkFactor_ | 4 | - | If the time to download a chunk exceeds _TimeRecheckChunkFactor_ * _ChunkSize_ / _LanSpeed_ the peers are rescanned to choose a better one (better download rate). For example : 4 * 32 / 50 = 2.6 second |
75
| _SwitchToAnotherPeerFactor_ | 1.5 | - | During the recheck of the peers to choose a better one the other download rate must be above the current * 1.5. |
76
| _DownloadRateValidTime_ | 1500 / _LanSpeed_ = 300 s | [s] | (5 min). The download rate of a peer is only valid during this time after its last update. After that its rate is set to the maximum. | 
77 15 Greg Burri
| _TimeBetweenChunksUpdate_ | 500 / _LanSpeed_ = 10 s | [s] | Each 10 s a daemon will scan the _NumberOfChunkToUpdate_ first chunks from the first queued downloads to know which peer has which chunk. |
78 20 Greg Burri
| _NumberOfChunkToUpdate_ | 100 * _LanSpeed_ / _ChunkSize_ = 156 | - | The first 156 hash chunks (3 kB) will by send periodically to each peer. See message _HaveChunks_ in the proto file. |
79 19 Greg Burri
| _FindTimeout_ | 15 | [s] | A search request is abandoned after 15 seconds from the start of the request. See message _Find_. |
80 25 Greg Burri
| _GetHashesTimeout_ | 200 | [s] | Timeout for the message _GetHashes_. |
81 19 Greg Burri
| _GetChunkTimeout_ | 10 | [s] | Timeout for the message _GetChunk_. |
82
| _HaveChunksTimeout_ | _TimeBetweenChunksUpdate_ = 10 | [s] | Timeout for the message _HaveChunks_. |
83 1 Greg Burri
| _GetEntriesTimeout_ | 10 | [s] | Timeout for the message _GetEntries_. |
84 23 Greg Burri
| _NbDownloadThread_ | 3 | - | Number of concurrent downloading thread. |
85 35 Greg Burri
| _BufferSize_ | 1048576 | [Byte] | (1MB). This buffer is used when reading or writing a file. |
86 26 Greg Burri
| _TCPSocketBufferSize_ | 33554432 | [Byte] | (32Mo). Used when data are received. See _QAbstractSocket::setReadBufferSize_. |
87 8 Greg Burri
88 7 Greg Burri
h2. Core <-> GUI