The following plots shows Rely compared to repetition coding (i.e. where we
simply repeat each packet n times).
In the following we’re using the following setup:
n=3 which means that the bandwidth
overhead is 66%.The residual packet loss measures the amount of packet loss that remains uncorrected.
{
"experiments": [
{
"channel": {
"latency": 0,
"loss": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25
]
},
"rely": {
"decoder": {
"max_stream_size": 400,
"packet_bytes": 100,
"timeout": 400
},
"encoder": {
"max_stream_size": 200,
"packet_bytes": 100,
"repair_interval": 1,
"repair_target": 2,
"timeout": 60
}
},
"repetition": {
"decoder": {},
"encoder": {
"repetitions": 2
}
},
"runs": 20,
"seed": 1629105346.2242274,
"sink": {
"payload_bytes": 100
},
"source": {
"burst": 1,
"packet_interval": 20,
"packets": 1000,
"payload_bytes": 100
}
}
],
"name": "rely_repetition",
"plot": {
"colors": {
"rely": "#ed4969",
"repetition": "#9900ff"
},
"legends": {
"rely": "Rely",
"repetition": "Repetition"
}
}
}
{
"experiments": [
{
"channel": {
"latency": 0,
"loss": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25
]
},
"rely": {
"decoder": {
"max_stream_size": 400,
"packet_bytes": 100,
"timeout": 400
},
"encoder": {
"max_stream_size": 200,
"packet_bytes": 100,
"repair_interval": 1,
"repair_target": 2,
"timeout": 60
}
},
"repetition": {
"decoder": {},
"encoder": {
"repetitions": 2
}
},
"runs": 20,
"seed": 1629105346.2242274,
"sink": {
"payload_bytes": 100
},
"source": {
"burst": 1,
"packet_interval": 20,
"packets": 1000,
"payload_bytes": 100
}
}
],
"name": "rely_repetition",
"plot": {
"colors": {
"rely": "#ed4969",
"repetition": "#9900ff"
},
"legends": {
"rely": "Rely",
"repetition": "Repetition"
}
}
}
{
"experiments": [
{
"channel": {
"latency": 0,
"loss": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25
]
},
"rely": {
"decoder": {
"max_stream_size": 400,
"packet_bytes": 100,
"timeout": 400
},
"encoder": {
"max_stream_size": 200,
"packet_bytes": 100,
"repair_interval": 1,
"repair_target": 2,
"timeout": 60
}
},
"repetition": {
"decoder": {},
"encoder": {
"repetitions": 2
}
},
"runs": 20,
"seed": 1629105346.2242274,
"sink": {
"payload_bytes": 100
},
"source": {
"burst": 1,
"packet_interval": 20,
"packets": 1000,
"payload_bytes": 100
}
}
],
"name": "rely_repetition",
"plot": {
"colors": {
"rely": "#ed4969",
"repetition": "#9900ff"
},
"legends": {
"rely": "Rely",
"repetition": "Repetition"
}
}
}
Given a specific packet loss rate we here show the amount of residual packet loss at different repair rates.
{
"experiments": [
{
"channel": {
"latency": 0,
"loss": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25
]
},
"rely": {
"decoder": {
"max_stream_size": 400,
"packet_bytes": 100,
"timeout": 400
},
"encoder": {
"max_stream_size": 200,
"packet_bytes": 100,
"repair_interval": 1,
"repair_target": 1,
"timeout": 60
}
},
"repetition": {
"decoder": {},
"encoder": {
"repetitions": 1
}
},
"runs": 20,
"seed": 1629105346.2241845,
"sink": {
"payload_bytes": 100
},
"source": {
"burst": 1,
"packet_interval": 20,
"packets": 1000,
"payload_bytes": 100
}
},
{
"channel": {
"latency": 0,
"loss": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25
]
},
"rely": {
"decoder": {
"max_stream_size": 400,
"packet_bytes": 100,
"timeout": 400
},
"encoder": {
"max_stream_size": 200,
"packet_bytes": 100,
"repair_interval": 1,
"repair_target": 2,
"timeout": 60
}
},
"repetition": {
"decoder": {},
"encoder": {
"repetitions": 2
}
},
"runs": 20,
"seed": 1629105346.2242274,
"sink": {
"payload_bytes": 100
},
"source": {
"burst": 1,
"packet_interval": 20,
"packets": 1000,
"payload_bytes": 100
}
},
{
"channel": {
"latency": 0,
"loss": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25
]
},
"rely": {
"decoder": {
"max_stream_size": 400,
"packet_bytes": 100,
"timeout": 400
},
"encoder": {
"max_stream_size": 200,
"packet_bytes": 100,
"repair_interval": 1,
"repair_target": 3,
"timeout": 60
}
},
"repetition": {
"decoder": {},
"encoder": {
"repetitions": 3
}
},
"runs": 20,
"seed": 1629105346.2242699,
"sink": {
"payload_bytes": 100
},
"source": {
"burst": 1,
"packet_interval": 20,
"packets": 1000,
"payload_bytes": 100
}
},
{
"channel": {
"latency": 0,
"loss": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25
]
},
"rely": {
"decoder": {
"max_stream_size": 400,
"packet_bytes": 100,
"timeout": 400
},
"encoder": {
"max_stream_size": 200,
"packet_bytes": 100,
"repair_interval": 1,
"repair_target": 4,
"timeout": 60
}
},
"repetition": {
"decoder": {},
"encoder": {
"repetitions": 4
}
},
"runs": 20,
"seed": 1629105346.22431,
"sink": {
"payload_bytes": 100
},
"source": {
"burst": 1,
"packet_interval": 20,
"packets": 1000,
"payload_bytes": 100
}
},
{
"channel": {
"latency": 0,
"loss": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25
]
},
"rely": {
"decoder": {
"max_stream_size": 400,
"packet_bytes": 100,
"timeout": 400
},
"encoder": {
"max_stream_size": 200,
"packet_bytes": 100,
"repair_interval": 1,
"repair_target": 5,
"timeout": 60
}
},
"repetition": {
"decoder": {},
"encoder": {
"repetitions": 5
}
},
"runs": 20,
"seed": 1629105346.2243505,
"sink": {
"payload_bytes": 100
},
"source": {
"burst": 1,
"packet_interval": 20,
"packets": 1000,
"payload_bytes": 100
}
}
],
"name": "rely_repetition",
"plot": {
"colors": {
"rely": "#ed4969",
"repetition": "#9900ff"
},
"legends": {
"rely": "Rely",
"repetition": "Repetition"
}
}
}
{
"experiments": [
{
"channel": {
"latency": 0,
"loss": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25
]
},
"rely": {
"decoder": {
"max_stream_size": 400,
"packet_bytes": 100,
"timeout": 400
},
"encoder": {
"max_stream_size": 200,
"packet_bytes": 100,
"repair_interval": 1,
"repair_target": 1,
"timeout": 60
}
},
"repetition": {
"decoder": {},
"encoder": {
"repetitions": 1
}
},
"runs": 20,
"seed": 1629105346.2241845,
"sink": {
"payload_bytes": 100
},
"source": {
"burst": 1,
"packet_interval": 20,
"packets": 1000,
"payload_bytes": 100
}
},
{
"channel": {
"latency": 0,
"loss": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25
]
},
"rely": {
"decoder": {
"max_stream_size": 400,
"packet_bytes": 100,
"timeout": 400
},
"encoder": {
"max_stream_size": 200,
"packet_bytes": 100,
"repair_interval": 1,
"repair_target": 2,
"timeout": 60
}
},
"repetition": {
"decoder": {},
"encoder": {
"repetitions": 2
}
},
"runs": 20,
"seed": 1629105346.2242274,
"sink": {
"payload_bytes": 100
},
"source": {
"burst": 1,
"packet_interval": 20,
"packets": 1000,
"payload_bytes": 100
}
},
{
"channel": {
"latency": 0,
"loss": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25
]
},
"rely": {
"decoder": {
"max_stream_size": 400,
"packet_bytes": 100,
"timeout": 400
},
"encoder": {
"max_stream_size": 200,
"packet_bytes": 100,
"repair_interval": 1,
"repair_target": 3,
"timeout": 60
}
},
"repetition": {
"decoder": {},
"encoder": {
"repetitions": 3
}
},
"runs": 20,
"seed": 1629105346.2242699,
"sink": {
"payload_bytes": 100
},
"source": {
"burst": 1,
"packet_interval": 20,
"packets": 1000,
"payload_bytes": 100
}
},
{
"channel": {
"latency": 0,
"loss": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25
]
},
"rely": {
"decoder": {
"max_stream_size": 400,
"packet_bytes": 100,
"timeout": 400
},
"encoder": {
"max_stream_size": 200,
"packet_bytes": 100,
"repair_interval": 1,
"repair_target": 4,
"timeout": 60
}
},
"repetition": {
"decoder": {},
"encoder": {
"repetitions": 4
}
},
"runs": 20,
"seed": 1629105346.22431,
"sink": {
"payload_bytes": 100
},
"source": {
"burst": 1,
"packet_interval": 20,
"packets": 1000,
"payload_bytes": 100
}
},
{
"channel": {
"latency": 0,
"loss": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25
]
},
"rely": {
"decoder": {
"max_stream_size": 400,
"packet_bytes": 100,
"timeout": 400
},
"encoder": {
"max_stream_size": 200,
"packet_bytes": 100,
"repair_interval": 1,
"repair_target": 5,
"timeout": 60
}
},
"repetition": {
"decoder": {},
"encoder": {
"repetitions": 5
}
},
"runs": 20,
"seed": 1629105346.2243505,
"sink": {
"payload_bytes": 100
},
"source": {
"burst": 1,
"packet_interval": 20,
"packets": 1000,
"payload_bytes": 100
}
}
],
"name": "rely_repetition",
"plot": {
"colors": {
"rely": "#ed4969",
"repetition": "#9900ff"
},
"legends": {
"rely": "Rely",
"repetition": "Repetition"
}
}
}
In the above:
repertition packets for every input packetrepair_target packets for every input packet.The repair rate is give in the table below:
repetitions /
repair_target |
1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| repair rate | 50% | 66% | 75% | 80% | 83% |
{
"experiments": [
{
"channel": {
"latency": 0,
"loss": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25
]
},
"rely": {
"decoder": {
"max_stream_size": 400,
"packet_bytes": 100,
"timeout": 400
},
"encoder": {
"max_stream_size": 200,
"packet_bytes": 100,
"repair_interval": 1,
"repair_target": 1,
"timeout": 60
}
},
"repetition": {
"decoder": {},
"encoder": {
"repetitions": 1
}
},
"runs": 20,
"seed": 1629105346.2241845,
"sink": {
"payload_bytes": 100
},
"source": {
"burst": 1,
"packet_interval": 20,
"packets": 1000,
"payload_bytes": 100
}
},
{
"channel": {
"latency": 0,
"loss": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25
]
},
"rely": {
"decoder": {
"max_stream_size": 400,
"packet_bytes": 100,
"timeout": 400
},
"encoder": {
"max_stream_size": 200,
"packet_bytes": 100,
"repair_interval": 1,
"repair_target": 2,
"timeout": 60
}
},
"repetition": {
"decoder": {},
"encoder": {
"repetitions": 2
}
},
"runs": 20,
"seed": 1629105346.2242274,
"sink": {
"payload_bytes": 100
},
"source": {
"burst": 1,
"packet_interval": 20,
"packets": 1000,
"payload_bytes": 100
}
},
{
"channel": {
"latency": 0,
"loss": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25
]
},
"rely": {
"decoder": {
"max_stream_size": 400,
"packet_bytes": 100,
"timeout": 400
},
"encoder": {
"max_stream_size": 200,
"packet_bytes": 100,
"repair_interval": 1,
"repair_target": 3,
"timeout": 60
}
},
"repetition": {
"decoder": {},
"encoder": {
"repetitions": 3
}
},
"runs": 20,
"seed": 1629105346.2242699,
"sink": {
"payload_bytes": 100
},
"source": {
"burst": 1,
"packet_interval": 20,
"packets": 1000,
"payload_bytes": 100
}
},
{
"channel": {
"latency": 0,
"loss": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25
]
},
"rely": {
"decoder": {
"max_stream_size": 400,
"packet_bytes": 100,
"timeout": 400
},
"encoder": {
"max_stream_size": 200,
"packet_bytes": 100,
"repair_interval": 1,
"repair_target": 4,
"timeout": 60
}
},
"repetition": {
"decoder": {},
"encoder": {
"repetitions": 4
}
},
"runs": 20,
"seed": 1629105346.22431,
"sink": {
"payload_bytes": 100
},
"source": {
"burst": 1,
"packet_interval": 20,
"packets": 1000,
"payload_bytes": 100
}
},
{
"channel": {
"latency": 0,
"loss": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25
]
},
"rely": {
"decoder": {
"max_stream_size": 400,
"packet_bytes": 100,
"timeout": 400
},
"encoder": {
"max_stream_size": 200,
"packet_bytes": 100,
"repair_interval": 1,
"repair_target": 5,
"timeout": 60
}
},
"repetition": {
"decoder": {},
"encoder": {
"repetitions": 5
}
},
"runs": 20,
"seed": 1629105346.2243505,
"sink": {
"payload_bytes": 100
},
"source": {
"burst": 1,
"packet_interval": 20,
"packets": 1000,
"payload_bytes": 100
}
}
],
"name": "rely_repetition",
"plot": {
"colors": {
"rely": "#ed4969",
"repetition": "#9900ff"
},
"legends": {
"rely": "Rely",
"repetition": "Repetition"
}
}
}
The reason why the plot with fewer packets seem better is because the probability of eventually experiencing packet loss increases with the number of packets.