Re: Proposal to replace ACK block count with ACK length
Ian Swett <ianswett@google.com> Fri, 22 June 2018 01:48 UTC
Return-Path: <ianswett@google.com>
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 B54AB130DC9 for <quic@ietfa.amsl.com>; Thu, 21 Jun 2018 18:48:24 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -17.51
X-Spam-Level:
X-Spam-Status: No, score=-17.51 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, ENV_AND_HDR_SPF_MATCH=-0.5, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_PASS=-0.001, T_DKIMWL_WL_MED=-0.01, USER_IN_DEF_DKIM_WL=-7.5, USER_IN_DEF_SPF_WL=-7.5] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (2048-bit key) header.d=google.com
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id gVayfog8BCN7 for <quic@ietfa.amsl.com>; Thu, 21 Jun 2018 18:48:18 -0700 (PDT)
Received: from mail-yw0-x229.google.com (mail-yw0-x229.google.com [IPv6:2607:f8b0:4002:c05::229]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id EF001130DC6 for <quic@ietf.org>; Thu, 21 Jun 2018 18:48:17 -0700 (PDT)
Received: by mail-yw0-x229.google.com with SMTP id r19-v6so1859849ywc.10 for <quic@ietf.org>; Thu, 21 Jun 2018 18:48:17 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=at2TzkJCIXPRpBPSvRcmRija1LtyRc0+K5PoKDCS3iY=; b=XjwmGzb+WKfGXCFxgcQ6PwKfOU2mqjAA34nE+QFgA8y/ZgrasjKCmmH4KUrHqPDXRX yooqHvCoyBhYQ6fXIjuOyzl/rdw1P6GklXC9IXUo1UpWRB+TzltQE2uQhxL87cMsUKmm mH6fBe1rM3EDlBvFc1bPuIK2YhJmIpIIa6wnjZlLFkpohLSH3kVWMN+5NOCjfefN4kny SzI+LwZ6d7EMKKXxp26YqfCrKsvsW+WZbcdzUT9OW39uEbkktwaF3jCa2jXz9K6NudhE UXHLcQApN3SgDJwtofxv83nJ6F6985Q4Xdmwjn58mqqojhgMN3diVkimLNFN9XNRyhS9 1GxQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=at2TzkJCIXPRpBPSvRcmRija1LtyRc0+K5PoKDCS3iY=; b=U96rjAlGSjkmj85rv6xKOUnWXUZckkidGRX8auZ2HtIeTLRZQNFPOXTvuWNaPBB2aL XLFGe0vbpynGq2k4YEuTVpIEIbI7n1BgnTFTKap/CvzpEk3ak7z4qNh5jRs6JMM7kxQN 66myFC+FhYtTLCFdbPpwdyRCX7Xi2Lv9fL4hdboaaRNMNyl2u8n0SqMLO8uH8Iwr/SkP YGcKKg/UyKc0V6Ehr1onG2gtfQgeGFw+FCTdYGKJhCiCpVKdYI42bRQ1gQKE5QlDp0Hk DYvNX95a1lGWTY4Wz/Z8WaJG686GhVTwh+T3k/6feuQEQK2vPz+/rjMxtBfDuHUKASIJ n2Xw==
X-Gm-Message-State: APt69E21ZwHEG9hl6B4dU831uCdq8uQZ+fCTXxXAejZb3WKUD/onmPKW 5FgKyHpQBuCnAFL3PmRizNtwBX98I14db6RV+nseog==
X-Google-Smtp-Source: ADUXVKIBRbJy8BDsZCBMLsJlN5A5Bd962MC2LQUzANbrj0nge9cfHcvVDjVTDEYjowXe0LQbuvvpK7X67c+NE9gQhpM=
X-Received: by 2002:a81:b3c2:: with SMTP id r185-v6mr12969195ywh.283.1529632096555; Thu, 21 Jun 2018 18:48:16 -0700 (PDT)
MIME-Version: 1.0
References: <1F436ED13A22A246A59CA374CBC543998B832414@ORSMSX111.amr.corp.intel.com> <20180611154244.GA27622@ubuntu-dmitri> <CACpbDcdxzRxeiN93kKoj__vo2TERm4QZKqaesL=jr4wQUN1gXA@mail.gmail.com> <1F436ED13A22A246A59CA374CBC543998B833B91@ORSMSX111.amr.corp.intel.com> <CABcZeBOjjRrX+AsXdgcUKpL=ciL8U_U1+WVAhQv-ZjwGxkQxYw@mail.gmail.com> <MWHPR21MB0638068EFA850328793E55F6B67C0@MWHPR21MB0638.namprd21.prod.outlook.com> <CACpbDcdbTKKEh8dcshWM6-7vq2hBFJC1myL1+H6etpMMjth+wg@mail.gmail.com> <CABkgnnV_thWcAi=AdwV+Za5rXywiUvtOYpsNNp1y7=RvL2MvWA@mail.gmail.com> <CAOYVs2qE=Tw_7eax9HwaESaQPMh7k3BSVV112d+pPeSfZ09EjQ@mail.gmail.com> <CABcZeBOCRHAuh44CrMH02UZ3Ar_2sa5M1c3LG_A-RPzXX+H+Yw@mail.gmail.com> <CAKcm_gOeZHR-BGJiqK=zQKqbgq=briQuH+fzHrkUYbhQx3B_sw@mail.gmail.com> <CANatvzyKv8EGVR-Z5WMDKbeuKHP791OynsTqX=+HriKBxFnafA@mail.gmail.com> <CAOYVs2oE6yawW04MVH1ApewSJ+0g9g2oMxCj+CU+butfiAe8kA@mail.gmail.com> <CANatvzxniU0AUEi5tuKzmX45uTUV6-y0JbqcdKTpu1J4WQR7JA@mail.gmail.com> <CAOYVs2p9vJrCVuXqGsR29rOGj=CNt1m7TcavGV9Kwk-9hA4sPQ@mail.gmail.com> <1F436ED13A22A246A59CA374CBC543998B83AB21@ORSMSX111.amr.corp.intel.com> <1F436ED13A22A246A59CA374CBC543998B83EC27@ORSMSX111.amr.corp.intel.com> <CAKcm_gMV4vXXW5jKwAR-cOT6OYpi6FL-mO9K=0GWL6WULjWNKA@mail.gmail.com> <1F436ED13A22A246A59CA374CBC543998B83EF15@ORSMSX111.amr.corp.intel.com> <CAOYVs2oynZuE43q1MVO3bBKTPCFg_T3pykS4e5p7DpSaSvmgtQ@mail.gmail.com> <1F436ED13A22A246A59CA374CBC543998B843873@ORSMSX111.amr.corp.intel.com>
In-Reply-To: <1F436ED13A22A246A59CA374CBC543998B843873@ORSMSX111.amr.corp.intel.com>
From: Ian Swett <ianswett@google.com>
Date: Thu, 21 Jun 2018 21:48:04 -0400
Message-ID: <CAKcm_gMb854+PLf7-PemtC_6oVSfEZLQZi9Zq3FEfx81iwfdZw@mail.gmail.com>
Subject: Re: Proposal to replace ACK block count with ACK length
To: "Deval, Manasi" <manasi.deval@intel.com>
Cc: Marten Seemann <martenseemann@gmail.com>, Kazuho Oku <kazuhooku@gmail.com>, Eric Rescorla <ekr@rtfm.com>, Jana Iyengar <jri.ietf@gmail.com>, Praveen Balasubramanian <pravb@microsoft.com>, IETF QUIC WG <quic@ietf.org>, Martin Thomson <martin.thomson@gmail.com>
Content-Type: multipart/alternative; boundary="000000000000c17d94056f3139c3"
Archived-At: <https://mailarchive.ietf.org/arch/msg/quic/Xo1rrhmi9YmYAz7cbmLgD8Ztrh4>
X-BeenThere: quic@ietf.org
X-Mailman-Version: 2.1.26
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, 22 Jun 2018 01:48:25 -0000
On Thu, Jun 21, 2018 at 7:08 PM Deval, Manasi <manasi.deval@intel.com> wrote: > I feel that the requirement to have every value valid is somewhat > academic. The length value provides much more value than the block count > This is a key point we disagree on. I see no value in a length field. I believe it having value is predicated on the idea that multi-core QUIC packet processing is a good idea? I fear efforts to multithread processing of a single QUIC packet are not only a waste of time, but also a potential source of correctness issues. In my experience, the CPU cost of sending is much higher than receiving, so I have a really difficult time imagining multi-core receive being worthwhile. and the fact that certain values can never be achieved is an inherent > property of the length. > > > > One interesting observation is that this property is not limited to > length. One can even make a similar argument about ACK block count. The > maximum number of ACK blocks that can be defined will not always have a > meaningful value. In out examples, 0,1,2,3 are all valid. If I set the > value of ACK block count to have lower two bits to be 11, the maximum value > is of ACK blocks is – 4611686018427387903. This is the same value of > largest acknowledged so if the ACK block count was set to this value, it > would still be meaningless. > > > > Thanks, > > Manasi > > > > > > > > *From:* Marten Seemann [mailto:martenseemann@gmail.com] > *Sent:* Tuesday, June 19, 2018 6:44 PM > *To:* Deval, Manasi <manasi.deval@intel.com> > *Cc:* Ian Swett <ianswett@google.com>; Kazuho Oku <kazuhooku@gmail.com>; > Eric Rescorla <ekr@rtfm.com>; Jana Iyengar <jri.ietf@gmail.com>; Praveen > Balasubramanian <pravb@microsoft.com>; IETF QUIC WG <quic@ietf.org>; > Martin Thomson <martin.thomson@gmail.com> > *Subject:* Re: Proposal to replace ACK block count with ACK length > > > > Hi Manasi, > > > > > The risk of disagreement between ack blocks and ack block count is same > as the risk of disagreement between ack blocks and ack length. Either way > this needs to be counted up while creating the ACK and counted down while > parsing it. The possibility of error is the same. Getting the ack block > count wrong is as problematic as getting the ack length wrong. Do you agree? > > > > I disagree. Let's take an example of an ACK frame with one ACK range, that > needs a 2 byte varint to represent the First ACK Block and another 2 byte > varint to represent the Gap. > > With your proposal: > > 1. The values 0 and 1 are invalid, since the length fields itself is > included in the length. > 2. The values 2, 3, ..., (2 + len(LargestAcknowledged) > + len(AckDelay)) - 1 are invalid, since the length needs to include the > Largest Acknowledged and the Ack Delay. > 3. The value 2 + len(LargestAcknowledged) + len(AckDelay) would be the > first valid value, and correspond to an ACK frame with no blocks. > 4. The value 2 + len(LargestAcknowledged) + len(AckDelay) + 1 is > invalid, since it would cut the varint for the First ACK Block > 5. The value 2 + len(LargestAcknowledged) + len(AckDelay) + 2 is > invalid, since it would cut the frame after the First ACK Block (but every > block must be followed by a gap length) > 6. The value 2 + len(LargestAcknowledged) + len(AckDelay) + 3 is > invalid, since it would cut the varint for the Gap > 7. Finally, the value 2 + len(LargestAcknowledged) + len(AckDelay) + > 4 is valid > > There are *a lot* of invalid values that you can encode into the ACK > length field. More importantly, *none* of these error cases exists with the > current frame format. > > The *only* error case that can occur with our current format is that the > packet is too short for the number of ACK blocks that are supposed to > contained in the frame. This can occur with your proposal as well (in > addition to the error cases listed above). > > > > My concern is not that it's impossible or even particularly hard to catch > these errors, but I dislike the property that some (in fact, most) > encodable values are invalid. > > > > Best, > > Marten > > > > > > On Wed, Jun 20, 2018 at 3:21 AM Deval, Manasi <manasi.deval@intel.com> > wrote: > > Hi Ian, > > > > Here is another attempt to solve the objections you raised: > > > > >I'm not a fan of this proposal, because I think it is impractical to drop > the number of ack blocks, because with the ECN proposal it becomes > impractically complex to parse. > > Is there a reason the proposal from Christian does not solve this problem? > > > > >If we don't remove the number of ack blocks, then the ack frame is > larger, but I don't think the extra size field is useful for most > implementations. Also, it means the length can disagree with the actual > length, which add complexity and the possibility of writing error-prone > code. The idea of someone offloading ack processing and then proceeding to > trust the length seems like someone could get wrong and cause some > concerning issues. > > The risk of disagreement between ack blocks and ack block count is same as > the risk of disagreement between ack blocks and ack length. Either way this > needs to be counted up while creating the ACK and counted down while > parsing it. The possibility of error is the same. Getting the ack block > count wrong is as problematic as getting the ack length wrong. Do you agree? > > > > >My experience is multithreaded packet processing is more cost and work > than it's worth. Sure you can't fill a 100G NIC with one connection, but > that seems like an academic problem, not one for workloads I've seen. > Typically the extra cost of multithreading outweighs its value. > > The value is two fold – pre-processing and multi-threading. If we > pre-process the received packets such that ACKs and streams can be > coalesced, the receive side can indicate a large chunk of information > though the kernel, reducing the cost of system call and protocol > overhead. This is the same concept as UDP segmentation taken a step further > on receive side. After this chunk is indicated into the QUIC protocol, the > protocol may process stream and ACK in parallel. While folks may or may not > utilize this, there is an advantage here. > > > > Thanks, > > Manasi > > > > > > *From:* Ian Swett [mailto:ianswett@google.com] > *Sent:* Tuesday, June 19, 2018 11:26 AM > *To:* Deval, Manasi <manasi.deval@intel.com> > *Cc:* Marten Seemann <martenseemann@gmail.com>; Kazuho Oku < > kazuhooku@gmail.com>; Eric Rescorla <ekr@rtfm.com>; Jana Iyengar < > jri.ietf@gmail.com>; Praveen Balasubramanian <pravb@microsoft.com>; IETF > QUIC WG <quic@ietf.org>; Martin Thomson <martin.thomson@gmail.com> > > > *Subject:* Re: Proposal to replace ACK block count with ACK length > > > > I'm still not interested in this change, for the reasons I stated above. > > > > On Tue, Jun 19, 2018 at 2:21 PM Deval, Manasi <manasi.deval@intel.com> > wrote: > > Hi All, > > > > Do we have agreement here to create a new PR? > > > > Thanks, > > Manasi > > > > *From:* Deval, Manasi > *Sent:* Sunday, June 17, 2018 2:25 PM > *To:* Marten Seemann <martenseemann@gmail.com>; Kazuho Oku < > kazuhooku@gmail.com> > *Cc:* Ian Swett <ianswett=40google.com@dmarc.ietf.org>; Eric Rescorla < > ekr@rtfm.com>; Jana Iyengar <jri.ietf@gmail.com>; Praveen Balasubramanian > <pravb@microsoft.com>; IETF QUIC WG <quic@ietf.org>; Martin Thomson < > martin.thomson@gmail.com> > *Subject:* RE: Proposal to replace ACK block count with ACK length > > > > Hi All, > > > > I have made a list of objections to the proposal and the solutions to > those objections discussed on this thread. > > > > a. Co-existence of length field with ECN field and ACK blocks. > > > > Christian suggested to move the ECN fields to precede the ACK blocks. This > is an elegant solution. Parsing entire list of ACK blocks to review ECN > bits would have been annoying, even though it can work. > > > > b. There are two cases to be parsed – entire ACK and parse ACK to > identify length. There are some reservations when ACK parsing gets harder > for the case where the entire header needs to be parsed. > > > > Agreement from several folks here. In the original ACK defined in draft 12 > of the slide, one would count down number of ACK blocks to get to the end > of the packet. In the proposal I made, one would count down the length to > identify the end of the packet. The logic is very similar in cycle count > and complexity. Several folks also commented to this effect. > > > > c. Multi-threaded packet processing > > > > I would expect that there are 10s of 1000s of connections in use at any > time for a server with a high speed link. Multi-threading to handle each of > these flows / connections in parallel is necessity to be able to support > large number of connections on a high speed link. Tx segmentation, Rx > coalescing are well known strategies to reduce the processing cost. In > initial stages, code is often written as a single-threaded and then > re-factored to parallelize cycle intensive operations. In order to allow > this protocol to scale in future, I would suggest we do not preclude this > case. > > > > d. Increase in ACK size by 1 byte. > > > > I do not see this as a serious issue but if folks but we can consider > making this a varint, if others have strong feelings about it. It’s a > trade-off : 2 reads to save 1 byte. > > > > e. Every encodable value should be valid > > Not every length will be valid. This is inherent to lengths. This same > issue ails the ‘payload length’ in QUIC header. Not only does the issue > exist for small values, it also applies to large values since data stream > will be sent after crypto negotiation. E.g. - how does one craft a > payload with 62 bit payload length in a large header? > > > > > > Thanks, > > Manasi > > > > > > *From:* Marten Seemann [mailto:martenseemann@gmail.com > <martenseemann@gmail.com>] > *Sent:* Sunday, June 17, 2018 6:59 AM > *To:* Kazuho Oku <kazuhooku@gmail.com> > *Cc:* Ian Swett <ianswett=40google.com@dmarc.ietf.org>; Eric Rescorla < > ekr@rtfm.com>; Jana Iyengar <jri.ietf@gmail.com>; Praveen Balasubramanian > <pravb@microsoft.com>; IETF QUIC WG <quic@ietf.org>; Martin Thomson < > martin.thomson@gmail.com>; Deval, Manasi <manasi.deval@intel.com> > *Subject:* Re: Proposal to replace ACK block count with ACK length > > > > Maybe it's specific to Go, but I'm using a single io.Reader for the whole > packet, so as long as the packet payload is long enough, the varint parsing > will not fail. > > I don't think that specifics of programming languages matter here though, > and I'm sure both frame formats can be reasonably implemented in C as well > as in Go. The reasons I'm opposed to Manasi's proposal are that it moves us > away from the principle that only reasonable values should be encodable, > and that it increases the size of the ACK frame, for the questionable > benefit of being able to parallelise the frame parser. > > > > On Sun, Jun 17, 2018 at 8:48 PM Kazuho Oku <kazuhooku@gmail.com> wrote: > > 2018-06-17 22:36 GMT+09:00 Marten Seemann <martenseemann@gmail.com>: > > At least for my implementation, parsing doesn't become easier, it becomes > > more complex with this proposal. My varint-parser always consumes as many > > bytes as the varint requires, so after parsing a varint, I'd have to > > introduce an additional check that this didn't overflow the ACK length > (e.g. > > consider that I parsed the ACK frame so far that only 2 bytes are > remaining > > according to ACK length field, but the next varint is 4 bytes long). > > Isn't your varint parser checking that it has not (or will not) run > across the end of the packet payload for every ACK block it parses? > I'd assume that you would be doing that, because I think that is > necessary to avoid buffer overrun. > > What I am saying that that check could be converted to a overrun check > against the end of the "frame payload", and that checking the > remaining block count becomes unnecessary, in case we replace ACK > Block Count with ACK Frame Length. > > > > > In general, we've been moving the wire image towards making every > encodable > > value valid. This proposal moves us away from that principle: > > * some small values are always invalid (the length can never be between 0 > > and 3) > > * a lot of intermediate values are invalid (if the boundary falls inside > a > > varint, as described above) > > Both these cases can't occur with the current ACK frame format. > > > > On Sun, Jun 17, 2018 at 7:54 PM Kazuho Oku <kazuhooku@gmail.com> wrote: > >> > >> 2018-06-17 8:34 GMT+09:00 Ian Swett > >> <ianswett=40google.com@dmarc.ietf.org>: > >> > I'm not a fan of this proposal, because I think it is impractical to > >> > drop > >> > the number of ack blocks, because with the ECN proposal it becomes > >> > impractically complex to parse. > >> > >> For the ECN proposal, as Christian has suggested, we can move the ECN > >> counters before the ACK blocks. Then, it would not be complex to > >> parse. > >> > >> And my view is that parsing becomes easier if we replace ACK Block > >> Count with ACK Frame Length. > >> > >> Now, with ACK Block Count, we need to check the remaining number of > >> blocks and the remaining space in the packet payload for every block > >> that we parse. Failing to check either leads to a bug or a security > >> issue. > >> > >> If we switch to ACK Frame Length, we need to only check the remaining > >> space in the frame. > >> > >> I think that this is the biggest benefit of replacing ACK Block Count > >> with ACK Frame Length. OTOH the downside is that you need extra one to > >> two bits (one if the size of block / gap is expected to be below 65, > >> two if they are expected to be above that) for encoding ACK Frame > >> Length compared to ACK Block Count. > >> > >> > >> > >> Having said that, I honestly wonder if all the frames could have it's > >> length being encoded (either explicitly or either as a signal that > >> says "to the end of the packet"). Consider something like below: > >> > >> |0| frame-type (7) | frame-payload-length (i) | frame-payload (*) | > >> or > >> |1| frame-type (7) | frame-payload (*) | > >> > >> When MSB of the first octet set to zero, the length of the frame > >> payload is designated by the varint that immediately follows the frame > >> type. > >> When MSB of the first octet set to one, the length of the frame > >> payload spans to the end of the packet. > >> > >> In this encoding, we can always omit the Length field of a STREAM > >> frame. So the overhead for carrying stream data will be indifferent in > >> practice. > >> > >> For the ACK frame, we can omit the ACK Block Count field. And the > >> overhead will be one to two bits if the ACK frame is sent in the > >> middle of the packet (thereby using the encoding with explicit frame > >> payload length), or one octet or more shorter if ACK is the last frame > >> of the packet. > >> > >> We are likely to see increase of overhead for most of the other types > >> of frames, but I do not think that would be an issue considering that > >> they will be far seldom seen compared to STREAMs and ACKs. > >> > >> To summarize, my anticipation is that we can make all the frames > >> self-contained (i.e. the length can be determined without the > >> knowledge of how each frame is encoded) without any overhead, if we > >> agree on making the frame type space 1 bit smaller. > >> > >> Finally, the biggest benefit of using a self-contained encoding of > >> frames is that we would have the ability to introduce new optional > >> frames without negotiation. By making the frames self-contained, QUIC > >> endpoints will have the freedom of ignoring the frames that they do > >> not understand. > >> > >> Being able to send QUIC frames defined in extensions without > >> negotiating using Transport Parameters will be a win in both terms of > >> security (because clients' TP is sent in clear) and flexibility > >> (because we will be possible to send the extensions before we figure > >> out whether the peer supports that extension). > >> > >> > If we don't remove the number of ack blocks, then the ack frame is > >> > larger, > >> > but I don't think the extra size field is useful for most > >> > implementations. > >> > Also, it means the length can disagree with the actual length, which > add > >> > complexity and the possibility of writing error-prone code. The idea > of > >> > someone offloading ack processing and then proceeding to trust the > >> > length > >> > seems like someone could get wrong and cause some concerning issues. > >> > > >> > My experience is multithreaded packet processing is more cost and work > >> > than > >> > it's worth. Sure you can't fill a 100G NIC with one connection, but > >> > that > >> > seems like an academic problem, not one for workloads I've seen. > >> > Typically > >> > the extra cost of multithreading outweighs its value. > >> > > >> > To be clear, I don't think this is an awful idea, but I also don't see > >> > the > >> > value and it adds complexity. I read Manasi's email, but I don't > think > >> > I > >> > understand why any of those matter in practice. > >> > > >> > On Sat, Jun 16, 2018 at 4:13 PM Eric Rescorla <ekr@rtfm.com> wrote: > >> >> > >> >> On Fri, Jun 15, 2018 at 6:46 PM, Marten Seemann > >> >> <martenseemann@gmail.com> > >> >> wrote: > >> >>> > >> >>> This proposal increases the size of the ACK frame by 1 byte in the > >> >>> common > >> >>> case (less than 63 ACK ranges), since the ACK length field here > always > >> >>> consumes 2 bytes, whereas the ACK Block Count is a variable-length > >> >>> integer. > >> >>> Considering how much work we put into minimising the size of the > >> >>> frames, > >> >>> this feels like a step in the wrong direction.. > >> >>> > >> >>> Regarding the processing cost, I agree with Dmitri. Handling an ACK > >> >>> frame > >> >>> requires looping over and making changes to a data structure that > >> >>> keeps > >> >>> track of sent packets. This is much more expensive than simply > parsing > >> >>> a > >> >>> bunch of varints in the ACK frame. It seems unlikely that a > >> >>> multi-threaded > >> >>> packet parser would offer any real-world performance benefits. > >> >> > >> >> > >> >> I don't want to overstate the benefit here, but my point isn't that > >> >> parsing is expensive but that if you want to have a multithreaded > >> >> packet > >> >> processing system, then it's nice to have a simpler data structure > (the > >> >> unparsed ACK block) to hand to the ACK processing thread. > >> >> > >> >> -Ekr > >> >> > >> >> > >> >>> > >> >>> On Sat, Jun 16, 2018 at 6:19 AM Martin Thomson > >> >>> <martin.thomson@gmail.com> > >> >>> wrote: > >> >>>> > >> >>>> When we discussed this before, some people observed that this > creates > >> >>>> a need to encode in two passes. That's the trade-off here. (Not > >> >>>> expressing an opinion.) > >> >>>> On Fri, Jun 15, 2018 at 3:51 PM Jana Iyengar <jri.ietf@gmail.com> > >> >>>> wrote: > >> >>>> > > >> >>>> > I don't have a strong opinion on this. I'm certainly not opposed > to > >> >>>> > it. > >> >>>> > Does anyone have a strong opposition? > >> >>>> > > >> >>>> > On Fri, Jun 15, 2018 at 3:10 PM Praveen Balasubramanian > >> >>>> > <pravb@microsoft.com> wrote: > >> >>>> >> > >> >>>> >> I agree as well since this can help reduce per packet processing > >> >>>> >> overhead. ACKs are going to be the second most common frame type > >> >>>> >> so no > >> >>>> >> objections to special casing. > >> >>>> >> > >> >>>> >> > >> >>>> >> > >> >>>> >> From: QUIC [mailto:quic-bounces@ietf.org] On Behalf Of Eric > >> >>>> >> Rescorla > >> >>>> >> Sent: Friday, June 15, 2018 9:11 AM > >> >>>> >> To: Deval, Manasi <manasi.deval@intel.com> > >> >>>> >> Cc: Jana Iyengar <jri.ietf@gmail.com>; QUIC WG <quic@ietf.org> > >> >>>> >> Subject: Re: Proposal to replace ACK block count with ACK length > >> >>>> >> > >> >>>> >> > >> >>>> >> > >> >>>> >> I agree with Manasi here. This change would allow ack frame > >> >>>> >> parsing > >> >>>> >> to be more self-contained, which is an advantage for the parser > >> >>>> >> and also > >> >>>> >> potentially for parallelism (because you can quickly find the > >> >>>> >> frame and then > >> >>>> >> process it in parallel). > >> >>>> >> > >> >>>> >> > >> >>>> >> > >> >>>> >> -Ekr > >> >>>> >> > >> >>>> >> > >> >>>> >> > >> >>>> >> > >> >>>> >> > >> >>>> >> On Mon, Jun 11, 2018 at 5:22 PM, Deval, Manasi > >> >>>> >> <manasi.deval@intel.com> wrote: > >> >>>> >> > >> >>>> >> In general, varints require some specific logic for parsing. To > >> >>>> >> skip > >> >>>> >> over any header, I have to read every single varint. As the code > >> >>>> >> sees Stream > >> >>>> >> and ACK headers most frequently, that is my focus. The Stream > >> >>>> >> frame has a > >> >>>> >> length in its third field. > >> >>>> >> > >> >>>> >> > >> >>>> >> > >> >>>> >> ACK parsing, however, needs 6 + 2*num_blocks reads to identify > >> >>>> >> length. There are two reads each for ‘largest acknowledged’, > ‘ACK > >> >>>> >> delay’ and > >> >>>> >> ‘ACK block count’. The pain point is the total number of cycles > >> >>>> >> parse an > >> >>>> >> ACK. If I am processing 10M pps, where 10% - 30% of the packets > >> >>>> >> have a > >> >>>> >> piggybacked ACK, these cycles becomes a significant bottleneck. > >> >>>> >> > >> >>>> >> > >> >>>> >> > >> >>>> >> Thanks, > >> >>>> >> > >> >>>> >> Manasi > >> >>>> >> > >> >>>> >> > >> >>>> >> > >> >>>> >> > >> >>>> >> > >> >>>> >> > >> >>>> >> > >> >>>> >> From: QUIC [mailto:quic-bounces@ietf.org] On Behalf Of Jana > >> >>>> >> Iyengar > >> >>>> >> Sent: Monday, June 11, 2018 3:11 PM > >> >>>> >> To: Deval, Manasi <manasi.deval@intel.com>; QUIC WG > >> >>>> >> <quic@ietf.org> > >> >>>> >> Subject: Re: Proposal to replace ACK block count with ACK length > >> >>>> >> > >> >>>> >> > >> >>>> >> > >> >>>> >> You're right that we no longer have the ability to skip an ACK > >> >>>> >> frame, > >> >>>> >> and this crept in when we moved to varints. > >> >>>> >> > >> >>>> >> I believe your problem though is generally true of most frames > not > >> >>>> >> just ACKs, since ids, packet numbers, and numbers in all frames > >> >>>> >> are now all > >> >>>> >> varints. To skip any frame, you'll need to parse the varint > fields > >> >>>> >> in those > >> >>>> >> frames. If you have logic to process and skip varints, then > >> >>>> >> skipping the ack > >> >>>> >> block section is merely repeating this operation (2*num_block+1) > >> >>>> >> times. Do > >> >>>> >> you see specific value in skipping ACK frames over the other > >> >>>> >> control frames? > >> >>>> >> > >> >>>> >> > >> >>>> >> > >> >>>> >> > >> >>>> >> > >> >>>> >> On Mon, Jun 11, 2018 at 8:43 AM Dmitri Tikhonov > >> >>>> >> <dtikhonov@litespeedtech..com> wrote: > >> >>>> >> > >> >>>> >> On Mon, Jun 11, 2018 at 03:33:35PM +0000, Deval, Manasi wrote: > >> >>>> >> > - Moving the ACK length to the front of the ACK allows > >> >>>> >> > the > >> >>>> >> > flexibility of either reading the entire ACK or > reading > >> >>>> >> > the > >> >>>> >> > first 16 bits and skipping over the length. This is a > >> >>>> >> > useful > >> >>>> >> > feature for the case where ACK processing is split > into > >> >>>> >> > multiple layers. Depending on the processor this is > run > >> >>>> >> > on, > >> >>>> >> > there are different advantages - > >> >>>> >> > >> >>>> >> Just a note. In my experience, the cost of parsing an ACK frame > >> >>>> >> is > >> >>>> >> negligible compared to the cost of processing an ACK frame: that > >> >>>> >> is, > >> >>>> >> poking at various memory locations to discard newly ACKed > packets. > >> >>>> >> > >> >>>> >> - Dmitri. > >> >>>> >> > >> >>>> >> > >> >>>> > >> >> > >> > > >> > >> > >> > >> -- > >> Kazuho Oku > > > > -- > Kazuho Oku > >
- Re: Proposal to replace ACK block count with ACK … Mikkel Fahnøe Jørgensen
- Re: Proposal to replace ACK block count with ACK … Eric Rescorla
- Re: Proposal to replace ACK block count with ACK … Kazuho Oku
- RE: Proposal to replace ACK block count with ACK … Nick Banks
- Re: Proposal to replace ACK block count with ACK … Ian Swett
- RE: Proposal to replace ACK block count with ACK … Deval, Manasi
- Re: Proposal to replace ACK block count with ACK … Mikkel Fahnøe Jørgensen
- Re: Proposal to replace ACK block count with ACK … Ian Swett
- Re: Proposal to replace ACK block count with ACK … Mirja Kühlewind
- Re: Proposal to replace ACK block count with ACK … Marten Seemann
- RE: Proposal to replace ACK block count with ACK … Deval, Manasi
- RE: Proposal to replace ACK block count with ACK … Deval, Manasi
- Re: Proposal to replace ACK block count with ACK … Eric Rescorla
- Re: Proposal to replace ACK block count with ACK … Ian Swett
- RE: Proposal to replace ACK block count with ACK … Mikkel Fahnøe Jørgensen
- RE: Proposal to replace ACK block count with ACK … Deval, Manasi
- RE: Proposal to replace ACK block count with ACK … Deval, Manasi
- Re: Proposal to replace ACK block count with ACK … Marten Seemann
- Re: Proposal to replace ACK block count with ACK … Kazuho Oku
- Re: Proposal to replace ACK block count with ACK … Marten Seemann
- Re: Proposal to replace ACK block count with ACK … Kazuho Oku
- Re: Proposal to replace ACK block count with ACK … Ian Swett
- Re: Proposal to replace ACK block count with ACK … Eric Rescorla
- Re: Proposal to replace ACK block count with ACK … Kazuho Oku
- Re: Proposal to replace ACK block count with ACK … Eggert, Lars
- Re: Proposal to replace ACK block count with ACK … Christian Huitema
- Re: Proposal to replace ACK block count with ACK … Kazuho Oku
- Re: Proposal to replace ACK block count with ACK … Marten Seemann
- Re: Proposal to replace ACK block count with ACK … Martin Thomson
- Re: Proposal to replace ACK block count with ACK … Jana Iyengar
- RE: Proposal to replace ACK block count with ACK … Praveen Balasubramanian
- Re: Proposal to replace ACK block count with ACK … Eric Rescorla
- Re: Proposal to replace ACK block count with ACK … Mikkel Fahnøe Jørgensen
- RE: Proposal to replace ACK block count with ACK … Deval, Manasi
- Re: Proposal to replace ACK block count with ACK … Dmitri Tikhonov
- Proposal to replace ACK block count with ACK leng… Deval, Manasi
- Re: Proposal to replace ACK block count with ACK … Jana Iyengar
- RE: Proposal to replace ACK block count with ACK … Deval, Manasi
- Re: Proposal to replace ACK block count with ACK … Subodh Iyengar
- Re: Proposal to replace ACK block count with ACK … Deval, Manasi
- RE: Proposal to replace ACK block count with ACK … Deval, Manasi
- Re: Proposal to replace ACK block count with ACK … Mirja Kühlewind