-
Notifications
You must be signed in to change notification settings - Fork 12
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Investigate adding FEC #22
Comments
Currently the two widely used tunnel are both based on packet redundancy and busrting. |
Few thoughts: I think we would need packet numbers, just as we hacked into header encryption. First, to keep packets in order (for proper check-summing as well as detecting loss or other issues). Second, to get a basis for metrics. We could try to limit it to a reasonable number (we would need to anyway because buffer space might be limited) and to hack it somehow into existing protocol fields (no idea yet) to maintain compatibility. Do we have a nibble available in flags? Then, an additional packet type "CHECK" might be required to be sent after every other n packets (with n being dynamically determined according to check results). It would include the checksum/convolution data and perhaps some control information (like "new n" or "my n and your n" or such). To keep things easy in the beginning, we should only include data PACKET type? |
Does this approach add latency between packets? Since latency is critical in some applications like VoIP,might need to keep it as low as possible(or as a configurable option?). |
Depends... not necessarily though. If you only use it to detect packet loss, it will not add any delay. And if you use it to make up for packet loss, you will get delay because we will have to wait a bit to determine if a packet loss occurred (to take action) or not. That requires also time measurements at sender (to make sure to send out checksum packet at stream's end even if not a multiple of n) as well as at receiving end. So, implementation could go in steps. First just a detection step (to inform user about possible packet loss) before going into correction. How about using upper nibble of TTL ( |
For reference. |
FEC (Forward Error Correction) is a way to increase reliability when some data is lost.
If n3n users are experiencing packet loss, the addition of FEC could assist with that. However, FEC is not a simple cure-all - it has a cost of increased complexity and increased packet sizes (or increased number of packets - or probably both) and increased memory use (for caching the all the packets in a bundle before reassembly) and increased latency (often, a FEC algo cannot return the original packets until all the packets in the bundle have arrived). All this has meant that in most expected internet protocol situations, a simple packet retransmit is more reliable than the total overhead of adding FEC.
Since the internet is intended to be a low-loss system, before adding something like FEC, we should investigate what is causing these packet losses, and how to flexibly handle that.
For instance, the FEC convolution algorithm used is tuned to the expected percentage data loss - so either a flexible suite of algos is needed, or an acceptable failure rate determined.
The text was updated successfully, but these errors were encountered: