- From: Adrien de Croy <adrien@qbik.com>
- Date: Wed, 30 Apr 2014 23:29:02 +0000
- To: "Amos Jeffries" <squid3@treenet.co.nz>, "ietf-http-wg@w3.org" <ietf-http-wg@w3.org>
maybe it needs to be a different header. since a C-E gzipped version of the same URI is strictly speaking a different entity (different E-tag etc) you can't arbitrarily swap between them. however what's the goal here - simply to increase the use of compression correct? Why mess with C-E or any entity headers? What about another way of effectively doing T-E, but that doesn't need to be computed each time. Like Message-Encoding or something but which can be cached by the O-S or edge server or proxy or whatever, and it retains the original entity headers. Maybe that is just T-E. Adrien ------ Original Message ------ From: "Amos Jeffries" <squid3@treenet.co.nz> To: "ietf-http-wg@w3.org" <ietf-http-wg@w3.org> Sent: 1/05/2014 1:45:53 a.m. Subject: Re: Making Implicit C-E work. >On 30/04/2014 10:26 p.m., Roberto Peon wrote: >> On Wed, Apr 30, 2014 at 2:35 AM, Roland Zink <roland@zinks.de> wrote: >> >>> On 30.04.2014 08:44, Roberto Peon wrote: >>> >>>>>> As I described it, its use by the originator of an entity is not >>> mandated, instead behaviors are mandated of recipients when it IS >>>used. >>> >>>> >>> >>>>>> >>>>>> Yeah, mandating it. Which I'm not happy about. >>>>> >>>>> Mandates support, not use. >>>>> >>>> >>>> Kind of the same thing, from the client's POV. Server's choice. >>>> >>> >>> For C-E this means for example the server decides if the client >>>can do >>> a seek. Some interactive clients would prefer to do seeks over >>>getting the >>> content compressed. Whereas downloaders would prefer the content to >>>be >>> compressed. T-E would allow to have both seek and compression. >>> >> >> The server *always* decides what to send, whether c-e or t-e is used. >>The >> fact that the server *may* use gzip does not *require* it to use >>gzip, and >> with my proposal, the server knows if the client requested it >>explicitly or >> not, and it certainly can see if there is a range request and make >>the >> appropriate response. >> >> T-E is theoretically wonderful if one ignores real deployments in >>today's >> world where the majority of HTTP/1.X servers don't actually do >> transfer-encoding: gzip, and thus HTTP2 gateways would have to do c-e >>to >> t-e translation (which might be rather error prone in its own way) or >>have >> to bear the expense of doing the compression themselves-- something >>which >> is untenable. This ignores the the security issue of knowing when t-e >>is >> safe, which I'll address again below. >> >> >> >>> >>> And today it is often neither the server nor the client's choice, >>>which >>> is what is causing the pain. The client expresses that it wants >>>gzip. The >>> intermediary doesn't do it because it makes numbers better, >>>increases >>> throughput, or because they're too lazy to implement it., all at the >>>cost >>> of the decreased user experience. >>> >>> >>>> <snip> >>>>> >>>>> The combination of intermediaries stripping a-e plus the >>>>>competitive >>>> driver to deliver good experience/latency is causing interop >>>>failures today >>>> where servers will send gzip'd data whether or not the client >>>>declares >>>> support in a-e. >>>>> >>>> >>>> Wait, you're saying the whole motivator here is that servers don't >>>>comply >>>> with the protocol? So you're changing the protocol to accommodate >>>>them? >>>> That does not feel right to me, at all; it's not just blessing a >>>>potential >>>> misuse of C-E, it's wallpapering over a flat out abuse. >>>> >>> Partially. >>> I'm saying that intermediaries are doing things which are incenting >>> implementors to break compatibility with the spec, and that >>>implementors >>> are doing so because it makes the users happy. >>> In the end, making the users happy is what matters, both >>>commercially and >>> privately. The users really don't care about purity, and will >>>migrate to >>> implementations that give them good/better user experience. >>> >>> But even so, why do you have to fix it in HTTP/2? And why does it >>>hurt >>>> h2 to *not* fix it? >>>> >>> >>> Compression is an important part of making latency >>>decrease/performance >>> increase, and, frankly, there is little practical motivation to >>>deploy >>> HTTP/2 if it doesn't succeed in reducing latency/increase >>>performance. >>> Success isn't (or shouldn't be) defined as completing a protocol >>>spec, but >>> rather, getting an interoperable protocol deployed. If it doesn't >>>get >>> deployed, the effort is wasted. If it doesn't solve real problems, >>>the >>> effort is wasted. >>> >>> In any case, I cannot reliably deploy a T-e based compression >>>solution. >>> T-e based compression costs too much CPU, especially as compared >>>with c-e >>> where one simply compresses any static entity once and decompresses >>>(which >>> is cheap) as necessary at the gateway. >>> >>> If it is really T-E you can do the same compression of static >>>entities >>> when the whole file is delivered, it would be different for range >>>requests >>> or the frame based approach. >>> >> >> Now how we've thusfar spec'd it. >> >> >>> T-e based compression isn't as performant in terms of >>> compression/deflation ratios. >>> >>> Don't think this is true, the same bytes can be sent as either T-E >>>or C-E. >>> For the frame based approach some numbers were given. >>> >> >> The same bytes can't be sent in both, unless the we're willing to >>suffer >> vastly increased DoS surface area and memory usage OR we do the >>frame-based >> approach, which will have marginally worse compression. >> >>> Many deployed clients/servers wouldn't correctly support it. >>> >>> There are no deployed HTTP2 clients or servers, or are there some? >>> >> >> There are, but I'm not talking about those. My problem is dealing >>with the >> rest of the world, which is mostly HTTP/1.X and is unlikely to >>rapidly >> change. >> In other words, I'm concerned mainly with HTTP/1.X clients and >>especially >> servers. >> >>> T-e would require that any gateway acting as a >>>loadbalancer/reverse >>> proxy would either need to know which resources it could compress, >>>or >>> forces us to not use compression. >>> >>> The gateway can forward the compressed content unmodified. The >>>gateway is >>> only forced to do something if either the server or the client >>>doesn't >>> support compression. >>> >> >> The gateway cannot know which resources it is safe to compress >>without >> something outside the protocol. Compression via t-e without knowing >>whether >> it is safe or not allows attackers to discern ostensibly secret >> information. This is NOT acceptable. >> >>> Knowing what resources to compress either requires an oracle, or >>> requires content authors to change how they author content (*really* >>>not >>> likely to happen), >>> >>> Not sure that authors want to know about compression. If it is >>> automatic then this would be fine. Currently there is server >>>configuration, >>> for example zlib.output_compression in php.ini, and the possibility >>>to do >>> this in the content, for example in PHP something like >>> ob_start('ob_gzhandler'). I guess there is a lot more authors are >>>not aware >>> off. >>> >> >> We definitely don't want to cause content authors to lose what little >> control (and understanding) they have today, especially over matters >> touching security like compression. >> In general, if a resource wasn't compressed on output from an >>endpoint, it >> shouldn't be when received by any other endpoint. > >This seems wrong. The general case is a resource not compressed when >received by an endpoint it should not be compressed when leaving that >*same* endpoint. >Which I understand is what the proposals about C-E:gzip are saying >gateways should do: > Accept implicit gzip within HTTP/2 so servers can emit it and >decompress for identity-only representations as soon as they get to any >HTTP/1 hop. The 1.1->2.0 transitions should obey the HTTP/1 senders use >of T-E:gzip (if they attempt it) or retain identity on the new HTTP/2 >hop. > >Essentially, resources start out compressed but anyone can decompress >and it stays uncompressed for the remainder of the journey. > > >I see no problem with a clause in the HTTP/2 spec regarding *T-E* >mandating that T-E:gzip can only be removed, never added. > >This whole implicit C-E smells like an attempt to rename HTTP/1 >T-E:gzip >as HTTP/2 C-E:gzip and lump all the resulting deployment problems on >the >gateway implementers shoulders. > > >> Given the necessity of interfacing with HTTP/1 servers, which rarely >> support T-E: gzip, this ends up being a problem for HTTP/2 and T-e: >>gzip. >> > >No problem there. The HTTP/2 gateway already has mandatory >(de)compression support in all of these proposals and the existing >specs >text. > >Sending traffic received with T-E:gzip into HTTP/1 is a simple >decompression. >Receiving traffic from HTTP/1 does not require any compression unless >the HTTP/1 endpoint *does* support T-E:gzip, in which case it is >optional to do anything for HTTP/2. > >==> I would like to point out again that the security worries for T-E >*do not exist* unless the HTTP/2 hop is *adding* compression on its >own. > > >Amos >
Received on Wednesday, 30 April 2014 23:29:39 UTC