diff options
Diffstat (limited to 'doc/rfc/rfc8681.txt')
-rw-r--r-- | doc/rfc/rfc8681.txt | 1831 |
1 files changed, 1831 insertions, 0 deletions
diff --git a/doc/rfc/rfc8681.txt b/doc/rfc/rfc8681.txt new file mode 100644 index 0000000..5f8bc02 --- /dev/null +++ b/doc/rfc/rfc8681.txt @@ -0,0 +1,1831 @@ + + + + +Internet Engineering Task Force (IETF) V. Roca +Request for Comments: 8681 B. Teibi +Category: Standards Track INRIA +ISSN: 2070-1721 January 2020 + + +Sliding Window Random Linear Code (RLC) Forward Erasure Correction (FEC) + Schemes for FECFRAME + +Abstract + + This document describes two fully specified Forward Erasure + Correction (FEC) Schemes for Sliding Window Random Linear Codes + (RLC), one for RLC over the Galois Field (a.k.a., Finite Field) + GF(2), a second one for RLC over the Galois Field GF(2^(8)), each + time with the possibility of controlling the code density. They can + protect arbitrary media streams along the lines defined by FECFRAME + extended to Sliding Window FEC Codes. These Sliding Window FEC Codes + rely on an encoding window that slides over the source symbols, + generating new repair symbols whenever needed. Compared to block FEC + codes, these Sliding Window FEC Codes offer key advantages with real- + time flows in terms of reduced FEC-related latency while often + providing improved packet erasure recovery capabilities. + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 7841. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + https://www.rfc-editor.org/info/rfc8681. + +Copyright Notice + + Copyright (c) 2020 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (https://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Simplified BSD License text as described in Section 4.e of + the Trust Legal Provisions and are provided without warranty as + described in the Simplified BSD License. + +Table of Contents + + 1. Introduction + 1.1. Limits of Block Codes with Real-Time Flows + 1.2. Lower Latency and Better Protection of Real-Time Flows with + the Sliding Window RLC Codes + 1.3. Small Transmission Overheads with the Sliding Window RLC + FEC Scheme + 1.4. Document Organization + 2. Definitions and Abbreviations + 3. Common Procedures + 3.1. Codec Parameters + 3.2. ADU, ADUI, and Source Symbols Mappings + 3.3. Encoding Window Management + 3.4. Source Symbol Identification + 3.5. Pseudorandom Number Generator (PRNG) + 3.6. Coding Coefficients Generation Function + 3.7. Finite Field Operations + 3.7.1. Finite Field Definitions + 3.7.2. Linear Combination of Source Symbol Computation + 4. Sliding Window RLC FEC Scheme over GF(2^(8)) for Arbitrary + Packet Flows + 4.1. Formats and Codes + 4.1.1. FEC Framework Configuration Information + 4.1.2. Explicit Source FEC Payload ID + 4.1.3. Repair FEC Payload ID + 4.2. Procedures + 5. Sliding Window RLC FEC Scheme over GF(2) for Arbitrary Packet + Flows + 5.1. Formats and Codes + 5.1.1. FEC Framework Configuration Information + 5.1.2. Explicit Source FEC Payload ID + 5.1.3. Repair FEC Payload ID + 5.2. Procedures + 6. FEC Code Specification + 6.1. Encoding Side + 6.2. Decoding Side + 7. Security Considerations + 7.1. Attacks Against the Data Flow + 7.1.1. Access to Confidential Content + 7.1.2. Content Corruption + 7.2. Attacks Against the FEC Parameters + 7.3. When Several Source Flows are to be Protected Together + 7.4. Baseline Secure FEC Framework Operation + 7.5. Additional Security Considerations for Numerical + Computations + 8. Operations and Management Considerations + 8.1. Operational Recommendations: Finite Field GF(2) Versus + GF(2^(8)) + 8.2. Operational Recommendations: Coding Coefficients Density + Threshold + 9. IANA Considerations + 10. References + 10.1. Normative References + 10.2. Informative References + Appendix A. TinyMT32 Validation Criteria (Normative) + Appendix B. Assessing the PRNG Adequacy (Informational) + Appendix C. Possible Parameter Derivation (Informational) + C.1. Case of a CBR Real-Time Flow + C.2. Other Types of Real-Time Flow + C.3. Case of a Non-Real-Time Flow + Appendix D. Decoding Beyond Maximum Latency Optimization + (Informational) + Acknowledgments + Authors' Addresses + +1. Introduction + + Application-Level Forward Erasure Correction (AL-FEC) codes, or + simply FEC codes, are a key element of communication systems. They + are used to recover from packet losses (or erasures) during content + delivery sessions to a potentially large number of receivers + (multicast/broadcast transmissions). This is the case with the File + Delivery over Unidirectional Transport (FLUTE)/Asynchronous Layered + Coding (ALC) protocol [RFC6726] when used for reliable file transfers + over lossy networks, and the FECFRAME protocol [RFC6363] when used + for reliable continuous media transfers over lossy networks. + + The present document only focuses on the FECFRAME protocol, which is + used in multicast/broadcast delivery mode, particularly for content + that features stringent real-time constraints: each source packet has + a maximum validity period after which it will not be considered by + the destination application. + +1.1. Limits of Block Codes with Real-Time Flows + + With FECFRAME, there is a single FEC encoding point (either an end + host/server (source) or a middlebox) and a single FEC decoding point + per receiver (either an end host (receiver) or middlebox). In this + context, currently standardized AL-FEC codes for FECFRAME like Reed- + Solomon [RFC6865], LDPC-Staircase [RFC6816], or Raptor/RaptorQ + [RFC6681], are all linear block codes: they require the data flow to + be segmented into blocks of a predefined maximum size. + + To define this block size, it is required to find an appropriate + balance between robustness and decoding latency: the larger the block + size, the higher the robustness (e.g., in case of long packet erasure + bursts), but also the higher the maximum decoding latency (i.e., the + maximum time required to recover a lost (erased) packet thanks to FEC + protection). Therefore, with a multicast/broadcast session where + different receivers experience different packet loss rates, the block + size should be chosen by considering the worst communication + conditions one wants to support, but without exceeding the desired + maximum decoding latency. This choice then impacts the FEC-related + latency of all receivers, even those experiencing a good + communication quality, since no FEC encoding can happen until all the + source data of the block is available at the sender, which directly + depends on the block size. + +1.2. Lower Latency and Better Protection of Real-Time Flows with the + Sliding Window RLC Codes + + This document introduces two fully specified FEC schemes that do not + follow the block code approach: the Sliding Window Random Linear + Codes (RLC) over either Galois Fields (a.k.a., Finite Fields) GF(2) + (the "binary case") or GF(2^(8)), each time with the possibility of + controlling the code density. These FEC schemes are used to protect + arbitrary media streams along the lines defined by FECFRAME extended + to Sliding Window FEC Codes [RFC8680]. These FEC schemes and, more + generally, Sliding Window FEC Codes are recommended, for instance, + with media that feature real-time constraints sent within a + multicast/broadcast session [Roca17]. + + The RLC codes belong to the broad class of Sliding Window AL-FEC + Codes (a.k.a., convolutional codes) [RFC8406]. The encoding process + is based on an encoding window that slides over the set of source + packets (in fact source symbols as we will see in Section 3.2), this + window being either of fixed size or variable size (a.k.a., an + elastic window). Repair symbols are generated on-the-fly, by + computing a random linear combination of the source symbols present + in the current encoding window, and passed to the transport layer. + + At the receiver, a linear system is managed from the set of received + source and repair packets. New variables (representing source + symbols) and equations (representing the linear combination carried + by each repair symbol received) are added upon receiving new packets. + Variables and the equations they are involved in are removed when + they are too old with respect to their validity period (real-time + constraints). Lost source symbols are then recovered thanks to this + linear system whenever its rank permits to solve it (at least + partially). + + The protection of any multicast/broadcast session needs to be + dimensioned by considering the worst communication conditions one + wants to support. This is also true with RLC (more generally, any + sliding window) code. However, the receivers experiencing a good to + medium communication quality will observe a reduced FEC-related + latency compared to block codes [Roca17] since an isolated lost + source packet is quickly recovered with the following repair packet. + On the opposite, with a block code, recovering an isolated lost + source packet always requires waiting for the first repair packet to + arrive after the end of the block. Additionally, under certain + situations (e.g., with a limited FEC-related latency budget and with + constant bitrate transmissions after FECFRAME encoding), Sliding + Window Codes can more efficiently achieve a target transmission + quality (e.g., measured by the residual loss after FEC decoding) by + sending fewer repair packets (i.e., higher code rate) than block + codes. + +1.3. Small Transmission Overheads with the Sliding Window RLC FEC + Scheme + + The Sliding Window RLC FEC scheme is designed to limit the packet + header overhead. The main requirement is that each repair packet + header must enable a receiver to reconstruct the set of source + symbols plus the associated coefficients used during the encoding + process. In order to minimize packet overhead, the set of source + symbols in the encoding window as well as the set of coefficients + over GF(2^(m)) (where m is 1 or 8, depending on the FEC scheme) used + in the linear combination are not individually listed in the repair + packet header. Instead, each FEC Repair Packet header contains: + + * the Encoding Symbol Identifier (ESI) of the first source symbol in + the encoding window as well as the number of symbols (since this + number may vary with a variable size, elastic window). These two + pieces of information enable each receiver to reconstruct the set + of source symbols considered during encoding, the only constraint + being that there cannot be any gap; + + * the seed and density threshold parameters used by a coding + coefficients generation function (Section 3.6). These two pieces + of information enable each receiver to generate the same set of + coding coefficients over GF(2^(m)) as the sender; + + Therefore, no matter the number of source symbols present in the + encoding window, each FEC Repair Packet features a fixed 64-bit long + header, called Repair FEC Payload ID (Figure 8). Similarly, each FEC + Source Packet features a fixed 32-bit long trailer, called Explicit + Source FEC Payload ID (Figure 6), that contains the ESI of the first + source symbol (Section 3.2). + +1.4. Document Organization + + This fully-specified FEC scheme follows the structure required by + [RFC6363], Section 5.6 ("FEC Scheme Requirements"), namely: + + 3. Procedures: This section describes procedures specific to this + FEC scheme, namely: RLC parameters derivation, ADUI and source + symbols mapping, pseudorandom number generator, and coding + coefficients generation function; + + 4. Formats and Codes: This section defines the Source FEC Payload ID + and Repair FEC Payload ID formats, carrying the signaling + information associated to each source or repair symbol. It also + defines the FEC Framework Configuration Information (FFCI) + carrying signaling information for the session; + + 5. FEC Code Specification: Finally this section provides the code + specification. + +2. Definitions and Abbreviations + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in BCP + 14 [RFC2119] [RFC8174] when, and only when, they appear in all + capitals, as shown here. + + This document uses the following definitions and abbreviations: + + a^(b) a to the power of b + + GF(q) denotes a finite field (also known as the Galois Field) with q + elements. We assume that q = 2^(m) in this document + + m defines the length of the elements in the finite field, in bits. + In this document, m is equal to 1 or 8 + + ADU: Application Data Unit + + ADUI: Application Data Unit Information (includes the F, L and + padding fields in addition to the ADU) + + E: size of an encoding symbol (i.e., source or repair symbol), + assumed fixed (in bytes) + + br_in: transmission bitrate at the input of the FECFRAME sender, + assumed fixed (in bits/s) + + br_out: transmission bitrate at the output of the FECFRAME sender, + assumed fixed (in bits/s) + + max_lat: maximum FEC-related latency within FECFRAME (a decimal + number expressed in seconds) + + cr: RLC coding rate, ratio between the total number of source + symbols and the total number of source plus repair symbols + + ew_size: encoding window current size at a sender (in symbols) + + ew_max_size: encoding window maximum size at a sender (in symbols) + + dw_max_size: decoding window maximum size at a receiver (in symbols) + + ls_max_size: linear system maximum size (or width) at a receiver (in + symbols) + + WSR: window size ratio parameter used to derive ew_max_size + (encoder) and ls_max_size (decoder). + + PRNG: pseudorandom number generator + + TinyMT32: PRNG used in this specification. + + DT: coding coefficients density threshold, an integer between 0 and + 15 (inclusive) the controls the fraction of coefficients that are + nonzero + +3. Common Procedures + + This section introduces the procedures that are used by these FEC + schemes. + +3.1. Codec Parameters + + A codec implementing the Sliding Window RLC FEC scheme relies on + several parameters: + + Maximum FEC-related latency budget, max_lat (a decimal number + expressed in seconds) with real-time flows: + a source ADU flow can have real-time constraints, and therefore + any FECFRAME related operation should take place within the + validity period of each ADU (Appendix D describes an exception to + this rule). When there are multiple flows with different real- + time constraints, we consider the most stringent constraints (see + item 6 in Section 10.2 of [RFC6363], for recommendations when + several flows are globally protected). The maximum FEC-related + latency budget, max_lat, accounts for all sources of latency added + by FEC encoding (at a sender) and FEC decoding (at a receiver). + Other sources of latency (e.g., added by network communications) + are out of scope and must be considered separately (said + differently, they have already been deducted from max_lat). + max_lat can be regarded as the latency budget permitted for all + FEC-related operations. This is an input parameter that enables a + FECFRAME sender to derive other internal parameters (see + Appendix C); + + Encoding window current (resp. maximum) size, ew_size (resp. + ew_max_size) (in symbols): + at a FECFRAME sender, during FEC encoding, a repair symbol is + computed as a linear combination of the ew_size source symbols + present in the encoding window. The ew_max_size is the maximum + size of this window, while ew_size is the current size. For + example, in the common case at session start, upon receiving new + source ADUs, the ew_size progressively increases until it reaches + its maximum value, ew_max_size. We have: + + 0 < ew_size <= ew_max_size + + Decoding window maximum size, dw_max_size (in symbols): + at a FECFRAME receiver, dw_max_size is the maximum number of + received or lost source symbols that are still within their + latency budget; + + Linear system maximum size, ls_max_size (in symbols): + at a FECFRAME receiver, the linear system maximum size, + ls_max_size, is the maximum number of received or lost source + symbols in the linear system (i.e., the variables). It SHOULD NOT + be smaller than dw_max_size since it would mean that, even after + receiving a sufficient number of FEC Repair Packets, a lost ADU + may not be recovered just because the associated source symbols + have been prematurely removed from the linear system, which is + usually counter-productive. On the opposite, the linear system + MAY grow beyond the dw_max_size (Appendix D); + + Symbol size, E (in bytes): + the E parameter determines the source and repair symbol sizes + (necessarily equal). This is an input parameter that enables a + FECFRAME sender to derive other internal parameters, as explained + below. An implementation at a sender MUST fix the E parameter and + MUST communicate it as part of the FEC Scheme-Specific Information + (Section 4.1.1.2). + + Code rate, cr: + The code rate parameter determines the amount of redundancy added + to the flow. More precisely the cr is the ratio between the total + number of source symbols and the total number of source plus + repair symbols and by definition: 0 < cr <= 1. This is an input + parameter that enables a FECFRAME sender to derive other internal + parameters, as explained below. However, there is no need to + communicate the cr parameter per see (it's not required to process + a repair symbol at a receiver). This code rate parameter can be + static. However, in specific use-cases (e.g., with unicast + transmissions in presence of a feedback mechanism that estimates + the communication quality, out of scope of FECFRAME), the code + rate may be adjusted dynamically. + + Appendix C proposes non-normative techniques to derive those + parameters, depending on the use-case specificities. + +3.2. ADU, ADUI, and Source Symbols Mappings + + At a sender, an ADU coming from the application is not directly + mapped to source symbols. When multiple source flows (e.g., media + streams) are mapped onto the same FECFRAME instance, each flow is + assigned its own Flow ID value (see below). This Flow ID is then + prepended to each ADU before FEC encoding. This way, FEC decoding at + a receiver also recovers this Flow ID and the recovered ADU can be + assigned to the right source flow (note that the 5-tuple used to + identify the right source flow of a received ADU is absent with a + recovered ADU since it is not FEC protected). + + Additionally, since ADUs are of variable size, padding is needed so + that each ADU (with its flow identifier) contribute to an integral + number of source symbols. This requires adding the original ADU + length to each ADU before doing FEC encoding. Because of these + requirements, an intermediate format, the ADUI, or ADU Information, + is considered [RFC6363]. + + For each incoming ADU, an ADUI MUST be created as follows. First of + all, 3 bytes are prepended (Figure 1): + + Flow ID (F) (8-bit field): this unsigned byte contains the integer + identifier associated to the source ADU flow to which this ADU + belongs. It is assumed that a single byte is sufficient, which + implies that no more than 256 flows will be protected by a single + FECFRAME session instance. + + Length (L) (16-bit field): this unsigned integer contains the length + of this ADU, in network byte order (i.e., big endian). This + length is for the ADU itself and does not include the F, L, or Pad + fields. + + Then, zero padding is added to the ADU if needed: + + Padding (Pad) (variable size field): this field contains zero + padding to align the F, L, ADU and padding up to a size that is + multiple of E bytes (i.e., the source and repair symbol length). + + The data unit resulting from the ADU and the F, L, and Pad fields is + called ADUI. Since ADUs can have different sizes, this is also the + case for ADUIs. However, an ADUI always contributes to an integral + number of source symbols. + + symbol length, E E E + < ------------------ >< ------------------ >< ------------------ > + +-+--+---------------------------------------------+-------------+ + |F| L| ADU | Pad | + +-+--+---------------------------------------------+-------------+ + + Figure 1: ADUI Creation Example, Resulting in Three Source Symbols + + Note that neither the initial 3 bytes nor the optional padding are + sent over the network. However, they are considered during FEC + encoding, and a receiver that lost a certain FEC Source Packet (e.g., + the UDP datagram containing this FEC Source Packet when UDP is used + as the transport protocol) will be able to recover the ADUI if FEC + decoding succeeds. Thanks to the initial 3 bytes, this receiver will + get rid of the padding (if any) and identify the corresponding ADU + flow. + +3.3. Encoding Window Management + + Source symbols and the corresponding ADUs are removed from the + encoding window: + + * when the sliding encoding window has reached its maximum size, + ew_max_size. In that case the oldest symbol MUST be removed + before adding a new symbol, so that the current encoding window + size always remains inferior or equal to the maximum size: ew_size + <= ew_max_size; + + * when an ADU has reached its maximum validity duration in case of a + real-time flow. When this happens, all source symbols + corresponding to the ADUI that expired SHOULD be removed from the + encoding window; + + Source symbols are added to the sliding encoding window each time a + new ADU arrives, once the ADU-to-source symbols mapping has been + performed (Section 3.2). The current size of the encoding window, + ew_size, is updated after adding new source symbols. This process + may require to remove old source symbols so that: ew_size <= + ew_max_size. + + Note that a FEC codec may feature practical limits in the number of + source symbols in the encoding window (e.g., for computational + complexity reasons). This factor may further limit the ew_max_size + value, in addition to the maximum FEC-related latency budget + (Section 3.1). + +3.4. Source Symbol Identification + + Each source symbol is identified by an Encoding Symbol ID (ESI), an + unsigned integer. The ESI of source symbols MUST start with value 0 + for the first source symbol and MUST be managed sequentially. + Wrapping to zero happens after reaching the maximum value made + possible by the ESI field size (this maximum value is FEC scheme + dependent, for instance, 2^(32)-1 with FEC schemes 9 and 10). + + No such consideration applies to repair symbols. + +3.5. Pseudorandom Number Generator (PRNG) + + In order to compute coding coefficients (see Section 3.6), the RLC + FEC schemes rely on the TinyMT32 PRNG defined in [RFC8682] with two + additional functions defined in this section. + + This PRNG MUST first be initialized with a 32-bit unsigned integer, + used as a seed, with: + + void tinymt32_init (tinymt32_t * s, uint32_t seed); + + With the FEC schemes defined in this document, the seed is in + practice restricted to a value between 0 and 0xFFFF inclusive (note + that this PRNG accepts a seed value equal to 0), since this is the + Repair_Key 16-bit field value of the Repair FEC Payload ID + (Section 4.1.3). In practice, how to manage the seed and Repair_Key + values (both are equal) is left to the implementer, using a + monotonically increasing counter being one possibility (Section 6.1). + In addition to the seed, this function takes as parameter a pointer + to an instance of a tinymt32_t structure that is used to keep the + internal state of the PRNG. + + Then, each time a new pseudorandom integer between 0 and 15 inclusive + (4-bit pseudorandom integer) is needed, the following function is + used: + + uint32_t tinymt32_rand16 (tinymt32_t * s); + + This function takes as parameter a pointer to the same tinymt32_t + structure (that is left unchanged between successive calls to the + function). + + Similarly, each time a new pseudorandom integer between 0 and 255 + inclusive (8-bit pseudorandom integer) is needed, the following + function is used: + + uint32_t tinymt32_rand256 (tinymt32_t * s); + + These two functions keep respectively the 4 or 8 less significant + bits of the 32-bit pseudorandom number generated by the + tinymt32_generate_uint32() function of [RFC8682]. This is done by + computing the result of a binary AND between the + tinymt32_generate_uint32() output and respectively the 0xF or 0xFF + constants, using 32-bit unsigned integer operations. Figure 2 shows + a possible implementation. This is a C language implementation, + written for C99 [C99]. Test results discussed in Appendix B show + that this simple technique, applied to this PRNG, is in line with the + RLC FEC schemes needs. + + <CODE BEGINS> + /** + * This function outputs a pseudorandom integer in [0 .. 15] range. + * + * @param s pointer to tinymt internal state. + * @return unsigned integer between 0 and 15 inclusive. + */ + uint32_t tinymt32_rand16(tinymt32_t *s) + { + return (tinymt32_generate_uint32(s) & 0xF); + } + + /** + * This function outputs a pseudorandom integer in [0 .. 255] range. + * + * @param s pointer to tinymt internal state. + * @return unsigned integer between 0 and 255 inclusive. + */ + uint32_t tinymt32_rand256(tinymt32_t *s) + { + return (tinymt32_generate_uint32(s) & 0xFF); + } + <CODE ENDS> + + Figure 2: 4-bit and 8-bit Mapping Functions for TinyMT32 + + Any implementation of this PRNG MUST have the same output as that + provided by the reference implementation of [RFC8682]. In order to + increase the compliance confidence, three criteria are proposed: the + one described in [RFC8682] (for the TinyMT32 32-bit unsigned integer + generator), and the two others detailed in Appendix A (for the + mapping to 4-bit and 8-bit intervals). Because of the way the + mapping functions work, it is unlikely that an implementation that + fulfills the first criterion fails to fulfill the two others. + +3.6. Coding Coefficients Generation Function + + The coding coefficients used during the encoding process are + generated at the RLC encoder by the generate_coding_coefficients() + function each time a new repair symbol needs to be produced. The + fraction of coefficients that are nonzero (i.e., the density) is + controlled by the DT (Density Threshold) parameter. DT has values + between 0 (the minimum value) and 15 (the maximum value), and the + average probability of having a nonzero coefficient equals (DT + 1) / + 16. In particular, when DT equals 15 the function guaranties that + all coefficients are nonzero (i.e., maximum density). + + These considerations apply to both the RLC over GF(2) and RLC over + GF(2^(8)), the only difference being the value of the m parameter. + With the RLC over GF(2) FEC scheme (Section 5), m is equal to 1. + With RLC over GF(2^(8)) FEC scheme (Section 4), m is equal to 8. + + Figure 3 shows the reference generate_coding_coefficients() + implementation. This is a C language implementation, written for C99 + [C99]. + + <CODE BEGINS> + #include <string.h> + + /* + * Fills in the table of coding coefficients (of the right size) + * provided with the appropriate number of coding coefficients to + * use for the repair symbol key provided. + * + * (in) repair_key key associated to this repair symbol. This + * parameter is ignored (useless) if m=1 and dt=15 + * (in/out) cc_tab pointer to a table of the right size to store + * coding coefficients. All coefficients are + * stored as bytes, regardless of the m parameter, + * upon return of this function. + * (in) cc_nb number of entries in the cc_tab table. This + * value is equal to the current encoding window + * size. + * (in) dt integer between 0 and 15 (inclusive) that + * controls the density. With value 15, all + * coefficients are guaranteed to be nonzero + * (i.e., equal to 1 with GF(2) and equal to a + * value in {1,... 255} with GF(2^^8)), otherwise + * a fraction of them will be 0. + * (in) m Finite Field GF(2^^m) parameter. In this + * document only values 1 and 8 are considered. + * (out) returns 0 in case of success, an error code + * different than 0 otherwise. + */ + int generate_coding_coefficients (uint16_t repair_key, + uint8_t* cc_tab, + uint16_t cc_nb, + uint8_t dt, + uint8_t m) + { + uint32_t i; + tinymt32_t s; /* PRNG internal state */ + + if (dt > 15) { + return -1; /* error, bad dt parameter */ + } + switch (m) { + case 1: + if (dt == 15) { + /* all coefficients are 1 */ + memset(cc_tab, 1, cc_nb); + } else { + /* here coefficients are either 0 or 1 */ + tinymt32_init(&s, repair_key); + for (i = 0 ; i < cc_nb ; i++) { + cc_tab[i] = (tinymt32_rand16(&s) <= dt) ? 1 : 0; + } + } + break; + + case 8: + tinymt32_init(&s, repair_key); + if (dt == 15) { + /* coefficient 0 is avoided here in order to include + * all the source symbols */ + for (i = 0 ; i < cc_nb ; i++) { + do { + cc_tab[i] = (uint8_t) tinymt32_rand256(&s); + } while (cc_tab[i] == 0); + } + } else { + /* here a certain number of coefficients should be 0 */ + for (i = 0 ; i < cc_nb ; i++) { + if (tinymt32_rand16(&s) <= dt) { + do { + cc_tab[i] = (uint8_t) tinymt32_rand256(&s); + } while (cc_tab[i] == 0); + } else { + cc_tab[i] = 0; + } + } + } + break; + + default: + return -2; /* error, bad parameter m */ + } + return 0; /* success */ + } + <CODE ENDS> + + Figure 3: Reference Implementation of the Coding Coefficients + Generation Function + +3.7. Finite Field Operations + +3.7.1. Finite Field Definitions + + The two RLC FEC schemes specified in this document reuse the Finite + Fields defined in [RFC5510], Section 8.1. More specifically, the + elements of the field GF(2^(m)) are represented by polynomials with + binary coefficients (i.e., over GF(2)) and degree lower or equal to + m-1. The addition between two elements is defined as the addition of + binary polynomials in GF(2), which is equivalent to a bitwise XOR + operation on the binary representation of these elements. + + With GF(2^(8)), multiplication between two elements is the + multiplication modulo a given irreducible polynomial of degree 8. + The following irreducible polynomial is used for GF(2^(8)): + + x^(8) + x^(4) + x^(3) + x^(2) + 1 + + With GF(2), multiplication corresponds to a logical AND operation. + +3.7.2. Linear Combination of Source Symbol Computation + + The two RLC FEC schemes require the computation of a linear + combination of source symbols, using the coding coefficients produced + by the generate_coding_coefficients() function and stored in the + cc_tab[] array. + + With the RLC over GF(2^(8)) FEC scheme, a linear combination of the + ew_size source symbol present in the encoding window, say src_0 to + src_ew_size_1, in order to generate a repair symbol, is computed as + follows. For each byte of position i in each source and the repair + symbol, where i belongs to [0; E-1], compute: + + repair[i] = cc_tab[0] * src_0[i] XOR cc_tab[1] * src_1[i] XOR ... + XOR cc_tab[ew_size - 1] * src_ew_size_1[i] + + where * is the multiplication over GF(2^(8)). In practice various + optimizations need to be used in order to make this computation + efficient (see in particular [PGM13]). + + With the RLC over GF(2) FEC scheme (binary case), a linear + combination is computed as follows. The repair symbol is the XOR sum + of all the source symbols corresponding to a coding coefficient + cc_tab[j] equal to 1 (i.e., the source symbols corresponding to zero + coding coefficients are ignored). The XOR sum of the byte of + position i in each source is computed and stored in the corresponding + byte of the repair symbol, where i belongs to [0; E-1]. In practice, + the XOR sums will be computed several bytes at a time (e.g., on 64 + bit words, or on arrays of 16 or more bytes when using SIMD CPU + extensions). + + With both FEC schemes, the details of how to optimize the computation + of these linear combinations are of high practical importance but out + of scope of this document. + +4. Sliding Window RLC FEC Scheme over GF(2^(8)) for Arbitrary Packet + Flows + + This fully-specified FEC scheme defines the Sliding Window Random + Linear Codes (RLC) over GF(2^(8)). + +4.1. Formats and Codes + +4.1.1. FEC Framework Configuration Information + + Following the guidelines of Section 5.6 of [RFC6363], this section + provides the FEC Framework Configuration Information (or FFCI). This + FCCI needs to be shared (e.g., using SDP) between the FECFRAME sender + and receiver instances in order to synchronize them. It includes a + FEC Encoding ID, mandatory for any FEC scheme specification, plus + scheme-specific elements. + +4.1.1.1. FEC Encoding ID + + FEC Encoding ID: the value assigned to this fully specified FEC + scheme MUST be 10, as assigned by IANA (Section 9). + + When SDP is used to communicate the FFCI, this FEC Encoding ID is + carried in the 'encoding-id' parameter. + +4.1.1.2. FEC Scheme-Specific Information + + The FEC Scheme-Specific Information (FSSI) includes elements that are + specific to the present FEC scheme. More precisely: + + Encoding symbol size (E): a non-negative integer that indicates the + size of each encoding symbol in bytes; + + Window Size Ratio (WSR) parameter: a non-negative integer between 0 + and 255 (both inclusive) used to initialize window sizes. A value + of 0 indicates this parameter is not considered (e.g., a fixed + encoding window size may be chosen). A value between 1 and 255 + inclusive is required by certain of the parameter derivation + techniques described in Appendix C; + + This element is required both by the sender (RLC encoder) and the + receiver(s) (RLC decoder). + + When SDP is used to communicate the FFCI, this FEC Scheme-Specific + Information is carried in the 'fssi' parameter in textual + representation as specified in [RFC6364]. For instance: + + fssi=E:1400,WSR:191 + + In that case the name values "E" and "WSR" are used to convey the E + and WSR parameters respectively. + + If another mechanism requires the FSSI to be carried as an opaque + octet string, the encoding format consists of the following three + octets, where the E field is carried in "big-endian" or "network + order" format, that is, most significant byte first: + + Encoding symbol length (E): 16-bit field; + + Window Size Ratio Parameter (WSR): 8-bit field. + + These three octets can be communicated as such, or for instance, be + subject to an additional Base64 encoding. + + 0 1 2 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Encoding Symbol Length (E) | WSR | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 4: FSSI Encoding Format + +4.1.2. Explicit Source FEC Payload ID + + A FEC Source Packet MUST contain an Explicit Source FEC Payload ID + that is appended to the end of the packet as illustrated in Figure 5. + + +--------------------------------+ + | IP Header | + +--------------------------------+ + | Transport Header | + +--------------------------------+ + | ADU | + +--------------------------------+ + | Explicit Source FEC Payload ID | + +--------------------------------+ + + Figure 5: Structure of an FEC Source Packet with the Explicit + Source FEC Payload ID + + More precisely, the Explicit Source FEC Payload ID is composed of the + following field, carried in "big-endian" or "network order" format, + that is, most significant byte first (Figure 6): + + Encoding Symbol ID (ESI) (32-bit field): this unsigned integer + identifies the first source symbol of the ADUI corresponding to + this FEC Source Packet. The ESI is incremented for each new + source symbol, and after reaching the maximum value (2^(32)-1), + wrapping to zero occurs. + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Encoding Symbol ID (ESI) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 6: Source FEC Payload ID Encoding Format + +4.1.3. Repair FEC Payload ID + + A FEC Repair Packet MAY contain one or more repair symbols. When + there are several repair symbols, all of them MUST have been + generated from the same encoding window, using Repair_Key values that + are managed as explained below. A receiver can easily deduce the + number of repair symbols within a FEC Repair Packet by comparing the + received FEC Repair Packet size (equal to the UDP payload size when + UDP is the underlying transport protocol) and the symbol size, E, + communicated in the FFCI. + + A FEC Repair Packet MUST contain a Repair FEC Payload ID that is + prepended to the repair symbol as illustrated in Figure 7. + + +--------------------------------+ + | IP Header | + +--------------------------------+ + | Transport Header | + +--------------------------------+ + | Repair FEC Payload ID | + +--------------------------------+ + | Repair Symbol | + +--------------------------------+ + + Figure 7: Structure of an FEC Repair Packet with the Repair FEC + Payload ID + + More precisely, the Repair FEC Payload ID is composed of the + following fields where all integer fields are carried in "big-endian" + or "network order" format, that is, most significant byte first + (Figure 8): + + Repair_Key (16-bit field): this unsigned integer is used as a seed + by the coefficient generation function (Section 3.6) in order to + generate the desired number of coding coefficients. This repair + key may be a monotonically increasing integer value that loops + back to 0 after reaching 65535 (see Section 6.1). When a FEC + Repair Packet contains several repair symbols, this repair key + value is that of the first repair symbol. The remaining repair + keys can be deduced by incrementing by 1 this value, up to a + maximum value of 65535 after which it loops back to 0. + + Density Threshold for the coding coefficients, DT (4-bit field): + this unsigned integer carries the Density Threshold (DT) used by + the coding coefficient generation function Section 3.6. More + precisely, it controls the probability of having a nonzero coding + coefficient, which equals (DT+1) / 16. When a FEC Repair Packet + contains several repair symbols, the DT value applies to all of + them; + + Number of Source Symbols in the encoding window, NSS (12-bit + field): + this unsigned integer indicates the number of source symbols in + the encoding window when this repair symbol was generated. When a + FEC Repair Packet contains several repair symbols, this NSS value + applies to all of them; + + ESI of First Source Symbol in the encoding window, FSS_ESI (32-bit + field): + this unsigned integer indicates the ESI of the first source symbol + in the encoding window when this repair symbol was generated. + When a FEC Repair Packet contains several repair symbols, this + FSS_ESI value applies to all of them; + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Repair_Key | DT |NSS (# src symb in ew) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | FSS_ESI | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 8: Repair FEC Payload ID Encoding Format + +4.2. Procedures + + All the procedures of Section 3 apply to this FEC scheme. + +5. Sliding Window RLC FEC Scheme over GF(2) for Arbitrary Packet Flows + + This fully-specified FEC scheme defines the Sliding Window Random + Linear Codes (RLC) over GF(2) (binary case). + +5.1. Formats and Codes + +5.1.1. FEC Framework Configuration Information + +5.1.1.1. FEC Encoding ID + + FEC Encoding ID: the value assigned to this fully specified FEC + scheme MUST be 9, as assigned by IANA (Section 9). + + When SDP is used to communicate the FFCI, this FEC Encoding ID is + carried in the 'encoding-id' parameter. + +5.1.1.2. FEC Scheme-Specific Information + + All the considerations of Section 4.1.1.2 apply here. + +5.1.2. Explicit Source FEC Payload ID + + All the considerations of Section 4.1.2 apply here. + +5.1.3. Repair FEC Payload ID + + All the considerations of Section 4.1.3 apply here, with the only + exception that the Repair_Key field is useless if DT = 15 (indeed, in + that case all the coefficients are necessarily equal to 1 and the + coefficient generation function does not use any PRNG). When DT = 15 + the FECFRAME sender MUST set the Repair_Key field to zero on + transmission and a receiver MUST ignore it on receipt. + +5.2. Procedures + + All the procedures of Section 3 apply to this FEC scheme. + +6. FEC Code Specification + +6.1. Encoding Side + + This section provides a high level description of a Sliding Window + RLC encoder. + + Whenever a new FEC Repair Packet is needed, the RLC encoder instance + first gathers the ew_size source symbols currently in the sliding + encoding window. Then it chooses a repair key, which can be a + monotonically increasing integer value, incremented for each repair + symbol up to a maximum value of 65535 (as it is carried within a + 16-bit field) after which it loops back to 0. This repair key is + communicated to the coefficient generation function (Section 3.6) in + order to generate ew_size coding coefficients. Finally, the FECFRAME + sender computes the repair symbol as a linear combination of the + ew_size source symbols using the ew_size coding coefficients + (Section 3.7). When E is small and when there is an incentive to + pack several repair symbols within the same FEC Repair Packet, the + appropriate number of repair symbols are computed. In that case the + repair key for each of them MUST be incremented by 1, keeping the + same ew_size source symbols, since only the first repair key will be + carried in the Repair FEC Payload ID. The FEC Repair Packet can then + be passed to the transport layer for transmission. The source versus + repair FEC packet transmission order is out of scope of this document + and several approaches exist that are implementation-specific. + + Other solutions are possible to select a repair key value when a new + FEC Repair Packet is needed, for instance, by choosing a random + integer between 0 and 65535. However, selecting the same repair key + as before (which may happen in case of a random process) is only + meaningful if the encoding window has changed, otherwise the same FEC + Repair Packet will be generated. In any case, choosing the repair + key is entirely at the discretion of the sender, since it is + communicated to the receiver(s) in each Repair FEC Payload ID. A + receiver should not make any assumption on the way the repair key is + managed. + +6.2. Decoding Side + + This section provides a high level description of a Sliding Window + RLC decoder. + + A FECFRAME receiver needs to maintain a linear system whose variables + are the received and lost source symbols. Upon receiving a FEC + Repair Packet, a receiver first extracts all the repair symbols it + contains (in case several repair symbols are packed together). For + each repair symbol, when at least one of the corresponding source + symbols it protects has been lost, the receiver adds an equation to + the linear system (or no equation if this repair packet does not + change the linear system rank). This equation of course re-uses the + ew_size coding coefficients that are computed by the same coefficient + generation function (Section 3.6), using the repair key and encoding + window descriptions carried in the Repair FEC Payload ID. Whenever + possible (i.e., when a sub-system covering one or more lost source + symbols is of full rank), decoding is performed in order to recover + lost source symbols. Gaussian elimination is one possible algorithm + to solve this linear system. Each time an ADUI can be totally + recovered, padding is removed (thanks to the Length field, L, of the + ADUI) and the ADU is assigned to the corresponding application flow + (thanks to the Flow ID field, F, of the ADUI). This ADU is finally + passed to the corresponding upper application. Received FEC Source + Packets, containing an ADU, MAY be passed to the application either + immediately or after some time to guaranty an ordered delivery to the + application. This document does not mandate any approach as this is + an operational and management decision. + + With real-time flows, a lost ADU that is decoded after the maximum + latency or an ADU received after this delay has no value to the + application. This raises the question of deciding whether or not an + ADU is late. This decision MAY be taken within the FECFRAME receiver + (e.g., using the decoding window, see Section 3.1) or within the + application (e.g., using RTP timestamps within the ADU). Deciding + which option to follow and whether or not to pass all ADUs, including + those assumed late, to the application are operational decisions that + depend on the application and are therefore out of scope of this + document. Additionally, Appendix D discusses a backward compatible + optimization whereby late source symbols MAY still be used within the + FECFRAME receiver in order to improve transmission robustness. + +7. Security Considerations + + The FEC Framework document [RFC6363] provides a fairly comprehensive + analysis of security considerations applicable to FEC schemes. + Therefore, the present section follows the security considerations + section of [RFC6363] and only discusses specific topics. + +7.1. Attacks Against the Data Flow + +7.1.1. Access to Confidential Content + + The Sliding Window RLC FEC scheme specified in this document does not + change the recommendations of [RFC6363]. To summarize, if + confidentiality is a concern, it is RECOMMENDED that one of the + solutions mentioned in [RFC6363] is used with special considerations + to the way this solution is applied (e.g., is encryption applied + before or after FEC protection, within the end system or in a + middlebox), to the operational constraints (e.g., performing FEC + decoding in a protected environment may be complicated or even + impossible) and to the threat model. + +7.1.2. Content Corruption + + The Sliding Window RLC FEC scheme specified in this document does not + change the recommendations of [RFC6363]. To summarize, it is + RECOMMENDED that one of the solutions mentioned in [RFC6363] is used + on both the FEC Source and Repair Packets. + +7.2. Attacks Against the FEC Parameters + + The FEC scheme specified in this document defines parameters that can + be the basis of attacks. More specifically, the following parameters + of the FFCI may be modified by an attacker who targets receivers + (Section 4.1.1.2): + + FEC Encoding ID: changing this parameter leads a receiver to + consider a different FEC scheme. The consequences are severe, the + format of the Explicit Source FEC Payload ID and Repair FEC + Payload ID of received packets will probably differ, leading to + various malfunctions. Even if the original and modified FEC + schemes share the same format, FEC decoding will either fail or + lead to corrupted decoded symbols. This will happen if an + attacker turns value 9 (i.e., RLC over GF(2)) to value 10 (RLC + over GF(2^(8))), an additional consequence being a higher + processing overhead at the receiver. In any case, the attack + results in a form of Denial of Service (DoS) or corrupted content. + + Encoding symbol length (E): setting this E parameter to a different + value will confuse a receiver. If the size of a received FEC + Repair Packet is no longer multiple of the modified E value, a + receiver quickly detects a problem and SHOULD reject the packet. + If the new E value is a sub-multiple of the original E value + (e.g., half the original value), then receivers may not detect the + problem immediately. For instance, a receiver may think that a + received FEC Repair Packet contains more repair symbols (e.g., + twice as many if E is reduced by half), leading to malfunctions + whose nature depends on implementation details. Here also, the + attack always results in a form of DoS or corrupted content. + + It is therefore RECOMMENDED that security measures be taken to + guarantee the FFCI integrity, as specified in [RFC6363]. How to + achieve this depends on the way the FFCI is communicated from the + sender to the receiver, which is not specified in this document. + + Similarly, attacks are possible against the Explicit Source FEC + Payload ID and Repair FEC Payload ID. More specifically, in case of + a FEC Source Packet, the following value can be modified by an + attacker who targets receivers: + + Encoding Symbol ID (ESI): changing the ESI leads a receiver to + consider a wrong ADU, resulting in severe consequences, including + corrupted content passed to the receiving application; + + And in case of a FEC Repair Packet: + + Repair Key: changing this value leads a receiver to generate a wrong + coding coefficient sequence, and therefore any source symbol + decoded using the repair symbols contained in this packet will be + corrupted; + + DT: changing this value also leads a receiver to generate a wrong + coding coefficient sequence, and therefore any source symbol + decoded using the repair symbols contained in this packet will be + corrupted. In addition, if the DT value is significantly + increased, it will generate a higher processing overhead at a + receiver. In case of very large encoding windows, this may impact + the terminal performance; + + NSS: changing this value leads a receiver to consider a different + set of source symbols, and therefore any source symbol decoded + using the repair symbols contained in this packet will be + corrupted. In addition, if the NSS value is significantly + increased, it will generate a higher processing overhead at a + receiver, which may impact the terminal performance; + + FSS_ESI: changing this value also leads a receiver to consider a + different set of source symbols and therefore any source symbol + decoded using the repair symbols contained in this packet will be + corrupted. + + It is therefore RECOMMENDED that security measures are taken to + guarantee the FEC Source and Repair Packets as stated in [RFC6363]. + +7.3. When Several Source Flows are to be Protected Together + + The Sliding Window RLC FEC scheme specified in this document does not + change the recommendations of [RFC6363]. + +7.4. Baseline Secure FEC Framework Operation + + The Sliding Window RLC FEC scheme specified in this document does not + change the recommendations of [RFC6363] concerning the use of the + IPsec/Encapsulating Security Payload (ESP) security protocol as a + mandatory-to-implement (but not mandatory-to-use) security scheme. + This is well suited to situations where the only insecure domain is + the one over which the FEC Framework operates. + +7.5. Additional Security Considerations for Numerical Computations + + In addition to the above security considerations, inherited from + [RFC6363], the present document introduces several formulae, in + particular in Appendix C.1. It is RECOMMENDED to check that the + computed values stay within reasonable bounds since numerical + overflows, caused by an erroneous implementation or an erroneous + input value, may lead to hazardous behaviors. However, what + "reasonable bounds" means is use-case and implementation dependent + and is not detailed in this document. + + Appendix C.2 also mentions the possibility of "using the timestamp + field of an RTP packet header" when applicable. A malicious attacker + may deliberately corrupt this header field in order to trigger + hazardous behaviors at a FECFRAME receiver. Protection against this + type of content corruption can be addressed with the above + recommendations on a baseline secure operation. In addition, it is + also RECOMMENDED to check that the timestamp value be within + reasonable bounds. + +8. Operations and Management Considerations + + The FEC Framework document [RFC6363] provides a fairly comprehensive + analysis of operations and management considerations applicable to + FEC schemes. Therefore, the present section only discusses specific + topics. + +8.1. Operational Recommendations: Finite Field GF(2) Versus GF(2^(8)) + + The present document specifies two FEC schemes that differ on the + Finite Field used for the coding coefficients. It is expected that + the RLC over GF(2^(8)) FEC scheme will be mostly used since it + warrants a higher packet loss protection. In case of small encoding + windows, the associated processing overhead is not an issue (e.g., we + measured decoding speeds between 745 Mbps and 2.8 Gbps on an ARM + Cortex-A15 embedded board in [Roca17] depending on the code rate and + the channel conditions, using an encoding window of size 18 or 23 + symbols; see the above article for the details). Of course the CPU + overhead will increase with the encoding window size, because more + operations in the GF(2^(8)) finite field will be needed. + + The RLC over GF(2) FEC scheme offers an alternative. In that case + operations symbols can be directly XOR-ed together which warrants + high bitrate encoding and decoding operations, and can be an + advantage with large encoding windows. However, packet loss + protection is significantly reduced by using this FEC scheme. + +8.2. Operational Recommendations: Coding Coefficients Density Threshold + + In addition to the choice of the Finite Field, the two FEC schemes + define a coding coefficient density threshold (DT) parameter. This + parameter enables a sender to control the code density, i.e., the + proportion of coefficients that are nonzero on average. With RLC + over GF(2^(8)), it is usually appropriate that small encoding windows + be associated to a density threshold equal to 15, the maximum value, + in order to warrant a high loss protection. + + On the opposite, with larger encoding windows, it is usually + appropriate that the density threshold be reduced. With large + encoding windows, an alternative can be to use RLC over GF(2) and a + density threshold equal to 7 (i.e., an average density equal to 1/2) + or smaller. + + Note that using a density threshold equal to 15 with RLC over GF(2) + is equivalent to using an XOR code that computes the XOR sum of all + the source symbols in the encoding window. In that case: (1) only a + single repair symbol can be produced for any encoding window, and (2) + the repair_key parameter becomes useless (the coding coefficients + generation function does not rely on the PRNG). + +9. IANA Considerations + + This document registers two values in the "FEC Framework (FECFRAME) + FEC Encoding IDs" registry [RFC6363] as follows: + + * 9 refers to the Sliding Window Random Linear Codes (RLC) over + GF(2) FEC Scheme for Arbitrary Packet Flows, as defined in + Section 5 of this document. + + * 10 refers to the Sliding Window Random Linear Codes (RLC) over + GF(2^(8)) FEC Scheme for Arbitrary Packet Flows, as defined in + Section 4 of this document. + +10. References + +10.1. Normative References + + [C99] International Organization for Standardization, + "Programming languages - C: C99, correction 3:2007", ISO/ + IEC 9899:1999/Cor 3:2007, November 2007. + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + <https://www.rfc-editor.org/info/rfc2119>. + + [RFC6363] Watson, M., Begen, A., and V. Roca, "Forward Error + Correction (FEC) Framework", RFC 6363, + DOI 10.17487/RFC6363, October 2011, + <https://www.rfc-editor.org/info/rfc6363>. + + [RFC6364] Begen, A., "Session Description Protocol Elements for the + Forward Error Correction (FEC) Framework", RFC 6364, + DOI 10.17487/RFC6364, October 2011, + <https://www.rfc-editor.org/info/rfc6364>. + + [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC + 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, + May 2017, <https://www.rfc-editor.org/info/rfc8174>. + + [RFC8680] Roca, V. and A. Begen, "Forward Error Correction (FEC) + Framework Extension to Sliding Window Codes", RFC 8680, + DOI 10.17487/RFC8680, January 2020, + <https://www.rfc-editor.org/info/rfc8680>. + + [RFC8682] Saito, M., Matsumoto, M., Roca, V., Ed., and E. Baccelli, + "TinyMT32 Pseudorandom Number Generator (PRNG)", RFC 8682, + DOI 10.17487/RFC8682, January 2020, + <https://www.rfc-editor.org/info/rfc8682>. + +10.2. Informative References + + [PGM13] Plank, J., Greenan, K., and E. Miller, "A Complete + Treatment of Software Implementations of Finite Field + Arithmetic for Erasure Coding Applications", University of + Tennessee Technical Report UT-CS-13-717, October 2013, + <http://web.eecs.utk.edu/~plank/plank/papers/UT-CS- + 13-717.html>. + + [RFC5170] Roca, V., Neumann, C., and D. Furodet, "Low Density Parity + Check (LDPC) Staircase and Triangle Forward Error + Correction (FEC) Schemes", RFC 5170, DOI 10.17487/RFC5170, + June 2008, <https://www.rfc-editor.org/info/rfc5170>. + + [RFC5510] Lacan, J., Roca, V., Peltotalo, J., and S. Peltotalo, + "Reed-Solomon Forward Error Correction (FEC) Schemes", + RFC 5510, DOI 10.17487/RFC5510, April 2009, + <https://www.rfc-editor.org/info/rfc5510>. + + [RFC6681] Watson, M., Stockhammer, T., and M. Luby, "Raptor Forward + Error Correction (FEC) Schemes for FECFRAME", RFC 6681, + DOI 10.17487/RFC6681, August 2012, + <https://www.rfc-editor.org/info/rfc6681>. + + [RFC6726] Paila, T., Walsh, R., Luby, M., Roca, V., and R. Lehtonen, + "FLUTE - File Delivery over Unidirectional Transport", + RFC 6726, DOI 10.17487/RFC6726, November 2012, + <https://www.rfc-editor.org/info/rfc6726>. + + [RFC6816] Roca, V., Cunche, M., and J. Lacan, "Simple Low-Density + Parity Check (LDPC) Staircase Forward Error Correction + (FEC) Scheme for FECFRAME", RFC 6816, + DOI 10.17487/RFC6816, December 2012, + <https://www.rfc-editor.org/info/rfc6816>. + + [RFC6865] Roca, V., Cunche, M., Lacan, J., Bouabdallah, A., and K. + Matsuzono, "Simple Reed-Solomon Forward Error Correction + (FEC) Scheme for FECFRAME", RFC 6865, + DOI 10.17487/RFC6865, February 2013, + <https://www.rfc-editor.org/info/rfc6865>. + + [RFC8406] Adamson, B., Adjih, C., Bilbao, J., Firoiu, V., Fitzek, + F., Ghanem, S., Lochin, E., Masucci, A., Montpetit, M-J., + Pedersen, M., Peralta, G., Roca, V., Ed., Saxena, P., and + S. Sivakumar, "Taxonomy of Coding Techniques for Efficient + Network Communications", RFC 8406, DOI 10.17487/RFC8406, + June 2018, <https://www.rfc-editor.org/info/rfc8406>. + + [Roca16] Roca, V., Teibi, B., Burdinat, C., Tran-Thai, T., and C. + Thienot, "Block or Convolutional AL-FEC Codes? A + Performance Comparison for Robust Low-Latency + Communications", HAL ID hal-01395937v2, February 2017, + <https://hal.inria.fr/hal-01395937/en/>. + + [Roca17] Roca, V., Teibi, B., Burdinat, C., Tran, T., and C. + Thienot, "Less Latency and Better Protection with AL-FEC + Sliding Window Codes: a Robust Multimedia CBR Broadcast + Case Study", 13th IEEE International Conference on + Wireless and Mobile Computing, Networking and + Communications (WiMob17), HAL ID hal-01571609, October + 2017, <https://hal.inria.fr/hal-01571609v1/en/>. + +Appendix A. TinyMT32 Validation Criteria (Normative) + + PRNG determinism, for a given seed, is a requirement. Consequently, + in order to validate an implementation of the TinyMT32 PRNG, the + following criteria MUST be met. + + The first criterion focuses on the tinymt32_rand256(), where the + 32-bit integer of the core TinyMT32 PRNG is scaled down to an 8-bit + integer. Using a seed value of 1, the first 50 values returned by: + tinymt32_rand256() as 8-bit unsigned integers MUST be equal to values + provided in Figure 9, to be read line by line. + + 37 225 177 176 21 + 246 54 139 168 237 + 211 187 62 190 104 + 135 210 99 176 11 + 207 35 40 113 179 + 214 254 101 212 211 + 226 41 234 232 203 + 29 194 211 112 107 + 217 104 197 135 23 + 89 210 252 109 166 + + Figure 9: First 50 decimal values (to be read per line) returned by + tinymt32_rand256() as 8-bit unsigned integers, with a seed value of 1 + + The second criterion focuses on the tinymt32_rand16(), where the + 32-bit integer of the core TinyMT32 PRNG is scaled down to a 4-bit + integer. Using a seed value of 1, the first 50 values returned by: + tinymt32_rand16() as 4-bit unsigned integers MUST be equal to values + provided in Figure 10, to be read line by line. + + 5 1 1 0 5 + 6 6 11 8 13 + 3 11 14 14 8 + 7 2 3 0 11 + 15 3 8 1 3 + 6 14 5 4 3 + 2 9 10 8 11 + 13 2 3 0 11 + 9 8 5 7 7 + 9 2 12 13 6 + + Figure 10: First 50 decimal values (to be read per line) returned by + tinymt32_rand16() as 4-bit unsigned integers, with a seed value of 1 + +Appendix B. Assessing the PRNG Adequacy (Informational) + + This annex discusses the adequacy of the TinyMT32 PRNG and the + tinymt32_rand16() and tinymt32_rand256() functions, to the RLC FEC + schemes. The goal is to assess the adequacy of these two functions + in producing coding coefficients that are sufficiently different from + one another, across various repair symbols with repair key values in + sequence (we can expect this approach to be commonly used by + implementers, see Section 6.1). This section is purely informational + and does not claim to be a solid evaluation. + + The two RLC FEC schemes use the PRNG to produce pseudorandom coding + coefficients (Section 3.6), each time a new repair symbol is needed. + A different repair key is used for each repair symbol, usually by + incrementing the repair key value (Section 6.1). For each repair + symbol, a limited number of pseudorandom numbers is needed, depending + on the DT and encoding window size (Section 3.6), using either + tinymt32_rand16() or tinymt32_rand256(). Therefore, we are more + interested in the randomness of small sequences of random numbers + mapped to 4-bit or 8-bit integers, than in the randomness of a very + large sequence of random numbers which is not representative of the + usage of the PRNG. + + Evaluation of tinymt32_rand16(): We first generate a huge number + (1,000,000,000) of small sequences (20 pseudorandom numbers per + sequence), increasing the seed value for each sequence, and perform + statistics on the number of occurrences of each of the 16 possible + values across all sequences. In this first test we consider 32-bit + seed values in order to assess the PRNG quality after output + truncation to 4 bits. + + +-------+-------------+----------------+ + | Value | Occurrences | Percentage (%) | + +=======+=============+================+ + | 0 | 1250036799 | 6.2502 | + +-------+-------------+----------------+ + | 1 | 1249995831 | 6.2500 | + +-------+-------------+----------------+ + | 2 | 1250038674 | 6.2502 | + +-------+-------------+----------------+ + | 3 | 1250000881 | 6.2500 | + +-------+-------------+----------------+ + | 4 | 1250023929 | 6.2501 | + +-------+-------------+----------------+ + | 5 | 1249986320 | 6.2499 | + +-------+-------------+----------------+ + | 6 | 1249995587 | 6.2500 | + +-------+-------------+----------------+ + | 7 | 1250020363 | 6.2501 | + +-------+-------------+----------------+ + | 8 | 1249995276 | 6.2500 | + +-------+-------------+----------------+ + | 9 | 1249982856 | 6.2499 | + +-------+-------------+----------------+ + | 10 | 1249984111 | 6.2499 | + +-------+-------------+----------------+ + | 11 | 1250009551 | 6.2500 | + +-------+-------------+----------------+ + | 12 | 1249955768 | 6.2498 | + +-------+-------------+----------------+ + | 13 | 1249994654 | 6.2500 | + +-------+-------------+----------------+ + | 14 | 1250000569 | 6.2500 | + +-------+-------------+----------------+ + | 15 | 1249978831 | 6.2499 | + +-------+-------------+----------------+ + + Table 1: tinymt32_rand16() + Occurrence Statistics + + Evaluation of tinymt32_rand16(): We first generate a huge number + (1,000,000,000) of small sequences (20 pseudorandom numbers per + sequence), increasing the seed value for each sequence, and perform + statistics on the number of occurrences of each of the 16 possible + values across the 20,000,000,000 numbers of all sequences. In this + first test, we consider 32-bit seed values in order to assess the + PRNG quality after output truncation to 4 bits. + + The results (Table 1) show that all possible values are almost + equally represented, or said differently, that the tinymt32_rand16() + output converges to a uniform distribution where each of the 16 + possible values would appear exactly 1 / 16 * 100 = 6.25% of times. + + Since the RLC FEC schemes use of this PRNG will be limited to 16-bit + seed values, we carried out the same test for the first 2^(16) seed + values only. The distribution (not shown) is of course less uniform, + with value occurrences ranging between 6.2121% (i.e., 81,423 + occurrences out of a total of 65536*20=1,310,720) and 6.2948% (i.e., + 82,507 occurrences). However, we do not believe it significantly + impacts the RLC FEC scheme behavior. + + Other types of biases may exist that may be visible with smaller + tests, for instance to evaluate the convergence speed to a uniform + distribution. We therefore perform 200 tests, each of them producing + 200 sequences, keeping only the first value of each sequence. We use + non-overlapping repair keys for each sequence, starting with value 0 + and increasing it after each use. + + +-------+-----------------+-----------------+---------------------+ + | Value | Min Occurrences | Max Occurrences | Average Occurrences | + +=======+=================+=================+=====================+ + | 0 | 4 | 21 | 6.3675 | + +-------+-----------------+-----------------+---------------------+ + | 1 | 4 | 22 | 6.0200 | + +-------+-----------------+-----------------+---------------------+ + | 2 | 4 | 20 | 6.3125 | + +-------+-----------------+-----------------+---------------------+ + | 3 | 5 | 23 | 6.1775 | + +-------+-----------------+-----------------+---------------------+ + | 4 | 5 | 24 | 6.1000 | + +-------+-----------------+-----------------+---------------------+ + | 5 | 4 | 21 | 6.5925 | + +-------+-----------------+-----------------+---------------------+ + | 6 | 5 | 30 | 6.3075 | + +-------+-----------------+-----------------+---------------------+ + | 7 | 6 | 22 | 6.2225 | + +-------+-----------------+-----------------+---------------------+ + | 8 | 5 | 26 | 6.1750 | + +-------+-----------------+-----------------+---------------------+ + | 9 | 3 | 21 | 5.9425 | + +-------+-----------------+-----------------+---------------------+ + | 10 | 5 | 24 | 6.3175 | + +-------+-----------------+-----------------+---------------------+ + | 11 | 4 | 22 | 6.4300 | + +-------+-----------------+-----------------+---------------------+ + | 12 | 5 | 21 | 6.1600 | + +-------+-----------------+-----------------+---------------------+ + | 13 | 5 | 22 | 6.3100 | + +-------+-----------------+-----------------+---------------------+ + | 14 | 4 | 26 | 6.3950 | + +-------+-----------------+-----------------+---------------------+ + | 15 | 4 | 21 | 6.1700 | + +-------+-----------------+-----------------+---------------------+ + + Table 2: tinymt32_rand16() Occurrence Statistics + + Table 2 shows across all 200 tests, for each of the 16 possible + pseudorandom number values, the minimum (resp. maximum) number of + times it appeared in a test, as well as the average number of + occurrences across the 200 tests. Although the distribution is not + perfect, there is no major bias. On the contrary, in the same + conditions, the Park-Miller linear congruential PRNG of [RFC5170] + with a result scaled down to 4-bit values, using seeds in sequence + starting from 1, systematically returns 0 as the first value during + some time. Then, after a certain repair key value threshold, it + systematically returns 1, etc. + + Evaluation of tinymt32_rand256(): The same approach is used here. + Results (not shown) are similar: occurrences vary between 7,810,3368 + (i.e., 0.3905%) and 7,814,7952 (i.e., 0.3907%). Here also we see a + convergence to the theoretical uniform distribution where each of the + 256 possible values would appear exactly 1 / 256 * 100 = 0.390625% of + times. + +Appendix C. Possible Parameter Derivation (Informational) + + Section 3.1 defines several parameters to control the encoder or + decoder. This annex proposes techniques to derive these parameters + according to the target use-case. This annex is informational, in + the sense that using a different derivation technique will not + prevent the encoder and decoder to interoperate: a decoder can still + recover an erased source symbol without any error. However, in case + of a real-time flow, an inappropriate parameter derivation may lead + to the decoding of erased source packets after their validity period, + making them useless to the target application. This annex proposes + an approach to reduce this risk, among other things. + + The FEC schemes defined in this document can be used in various + manners, depending on the target use-case: + + * the source ADU flow they protect may or may not have real-time + constraints; + + * the source ADU flow may be a Constant Bitrate (CBR) or Variable + Bitrate (VBR) flow; + + * with a VBR source ADU flow, the flow's minimum and maximum + bitrates may or may not be known; + + * and the communication path between encoder and decoder may be a + CBR communication path (e.g., as with certain LTE-based broadcast + channels) or not (general case, e.g., with Internet). + + The parameter derivation technique should be suited to the use-case, + as described in the following sections. + +C.1. Case of a CBR Real-Time Flow + + In the following, we consider a real-time flow with max_lat latency + budget. The encoding symbol size, E, is constant. The code rate, + cr, is also constant, its value depending on the expected + communication loss model (this choice is out of scope of this + document). + + In a first configuration, the source ADU flow bitrate at the input of + the FECFRAME sender is fixed and equal to br_in (in bits/s), and this + value is known by the FECFRAME sender. It follows that the + transmission bitrate at the output of the FECFRAME sender will be + higher, depending on the added repair flow overhead. In order to + comply with the maximum FEC-related latency budget, we have: + + dw_max_size = (max_lat * br_in) / (8 * E) + + assuming that the encoding and decoding times are negligible with + respect to the target max_lat. This is a reasonable assumption in + many situations (e.g., see Section 8.1 in case of small window + sizes). Otherwise the max_lat parameter should be adjusted in order + to avoid the problem. In any case, interoperability will never be + compromised by choosing a too large value. + + In a second configuration, the FECFRAME sender generates a fixed + bitrate flow, equal to the CBR communication path bitrate equal to + br_out (in bits/s), and this value is known by the FECFRAME sender, + as in [Roca17]. The maximum source flow bitrate needs to be such + that, with the added repair flow overhead, the total transmission + bitrate remains inferior or equal to br_out. We have: + + dw_max_size = (max_lat * br_out * cr) / (8 * E) + + assuming here also that the encoding and decoding times are + negligible with respect to the target max_lat. + + For decoding to be possible within the latency budget, it is required + that the encoding window maximum size be smaller than or at most + equal to the decoding window maximum size. The ew_max_size is the + main parameter at a FECFRAME sender, but its exact value has no + impact on the FEC-related latency budget. The ew_max_size parameter + is computed as follows: + + ew_max_size = dw_max_size * WSR / 255 + + In line with [Roca17], WSR = 191 is considered as a reasonable value + (the resulting encoding to decoding window size ratio is then close + to 0.75), but other values between 1 and 255 inclusive are possible, + depending on the use-case. + + The dw_max_size is computed by a FECFRAME sender but not explicitly + communicated to a FECFRAME receiver. However, a FECFRAME receiver + can easily evaluate the ew_max_size by observing the maximum Number + of Source Symbols (NSS) value contained in the Repair FEC Payload ID + of received FEC Repair Packets (Section 4.1.3). A receiver can then + easily compute dw_max_size: + + dw_max_size = max_NSS_observed * 255 / WSR + + A receiver can then choose an appropriate linear system maximum size: + + ls_max_size >= dw_max_size + + It is good practice to use a larger value for ls_max_size as + explained in Appendix D, which does not impact maximum latency nor + interoperability. + + In any case, for a given use-case (i.e., for target encoding and + decoding devices and desired protection levels in front of + communication impairments) and for the computed ew_max_size, + dw_max_size and ls_max_size values, it is RECOMMENDED to check that + the maximum encoding time and maximum memory requirements at a + FECFRAME sender, and maximum decoding time and maximum memory + requirements at a FECFRAME receiver, stay within reasonable bounds. + When assuming that the encoding and decoding times are negligible + with respect to the target max_lat, this should be verified as well, + otherwise the max_lat SHOULD be adjusted accordingly. + + The particular case of session start needs to be managed + appropriately since the ew_size, starting at zero, increases each + time a new source ADU is received by the FECFRAME sender, until it + reaches the ew_max_size value. Therefore, a FECFRAME receiver SHOULD + continuously observe the received FEC Repair Packets, since the NSS + value carried in the Repair FEC Payload ID will increase too, and + adjust its ls_max_size accordingly if need be. With a CBR flow, + session start is expected to be the only moment when the encoding + window size will increase. Similarly, with a CBR real-time flow, the + session end is expected to be the only moment when the encoding + window size will progressively decrease. No adjustment of the + ls_max_size is required at the FECFRAME receiver in that case. + +C.2. Other Types of Real-Time Flow + + In the following, we consider a real-time source ADU flow with a + max_lat latency budget and a variable bitrate (VBR) measured at the + entry of the FECFRAME sender. A first approach consists in + considering the smallest instantaneous bitrate of the source ADU + flow, when this parameter is known, and to reuse the derivation of + Appendix C.1. Considering the smallest bitrate means that the + encoding and decoding window maximum size estimations are + pessimistic: these windows have the smallest size required to enable + on-time decoding at a FECFRAME receiver. If the instantaneous + bitrate is higher than this smallest bitrate, this approach leads to + an encoding window that is unnecessarily small, which reduces + robustness in front of long erasure bursts. + + Another approach consists in using ADU timing information (e.g., + using the timestamp field of an RTP packet header, or registering the + time upon receiving a new ADU). From the global FEC-related latency + budget, the FECFRAME sender can derive a practical maximum latency + budget for encoding operations, max_lat_for_encoding. For the FEC + schemes specified in this document, this latency budget SHOULD be + computed with: + + max_lat_for_encoding = max_lat * WSR / 255 + + It follows that any source symbols associated to an ADU that has + timed-out with respect to max_lat_for_encoding SHOULD be removed from + the encoding window. With this approach there is no pre-determined + ew_size value: this value fluctuates over the time according to the + instantaneous source ADU flow bitrate. For practical reasons, a + FECFRAME sender may still require that ew_size does not increase + beyond a maximum value (Appendix C.3). + + With both approaches, and no matter the choice of the FECFRAME + sender, a FECFRAME receiver can still easily evaluate the ew_max_size + by observing the maximum Number of Source Symbols (NSS) value + contained in the Repair FEC Payload ID of received FEC Repair + Packets. A receiver can then compute dw_max_size and derive an + appropriate ls_max_size as explained in Appendix C.1. + + When the observed NSS fluctuates significantly, a FECFRAME receiver + may want to adapt its ls_max_size accordingly. In particular when + the NSS is significantly reduced, a FECFRAME receiver may want to + reduce the ls_max_size too in order to limit computation complexity. + A balance must be found between using an ls_max_size "too large" + (which increases computation complexity and memory requirements) and + the opposite (which reduces recovery performance). + +C.3. Case of a Non-Real-Time Flow + + Finally there are configurations where a source ADU flow has no real- + time constraints. FECFRAME and the FEC schemes defined in this + document can still be used. The choice of appropriate parameter + values can be directed by practical considerations. For instance, it + can derive from an estimation of the maximum memory amount that could + be dedicated to the linear system at a FECFRAME receiver, or the + maximum computation complexity at a FECFRAME receiver, both of them + depending on the ls_max_size parameter. The same considerations also + apply to the FECFRAME sender, where the maximum memory amount and + computation complexity depend on the ew_max_size parameter. + + Here also, the NSS value contained in FEC Repair Packets is used by a + FECFRAME receiver to determine the current coding window size and + ew_max_size by observing its maximum value over the time. + +Appendix D. Decoding Beyond Maximum Latency Optimization + (Informational) + + This annex introduces non-normative considerations. It is provided + as suggestions, without any impact on interoperability. For more + information see [Roca16]. + + With a real-time source ADU flow, it is possible to improve the + decoding performance of Sliding Window Codes without impacting + maximum latency, at the cost of extra memory and CPU overhead. The + optimization consists, for a FECFRAME receiver, to extend the linear + system beyond the decoding window maximum size, by keeping a certain + number of old source symbols whereas their associated ADUs timed-out: + + ls_max_size > dw_max_size + + Usually the following choice is a good trade-off between decoding + performance and extra CPU overhead: + + ls_max_size = 2 * dw_max_size + + When the dw_max_size is very small, it may be preferable to keep a + minimum ls_max_size value (e.g., LS_MIN_SIZE_DEFAULT = 40 symbols). + Going below this threshold will not save a significant amount of + memory nor CPU cycles. Therefore: + + ls_max_size = max(2 * dw_max_size, LS_MIN_SIZE_DEFAULT) + + Finally, it is worth noting that a receiver that benefits from an FEC + protection significantly higher than what is required to recover from + packet losses, can choose to reduce the ls_max_size. In that case + lost ADUs will be recovered without relying on this optimization. + + ls_max_size + /---------------------------------^-------------------------------\ + + late source symbols + (pot. decoded but not delivered) dw_max_size + /--------------^-----------------\ /--------------^---------------\ + src0 src1 src2 src3 src4 src5 src6 src7 src8 src9 src10 src11 src12 + + Figure 11: Relationship between Parameters to Decode beyond + Maximum Latency + + It means that source symbols, and therefore ADUs, may be decoded even + if the added latency exceeds the maximum value permitted by the + application (the "late source symbols" of Figure 11). It follows + that the corresponding ADUs will not be useful to the application. + However, decoding these "late symbols" significantly improves the + global robustness in bad reception conditions and is therefore + recommended for receivers experiencing bad communication conditions + [Roca16]. In any case whether or not to use this optimization and + what exact value to use for the ls_max_size parameter are local + decisions made by each receiver independently, without any impact on + the other receivers nor on the source. + +Acknowledgments + + The authors would like to thank the three TSVWG chairs, Wesley Eddy + (our shepherd), David Black, and Gorry Fairhurst; as well as Spencer + Dawkins, our responsible AD; and all those who provided comments -- + namely (in alphabetical order), Alan DeKok, Jonathan Detchart, Russ + Housley, Emmanuel Lochin, Marie-Jose Montpetit, and Greg Skinner. + Last but not least, the authors are really grateful to the IESG + members, in particular Benjamin Kaduk, Mirja Kuehlewind, Eric + Rescorla, Adam Roach, and Roman Danyliw for their highly valuable + feedback that greatly contributed to improving this specification. + +Authors' Addresses + + Vincent Roca + INRIA + Univ. Grenoble Alpes + France + + Email: vincent.roca@inria.fr + + + Belkacem Teibi + INRIA + Univ. Grenoble Alpes + France + + Email: belkacem.teibi@gmail.com |