LGTM1

On Wednesday, February 14, 2024 at 2:36:10 AM UTC+1 Nidhi Jaju wrote:

On Wed, Feb 14, 2024 at 2:48 AM James Hartig <fastest...@gmail.com> wrote:

My employer ran into the window size during our pre-production validation 
and it was difficult to debug since it was working in cURL, the zstd CLI, 
and only presented itself on certain URLs. I appreciate Nidhi responding to 
our issue so quickly and updating Chrome to have a more helpful error 
message in the future. The Go package we use already updated their default 
<https://github.com/klauspost/compress/pull/913> to 8MB (without any 
awareness to Chrome's size) which should help future users of that package 
but there might be other packages out there that might not have a low 
enough default. The updated Chrome error message will help but only if you 
run into that error message when testing; which might not if you happen to 
be testing with small responses. I'm not sure where developers should be 
looking to be aware of the window size. Does it make sense to mention in 
the Chrome Status entry? If the spec is updated that might be good enough 
but I just wanted to discuss other avenues that might be more 
developer-aware.


Thank you, I've included these details about the window size limits under 
the "Interoperability and Compatibility Risks" section in the ChromeStatus 
entry. 

On Tue, Feb 13, 2024 at 6:43 PM Yoav Weiss (@Shopify) <
yoavwe...@chromium.org> wrote:



On Tue, Feb 13, 2024 at 9:29 AM Nidhi Jaju <nidhij...@chromium.org> wrote:



On Tue, Feb 13, 2024 at 4:18 PM Yoav Weiss (@Shopify) <
yoavwe...@chromium.org> wrote:

Thanks for working on this!! This is extremely exciting!

On Tue, Feb 13, 2024 at 1:11 AM Nidhi Jaju <nidhij...@chromium.org> wrote:

Contact emails

nidhij...@chromium.org

Explainer

https://docs.google.com/document/d/1aDyUw4mAzRdLyZyXpVgWvO-
eLpc4ERz7I_7VDIPo9Hc/edit?usp=sharing

Specification

https://datatracker.ietf.org/doc/html/rfc8878

Design docs

https://docs.google.com/document/d/14dbzMpsYPfkefAJos124uPrlkvW7j
yPJhzjujSWws2k/edit?usp=sharing

Summary

Zstandard, or “zstd”, is a data compression mechanism described in RFC8878. 
It is a fast lossless compression algorithm, targeting real-time 
compression scenarios at zlib-level and better compression ratios. The 
"zstd" token was added as an IANA-registered Content-Encoding token as per 
https://datatracker.ietf.org/doc/html/rfc8878#name-content-encoding. 

Adding support for "zstd" as a Content-Encoding will help load pages faster 
and use less bandwidth, and spend less time and CPU/power on compression on 
our servers, resulting in reduced server costs.

Blink component

Internals>Network 
<https://bugs.chromium.org/p/chromium/issues/list?q=component:Internals%3ENetwork>

TAG review

https://github.com/w3ctag/design-reviews/issues/930 

TAG review status

Pending

Risks
Interoperability and Compatibility

Servers that have a broken implementation of zstd might exist, but the risk 
of this is small. Additionally, middleware and middleboxes like virus 
checkers that intercept HTTPS connections might not support zstd, but might 
fail to remove it from the Accept-Encoding header in the request.

Another known risk is interoperability between clients that support zstd 
regarding window frame sizes. In Chrome, we limit the window frame size to 
8MB to prevent excessive memory usage, but this limit does not exist in 
curl and when using zstd directly. We have seen very few sites that use a 
window size larger than 8MB which causes decoding errors, but we have added 
new net error codes and debugging messages to help them understand what to 
do in this situation.


I know we discussed 
<https://w3c.github.io/web-performance/meetings/2023/2023-09-TPAC/index.html#h.xn2d3li0b8op>
 
this at length at the WebPerfWG. 
Can you summarize developments and/or findings since that discussion on 
that front?
Should we expect the default output of CLI tools to be compatible with what 
we want to ship here?
Should we expect interoperability between Chromium and e.g. curl?


