Comments on draft-michel-quic-fec-01

Christian Huitema <huitema@huitema.net> Fri, 19 January 2024 06:30 UTC

Return-Path: <huitema@huitema.net>
X-Original-To: quic@ietfa.amsl.com
Delivered-To: quic@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id A8DEEC14F5F2 for <quic@ietfa.amsl.com>; Thu, 18 Jan 2024 22:30:04 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -6.909
X-Spam-Level:
X-Spam-Status: No, score=-6.909 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, RCVD_IN_DNSWL_HI=-5, RCVD_IN_ZEN_BLOCKED_OPENDNS=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01] autolearn=ham autolearn_force=no
Received: from mail.ietf.org ([50.223.129.194]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id MH8LlLrzJ8ZB for <quic@ietfa.amsl.com>; Thu, 18 Jan 2024 22:30:03 -0800 (PST)
Received: from out15-27.antispamcloud.com (out15-27.antispamcloud.com [185.201.19.27]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 04369C14F5EB for <quic@ietf.org>; Thu, 18 Jan 2024 22:30:02 -0800 (PST)
Received: from xse179.mail2web.com ([66.113.196.179] helo=xse.mail2web.com) by mx208.antispamcloud.com with esmtp (Exim 4.92) (envelope-from <huitema@huitema.net>) id 1rQiO7-008Mxx-Rw for quic@ietf.org; Fri, 19 Jan 2024 07:30:01 +0100
Received: from xsmtp21.mail2web.com (unknown [10.100.68.60]) by xse.mail2web.com (Postfix) with ESMTPS id 4TGV8j5TsYz4np for <quic@ietf.org>; Thu, 18 Jan 2024 22:29:57 -0800 (PST)
Received: from [10.5.2.17] (helo=xmail07.myhosting.com) by xsmtp21.mail2web.com with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.92) (envelope-from <huitema@huitema.net>) id 1rQiO5-0008I7-Kh for quic@ietf.org; Thu, 18 Jan 2024 22:29:57 -0800
Received: (qmail 10028 invoked from network); 19 Jan 2024 06:29:57 -0000
Received: from unknown (HELO [192.168.1.107]) (Authenticated-user:_huitema@huitema.net@[172.56.169.166]) (envelope-sender <huitema@huitema.net>) by xmail07.myhosting.com (qmail-ldap-1.03) with ESMTPA for <francois.michel@uclouvain.be>; 19 Jan 2024 06:29:57 -0000
Message-ID: <30cbb347-a144-4d58-bf03-b8e7bc0836d1@huitema.net>
Date: Thu, 18 Jan 2024 22:29:56 -0800
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
Content-Language: en-US
To: François Michel <francois.michel@uclouvain.be>, Olivier Bonaventure <Olivier.Bonaventure@uclouvain.be>
Cc: IETF QUIC WG <quic@ietf.org>
From: Christian Huitema <huitema@huitema.net>
Subject: Comments on draft-michel-quic-fec-01
Autocrypt: addr=huitema@huitema.net; keydata= xjMEXtavGxYJKwYBBAHaRw8BAQdA1ou9A5MHTP9N3jfsWzlDZ+jPnQkusmc7sfLmWVz1RmvN J0NocmlzdGlhbiBIdWl0ZW1hIDxodWl0ZW1hQGh1aXRlbWEubmV0PsKWBBMWCAA+FiEEw3G4 Nwi4QEpAAXUUELAmqKBYtJQFAl7WrxsCGwMFCQlmAYAFCwkIBwIGFQoJCAsCBBYCAwECHgEC F4AACgkQELAmqKBYtJQbMwD/ebj/qnSbthC/5kD5DxZ/Ip0CGJw5QBz/+fJp3R8iAlsBAMjK r2tmyWyJz0CUkVG24WaR5EAJDvgwDv8h22U6QVkAzjgEXtavGxIKKwYBBAGXVQEFAQEHQJoM 6MUAIqpoqdCIiACiEynZf7nlJg2Eu0pXIhbUGONdAwEIB8J+BBgWCAAmFiEEw3G4Nwi4QEpA AXUUELAmqKBYtJQFAl7WrxsCGwwFCQlmAYAACgkQELAmqKBYtJRm2wD7BzeK5gEXSmBcBf0j BYdSaJcXNzx4yPLbP4GnUMAyl2cBAJzcsR4RkwO4dCRqM9CHpVJCwHtbUDJaa55//E0kp+gH
Content-Type: text/plain; charset="UTF-8"; format="flowed"
Content-Transfer-Encoding: 8bit
X-Originating-IP: 66.113.196.179
X-Spampanel-Domain: xsmtpout.mail2web.com
X-Spampanel-Username: 66.113.196.0/24
Authentication-Results: antispamcloud.com; auth=pass smtp.auth=66.113.196.0/24@xsmtpout.mail2web.com
X-Spampanel-Outgoing-Class: unsure
X-Spampanel-Outgoing-Evidence: Combined (0.15)
X-Recommended-Action: accept
X-Filter-ID: Pt3MvcO5N4iKaDQ5O6lkdGlMVN6RH8bjRMzItlySaT9WLQux0N3HQm8ltz8rnu+BPUtbdvnXkggZ 3YnVId/Y5jcf0yeVQAvfjHznO7+bT5x6h2yQpzTslcOqazQkKtAFKj/EwzSHE5FGYwwjsNRPCPKD KEXvoeWNQf5jcK/hkT/mD6wdmZPcItWbGe10hXJtXL4FsauCVkDjmcYJdU3yWp7KuHNaaKdg7iBE ZefdsNUFWKwa/wzJUjmazeC7ImcaSHJ6ZQJj6aLOOYVpdHNa+hQ6V51u76v35b1wNe/MvdLYhf3I dKwJJ7WW9KzchH2I2+J9PgaoF8SQHto3le4zsHTaeQtlKubP6iUTjj6yPARK6buALVaA782LKxg6 vRmng8N1aLhXqdc+jC1RcnVud53D5caUhbVtvqItBqoizkEt9O20UjkwI0v+LOlw05G4BS+iyyNq bT8dUMXMJ4tUCMj6G37ZfAMLceP5aNHPt26RBupu5v1nytoNnc138GfEEIgtEXyXj6S3SDvReMcV 8TXUjLjYWQt1/5xnQymMoPsgr/U0flMcy2Vi/IcBgY4arPaiJ1W6hAyiRC61jekdwIcXNugoOEbH RyFULpSjm7jZ1h/HfDRQ5Ig8VhPsPE8N/FZpkRQlnEjxvdHcabythWaKnUd4mN3xkONnx9HiFPUS VAwd8HMaiRG0Af4kHzA4DRojSVizNl0ce/s7u0P9b9Tml6eOMCV9kYYwkPx6ZsXvIUzTXkDAiiJi mGhLUFuS2lhaIetXfCg1JdAVrOwKfNpF8BKbWK1FNhbThcpJ5dNUoFIvD3sIcP1fhJPM6B/8te2S LAKX+c/Ia77NJI+shD1I5TgnJ4xNz8rxHJKsrhKJ+dym1L8cD17Js0v4cp1MFX0KQIPQl47SuR0r HMEpzTcKVNeVJ9BXyu9+ceCqThTYg2px1fSoqxQCCHnLMo/m9VKh99btUAanjnMCAH2co+fBoeG+ Hs0afhsY/5zhNYWRVYKU9W9tbmVXJBqdHHDmZEKhyNAv1N35kYWaEdgLurFV5oTvAcwA4rM3FkfW 8/1kE/e7sUnsVpINvARNxpFO
X-Report-Abuse-To: spam@quarantine14.antispamcloud.com
Archived-At: <https://mailarchive.ietf.org/arch/msg/quic/ETVofniZ5TSxha38Q9MNdpy1B6Q>
X-BeenThere: quic@ietf.org
X-Mailman-Version: 2.1.39
Precedence: list
List-Id: Main mailing list of the IETF QUIC working group <quic.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/quic>, <mailto:quic-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/quic/>
List-Post: <mailto:quic@ietf.org>
List-Help: <mailto:quic-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/quic>, <mailto:quic-request@ietf.org?subject=subscribe>
X-List-Received-Date: Fri, 19 Jan 2024 06:30:04 -0000

François, Olivier,

I just spent some time studying your draft on QUIC FEC. I like the idea 
of having an FEC framework independent from the algorithm used to 
actually compute the FEC data and repair packets. Your draft solves a 
number of practical problems, such as how to notify peers when FEC helps 
receive a frame from an otherwise lost packet, or how to identify 
"symblos" independently of packet numbers using the symbol identifier 
frame (SID).

The draft is obviously a work in progress.

You propose two alternatives for linking frames to a SID. I wish you 
picked just one, and I prefer your first alternative, in which your SID 
frames brackets a list of protected frames. However, I an not quite sure 
how this should be parsed. You give an example as:

   | Pkt(6)[STREAM(2, "xyz"),                                    |
   |        SOURCE_SYMBOL(1, { STREAM(8, "def"),                 |
   |                           DATAGRAM("msg") }]                |

In that example, the frame  STREAM(8..) and DATAGRAM() are protected,
while the "STREAM(2)" is not. Fine, but the syntax is described as:

SOURCE_SYMBOL {
   SID (i),
   FEC Protected Payload (..)
}

... and I don't know how to parse that. There is no indication of the 
length of the "FEC Protected Payload". Do you mean to indicate that the 
SOURCE_SYMBOL frame extends to the end of the packet, and that all 
frames following the SID are protected?

You define a framework in which client and server negotiate to use FEC, 
and also to select a FEC scheme. The syntax of your transport parameter 
seems a bit restrictive: the client proposes to use FEC and a specific 
scheme, and the server accepts or refuse. Given the experimental nature 
of FEC, I expect that we will try several algorithms. It would be nice 
for the client to propose a list, and for the server to pick one -- or 
zero, if it does not support any of the proposed values. In fact, I 
think that you could merge the "enable FEC" parameter that negotiates 
use of FEC with the "decoder FEC scheme" negotiation.

Your draft does not assign identifiers to existing FEC schemes. To 
facilitate interop tests, I suggest that you define at least one. In 
fact, I would suggest a very simple one, in which the REPAIR frame 
identifies a range of SID, and then carries the XOR of all packets in 
that range.

The suggestion above brings a discussion of the relative size of the 
"FEC Protected Payload" and the REPAIR frames. As in the example above, 
I would expect REPAIR frames to include a small header followed by a 
combination of the content of several FEC Protected Payload, with that 
combination being at least as long as the longest FEC Protected Payload 
in the set. That longest size, by default, can be a full packet payload 
(per PMTU), minus the length of the SID prefix. But that leave very 
little room for encoding the prefix of the REPAIR frame, which is likely 
to require at list the REPAIR frame type (arguably same length as the 
SOURCE_SYMBOL frame type), and SID identifying the range (same length as 
the SID parameter of the SOURCE_SYMBOL frame), and an additional 
parameter indicating the variant of he repair frame according to the 
selected scheme (arguably the same length as the coding window). Is that 
the problem that you are discussing in section 4.2.3? Should there be 
some property associated to the FEC scheme, such as the maximum overhead 
of a REPAIR frame? (Also, why pad the FEC-protected data at the 
beginning rather than at the end? Or leave that as a property of the FEC 
scheme?)

I am not sure that I fully understand how to use the FEC WINDOW frame. 
You allow it to change, but what if the packet containing that frame is 
lost? How can the peer know when exactly the use of the new window 
starts, and which window is associated with a particular SOURCE_SYMBOL 
or REPAIR frame?

Reed-Solomon codes are often characterized by two numbers, the length of 
the coding window and the number of redundant copies -- in our case, the 
number of REPAIR frames for a given coding window. It seems that in your 
proposal these two numbers are set arbitrarily by the sender. Should 
there me some negotiation of maximum values? Or would those maximum 
values be deduced from the scheme identifier, something like "reed 
solomon 32 + 8"? Or should the "repair" frame indicate the length of the 
coding widow over which it operates?

I am also not sure how the update of the coding window works for a 
convolutional code.

One way to understand the coding window is "the number of frames over 
which a given REPAIR may operate," but we are concerned with correlated 
losses happening in trains. To protect against that, it is nice to send 
the repair frames some time after the protected frames, in which case 
the window would an indication of how long a copy of a given frame has 
to be kept. This could be expressed as a number of packets, but
if multipath is supported we may want to send the repairs on a different 
path, and then using number of packets is not natural.

OK, that's a lot of text. Some of that may be because I did not fully 
understand your intent. I expect things to get clearer with your next 
draft, or when we start interop testing of different implementations...

Waiting to work on that!

-- Christian Huitema