Speed as in lower latency*and resiliency in a geographical sense.
* i.e. not higher bandwidth; we’re already good on that front
When a small enough geographical region (e.g. a country, through political intervention) gets isolated from the rest of the network, it will lose access to a lot of files simply because they will have blocks with none of the 4 mandatory copies* stored within the isolated area, and thus inaccessible.
* Is that still how it works?
I did a small experiment recently, where I randomly placed a million nodes across the world based on population density*, and then I connected them at random. If I remember correctly, the average latency between two nodes were 45ms, but that would probably double after adjusting for IP routing overhead and the lower lightspeed in fiber or copper.
* I used a 1/4 degree grid to select the general area, then added some noise with 1/2 degree sd.
What this means is that each SAFE routing hop will add about 0.2s to the roundtrip latency, so we’ll have to wait a full second even if we’re only 5 hops away from the vault that host the block we want. Well, the good thing is, we can request a bunch of stuff parallel, so the bandwidth will be quite high. Still, a one-second (on average! it can easily be 4x as much) pause feels long.
How could FEC help?
Let’s say we split up each block into 8 pieces (i.e. 125 KB each), then generate 8 more pieces in a way that any 8 of the 16 pieces are sufficient to restore the whole data. Now we can lose more than 2.67x the number of blocks (i.e. 8 vs 3) without losing the block, so it’s much more likely that an isolated area has access to enough to put it together.
What may not be obvious at first is that we can also lower the average distance between a client and the destination, we just have to pick those 8 blocks out of the 16 that are closest to one of our close nodes, and request them instead of just a random selection. (When some of them isn’t returned, we can start requesting the pieces farther away from us.)
Of course, the 8-of-16 setup is just an example. It could be 4 of 12 or 8 of 32, or any other combination.
- Lower latency, happier users.
- Data is transferred for fewer hops, so bandwidth is better utilized.
- Less storage is required for the same (or, actually, much higher) redundancy.
- If part of the network gets isolated, it would still have access to much more of the data.
- More requests are needed for the same amount of data. (But we may still end up with similar, or not much more, requests network-wise because of the lower number of hops. Just to avoid confusion, these requests are for 128 KB partial blocks, not the 1 MB full blocks.)