We've been discussing it with the zstd team at Meta at https://github.com/
facebook/zstd/issues/2713. The plan is to take it to the HTTP WG at the 
IETF and either file an errata or publish a new document with more strict 
window size guidelines. The zstd CLI tool currently supports up to 8MB as a 
default, so the same limit. The library will use 128MB by default, however, 
and Curl currently supports up to 128MB windows. We expect those defaults 
to change to match any spec changes. In practice, we've seen very limited 
reports of sites running into this limit, and we've added helpful messages 
in Chromium to guide anyone who does run into it.


Thanks! Pushing that limit into the standard and having curl (and other 
tools) follow that makes sense and seems important.

Thinking out loud, the main risk here is for folks to be testing their 
content outside of Chromium (e.g. with curl) and then have that content 
break in Chromium. At the same time if content is tested in Chromium, it 
will work in another client that supports larger windows.
So the (seemingly small) risk here is one we take on ourselves, rather than 
risk we externalize on the ecosystem.


Yes, that sounds right. We'll continue to push to standardize this behavior 
across the ecosystem.
 



 



Gecko: Positive (https://github.com/mozilla/standards-positions/issues/775)

WebKit: Positive (https://github.com/WebKit/standards-positions/issues/168)

Web developers: Positive (https://crbug.com/1246971) Meta (Yann and Felix) 
and Akamai (Nic) are positive about zstd content-encoding on the browser. 
Meta has collaborated with us to improve the compression ratios for Meta 
origins during the experiment and is seeing positive user-level results. 
Alibaba is also supportive of shipping zstd support as they saw massive 
savings on their origins in terms of server CPU cost.

Other signals:

Ergonomics

While both Zstandard and Brotli are clear wins over gzip content-encoding, 
which of Zstandard or Brotli to use depends on many factors, and site 
authors may need to experiment to identify the optimal choice for their 
content.

Zstandard uses more memory for decompression than gzip. However, this is 
also true for Brotli, and we haven't seen any problems in practice.

Activation

The "zstd" Content-Encoding is not as widely supported by HTTP servers as 
gzip. Of the top 5 web servers, Nginx has a third-party module, which 
should also work for OpenResty (untested). Apache, IIS, and LiteSpeed 
appear to have no support. Explicit server support is often only necessary 
for dynamic content. For static (pre-compressed) content, Zstandard can 
often be supported just by configuration.

Only one public CDN is known to be able to compress Zstandard itself, and 
some CDN's may require custom configuration to pass-through Zstandard 
correctly.

Zstd support is not particularly difficult to implement for a server that 
already implements multiple content encodings. The C implementation has a 
straightforward API and there are implementations for many other languages. 
There is also a lively community of Zstandard enthusiasts which should help 
accelerate adoption.

Security

CRIME <https://en.wikipedia.org/wiki/CRIME> and BREACH 
<https://en.wikipedia.org/wiki/BREACH> mean that the resource being 
compressed can be considered readable by the document deploying them. That 
is bad if any of them contains information that the document cannot already 
obtain by other means. An attacker may provide correctly formed compressed 
frames with unreasonable memory requirements, and dictionaries may interact 
unexpectedly with a decoder, leading to possible memory or other 
resource-exhaustion attacks. It is possible to store arbitrary user 
metadata in skippable frames, so they can be used as a watermark to track 
the path of the compressed payload. It is important to note that these 
concerns apply to all compression formats, not just zstd.

To mitigate these risks, similar to Brotli, we'll be advertising support 
for "zstd" encoding only if transferred data is opaque to proxies, to 
ensure that resources don't contain private data that the origin cannot 
read otherwise.


I'm not sure what that means. Can you elaborate on that?


This essentially means that, like Brotli, Zstd is only available in secure 
contexts 
<https://source.chromium.org/chromium/chromium/src/+/main:net/http/http_request_headers.cc;l=284-290;drc=4787fce6c51383f5631643ac3d14cc512d656de6>
 
i.e. over https.


Limiting zstd support to secure contexts makes perfect sense. However I 
believe the reason we're doing that for brotli is more around compatibility 
concerns with old network-based proxies 
<https://issues.chromium.org/issues/40930163> that aren't ready for 
non-gzip content-encodings. 
I don't think secure contexts do much to protect against BREACH if 
attackers can control parts of the response. At the same time, I don't know 
that we're doing anything on that front for other compression formats, so 
that seems fine.

 

 


Adding zstd to third_party/ in Chromium adds a large new code surface that 
processes untrusted data, which inevitably brings risks of new security 
holes. However, this is mitigated by the extensive fuzzing and security 
analysis done on zstd by Google and other community members.

Furthermore, zstd is implemented in C, which is not a memory-safe language, 
and the network service is not yet sandboxed on all platforms.

WebView application risks

Does this intent deprecate or change behavior of existing APIs, such that 
it has potentially high risk for Android WebView-based applications?

Apps which use a WebView to display content from Meta's servers will 
suddenly start using Zstandard. Since we've already extensively tested our 
implementation against Meta's servers in Chrome, no problems are expected. 
There is a killswitch. No special treatment should be needed.


Debuggability

No special support needed.

Zstd content-encoding support is exposed to the devtools protocol, so 
developers are able to override it and view the headers from the inspector.

A new net error has been added for decoding errors related to window frame 
size.

Will this feature be supported on all six Blink platforms (Windows, Mac, 
Linux, ChromeOS, Android, and Android WebView)?

Yes

Is this feature fully tested by web-platform-tests 
<https://chromium.googlesource.com/chromium/src/+/main/docs/testing/web_platform_tests.md>
?

Yes (https://wpt.fyi/results/fetch/content-encoding/zstd 
<https://wpt.fyi/results/fetch/content-encoding/zstd?label=experimental&label=master&aligned>
) 

Flag name on chrome://flags

enable-zstd-content-encoding

Finch feature name

ZstdContentEncoding

Requires code in //chrome?

False

Tracking bug

https://bugs.chromium.org/p/chromium/issues/detail?id=1246971

Launch bug

https://launch.corp.google.com/launch/4266275

Measurement

https://chromestatus.com/metrics/feature/timeline/popularity/4629

Adoption plan

In our experimental group, around 1% of responses use "zstd" 
content-encoding. Given the significant benefits of zstandard over gzip, 
we'd like to see it increase to 10% within 2 years.

Estimated milestones

Shipping on desktop

123

DevTrial on desktop

117

Shipping on Android

123

DevTrial on Android

117

Shipping on WebView

123


Anticipated spec changes

Open questions about a feature may be a source of future web compat or 
interop issues. Please list open issues (e.g. links to known github issues 
in the project for the feature specification) whose resolution may 
introduce web compat/interop risk (e.g., changing to naming or structure of 
the API in a non-backward-compatible way).

The current standard, RFC8878, doesn't require a limit on the window size 
used by HTTP servers when compressing Zstandard. An update of some form 
will be needed to ensure interoperability.

Link to entry on the Chrome Platform Status

https://chromestatus.com/feature/6186023867908096

Links to previous Intent discussions

Intent to Prototype: https://groups.google.com/a/chromium.org/g/blink-dev/c/
GDsI0Hw-jYk/m/Yc5QZWD-AwAJ

Intent to Experiment: https://groups.google.com/a/
chromium.org/g/blink-dev/c/I6IWfl95gRU


This intent message was generated by Chrome Platform Status 
<https://chromestatus.com/>.


-- 
You received this message because you are subscribed to the Google Groups 
"blink-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an 
email to blink-dev+unsubscr...@chromium.org.
To view this discussion on the web visit https://groups.google.com/a/
chromium.org/d/msgid/blink-dev/CAMZNYAN7VRca4VfRqP7pi%
2BnqwDuor4ZVjF9yDNH1mZcXteQURw%40mail.gmail.com 
<https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAMZNYAN7VRca4VfRqP7pi%2BnqwDuor4ZVjF9yDNH1mZcXteQURw%40mail.gmail.com?utm_medium=email&utm_source=footer>
.

-- 
You received this message because you are subscribed to the Google Groups 
"blink-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to blink-dev+unsubscr...@chromium.org.
To view this discussion on the web visit 
https://groups.google.com/a/chromium.org/d/msgid/blink-dev/f823c2bc-f224-4ff7-9f78-e9eba9a4949cn%40chromium.org.

Reply via email to