Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Honestly, I am kind of disappointed at QUIC.

It could have been much more...

* there is no support for non-reliable streams

* I am not keen on the variability and non-alignment of the whole header (which can go from 0 to 60+ bytes).

* it points too much towards just reducing the RTT for the initial connection (0RTT is a bad idea, especially if your application now needs to handle the special case of the connection being 0RTT or not).

* There is no support for datagrams, just datastreams.

* Perfect forward secrecy is not granted on the initial handshake (you need to explicitly do a second key exchange for that)

* Forward error correction is actually cool but just using XOR is too limited.

* The proof of ownership of the connection is one incredible hack

And these are just the things I remember from looking at it a couple of years ago. Still, it's a nice improvement over older protocols.

To those that are going to comment something like "Well, then do your own": that's exactly what I'm doing although it's going slowly as I don't have Google's budget.



Regarding non-reliable streams: There is https://tools.ietf.org/html/draft-tiesel-quic-unreliable-str..., while it won't be part of the initial standard, it's likely that the working group makes sure that it can be added later.


did not see that, thanks for the link


> There is no support for datagrams, just datastreams.

Datagrams can be easily and effectively encoded as discrete short-lived streams. If you need streams of datagrams, you can encode your own header to do that. I see no reason why this has to be built into the protocol when the provided primitives are sufficient.

> Forward error correction is actually cool but just using XOR is too limited.

Pretty sure FEC was removed from the IETF draft.


> Datagrams can be easily and effectively encoded as discrete short-lived streams. If you need streams of datagrams, you can encode your own header to do that. I see no reason why this has to be built into the protocol when the provided primitives are sufficient.

Using discrete short-lived streams could mean a little more trouble understanding which message was in response to which other message. A stream of datagrams is already a logic container. But I gues you could track that by hand, too.

Maybe I just found an easier way to implement all of that on the protocol, so I don't see why QUIC could not. Maybe it's just something that I always end up doing by hand so I would just be happier if was provided. I mean, IP/UDP already has all the primitives I need, but it's not like everyone likes to reinvent the wheel.

> > Forward error correction is actually cool but just using XOR is too limited.

> Pretty sure FEC was removed from the IETF draft.

Yes, did not know about that. A pity, my experiments with proper FEC showed wonders after a minimum packet loss rate was surpassed. Even better on high-latencies.


> * there is no support for non-reliable streams

Can you have a stream based protocol that doesn't try to be reliable? A message oriented one i understand.

> * There is no support for datagrams, just datastreams.

because, I guess, you can always just use UDP!


I am currently building a protocol in which each stream can be any combination of (un)reliable,(un)ordered,datagram or datastream. Yes, some combinations make little sense, but it can be done.

You only need the control stream to be reliable+ordered.

UDP datagram limits you to the size of the packet. The basic difference of datagram and datastream is only wether you have a way to identify the start/end of the user messages. Think like TCP, were you don't need to handle the beginning and end of your messages.


Have you looked at SCTP?


yes, nice protocol, except everything is cleartext :)


> there is no support for non-reliable streams

I think the point of QUIC is to provide a reliable protocol. I'm not sure if this complaint is relevant.

> I am not keen on the variability and non-alignment of the whole header (which can go from 0 to 60+ bytes).

Agree

> it points too much towards just reducing the RTT for the initial connection (0RTT is a bad idea, especially if your application now needs to handle the special case of the connection being 0RTT or not).

It's annoying because you need to try decrypting with two different keys, but it simplifies the handshake for both side as the state machine is now super simple

> Perfect forward secrecy is not granted on the initial handshake (you need to explicitly do a second key exchange for that)

if you're talking about 0-RTT, I think replayability is a much bigger problem than forward secrecy as forward secrecy is bound to the server config rotation, so you just need to rotate frequently.

> The proof of ownership of the connection is one incredible hack

How is it a hack? It allows the server to be stateless and it works quite well. How would you make it better?


> I think the point of QUIC is to provide a reliable protocol. I'm not sure if this complaint is relevant.

I found it easy to include support for unreliable streams in my protocol, I'm just not sure why they did not even try. I heard about a hack-proposal where you could just use a new stream for one packet and then forget about it, but it's not really the same, and I am not sure they did even that.

> It's annoying because you need to try decrypting with two different keys, but it simplifies the handshake for both side as the state machine is now super simple

The issue I have with it is that now it's the application that needs to be sure not to write too much without an additional round-trip, otherwise you could end up with an amplification attack. I remember reading that there was an additional call to be made by the application just for that. But other simplifications in the handshake are actually great, yes.

> if you're talking about 0-RTT, I think replayability is a much bigger problem than forward secrecy as forward secrecy is bound to the server config rotation, so you just need to rotate frequently.

Yes, see above. But if I remember correctly rotating keys also makes client unable to use the 0-RTT, so you can't do it too often. QUIC has a weaker PFS than TLS. Still secure, just weaker, and basically disabled unless you explicitely call a key rotation. I am just afraid that the implementations and servers out there will not use that.

> How is it a hack? It allows the server to be stateless and it works quite well. How would you make it better?

Are we talking about the same thing? I meant the entropy bit. Really dislike it. (Then again, it works, eh...).

Yep, my bad, I said "ownership of connection" instead of "ownership od the IP".

The ownership of the connection is derived only from the connection id and crypto keys, that's a nice simplification, yes.


> I found it easy to include support for unreliable streams in my protocol, I'm just not sure why they did not even try. I heard about a hack-proposal where you could just use a new stream for one packet and then forget about it, but it's not really the same, and I am not sure they did even that.

Thinking about it, what would you want for an unreliable stream beside encryption? Isn't DTLS taking care of what you want?

> The issue I have with it is that now it's the application that needs to be sure not to write too much without an additional round-trip, otherwise you could end up with an amplification attack. I remember reading that there was an additional call to be made by the application just for that. But other simplifications in the handshake are actually great, yes.

So, the server is not going to reply unless the client has proven that it owns the source IP address. This should prevent any amplification attack tied to 0-RTT. Or you mean the kind of amplification attack where the client is tricked into talking to the wrong server? This probably could happen in some scenarios, mmm...

I'm thinking that the client wouldn't use 0-RTT without knowing exactly who he's talking to (the cached server configuration is probably tied to the ip:port the client had to connect to the first time around).

> if I remember correctly rotating keys also makes client unable to use the 0-RTT, so you can't do it too often.

I think 0-RTT targets people connecting to the same website multiple times per day. So I can see scenarios where you would rotate it every day? I'd be interested to know how Google configures its own servers.

I just checked, news.google.com has a SSTL of 84:4e:02:00:00:00:00:00 seconds, I think this should be in little endian so it should be around 2 days. This is how much time is left. It's not really informative actually, the SCFG (server config) contains an EXPY field with a unix timestamp indicating 1518350400 (2018/11/02 @ 12:00pm). I realize now that this doesn't tell us much more since it doesn't tell me when the server config was signed :|

> QUIC has a weaker PFS than TLS

Are you comparing it to TLS 1.3? If you're doing a PSK-based handshake with no key exchange, they should provide the same security properties.

> I meant the entropy bit

Can you tell me what you're talking about? I don't know the spec by heart.

The cookie that the server gives to the client is an encryption of source ip and an expiration date, it just looks opaque to the client but the server can decrypt it and check it.


> Thinking about it, what would you want for an unreliable stream beside encryption? Isn't DTLS taking care of what you want?

No, the encryption/transport is a nice part, but I'm also working on other stuff like federated authentication. Besides, why would a developer want to use different stacks when he can use one that includes all the others? I believe protocols should be as general as possible, so I really see no reason not to include this.

> Are you comparing it to TLS 1.3? If you're doing a PSK-based handshake with no key exchange, they should provide the same security properties.

I was comparing it to a standard TLS key exchange with PFS enabled.

> Can you tell me what you're talking about? I don't know the spec by heart.

As I said I remember old information so I have not checked the latest draft, but I am sure that after the connection is set up the server and client continue to flip a single bit somewhere, and hash the result. This hash is sent by the client to the server so that the server can check that the client owns the IP and is actually receiving the data.

Don't know if they still have it, but it was there a couple of years ago.


> federated authentication

What is it?

> the server and client continue to flip a single bit somewhere, and hash the result

There is a "message authentication hash" being sent in messages and I can't see anything about that in the spec, so that might be it?

But two things about that:

* I don't think it makes much sense to prove that you own the IP after the handshake has been done. It's mostly a countermeasure to DoS attacks for the very first handshake message

* The client should actually be able to roam and change IP without having to re-negotiate a secure connection with the server, as long as it uses the same 64-bit connectionID.


>> federated authentication

> What is it?

Think Jabber, AD, kerberos, email... those are federated environments.

Basically you tie a user to a domain, have some way to discover all domains, and design an authentication that can be trustworthy enough for the interaction of multiple domains. The end result is that your username is (more or less) trusted on other domains.

Of course, it does not mean that what I'm building is limited to federation, but it simplifies a lot of things after a while.

> There is a "message authentication hash" being sent in messages and I can't see anything about that in the spec, so that might be it?

By the name it is either that or you are talking about the MAC of each packet, but it could be that, yes.

> * I don't think it makes much sense to prove that you own the IP after the handshake has been done. It's mostly a countermeasure to DoS attacks for the very first handshake message

> * The client should actually be able to roam and change IP without having to re-negotiate a secure connection with the server, as long as it uses the same 64-bit connectionID.

Yes, I think only QUIC has such a mechanism. It was probably introduced exactly to handle roaming stations, and avoid having to require another check before the server can send data to the new IP. If no such check is in place, then you could start a file transfer and then spoof the source IP to that of someone you wanted to DoS.


> what would you want for an unreliable stream

Video?


That's application specific, not protocol specific. Or maybe I didn't understand your comment? Could you be more specific about what DTLS doesn't provide for streaming that QUIC could have provided?


As far as I know, neither DTLS nor QUIC provide datagrm transport (as in: managing the beginning/end of user messages, regardless of size), I am not sure if DTLS does unordered delivery (probably not if it simulates a stream), and my favourite is that none can handle transmission of data in a "reliable multicast" fashion.

By reliable-multicast I mean something like having a main multicast stream plus a unicast that delivers only the lost data.

DTLS multicast also kind of sucks because all clients share the same keys for the MAC, meaning that the clients could spoof the server data towards other clients.

Also, I am afraid the Forward Error correction of QUIC is a bit too basic to be really useful, which is why I developed a second library with more flexible FEC than just implementing raid-4 over the network.

I am designing my protocol with that transport in mind, because I did not want to limit the user in what he could do.

You can do all of this on the application, you can use even multiple stacks, but the upper layers are usually less efficient, more error prone, and we cause a global "reinvent the wheel" movement without even realizing it.


> I am not sure if DTLS does unordered delivery

That's an interesting point, indeed the RFC[1] seems to support your claim:

> DTLS implementations maintain (at least notionally) a > next_receive_seq counter. This counter is initially set to zero. > When a message is received, if its sequence number matches > next_receive_seq, next_receive_seq is incremented and the message is > processed. If the sequence number is less than next_receive_seq, the > message MUST be discarded. If the sequence number is greater than > next_receive_seq, the implementation SHOULD queue the message but MAY > discard it. (This is a simple space/bandwidth tradeoff).

[1]: https://tools.ietf.org/html/rfc6347

> DTLS multicast

I'm not seeing mentions of that in the RFC

> Forward Error correction of QUIC

I'm looking at the QUIC spec and I don't see anything about that, there doesn't seem to be any error correction done in QUIC (perhaps at the UDP level with the checksum you mean?)


>> DTLS multicast

> I'm not seeing mentions of that in the RFC

My bad, still a draft: https://datatracker.ietf.org/doc/draft-lucas-dtls-multicast/

> I'm looking at the QUIC spec and I don't see anything about that, there doesn't seem to be any error correction done in QUIC (perhaps at the UDP level with the checksum you mean?)

Nope, basically it should be: send X packets (X>=2), then the xor of those packets. Lose one, everything can be recovered

Googoling again I see that they later disabled it 'cause it did not give the expected results on youtube:

https://docs.google.com/document/d/1Hg1SaLEl6T4rEU9j-isovCo8...

Which is not that surprising considering that network errors are more often in bursts, and they could recover only one error.

I still think proper FEC can be useful, especially in networks with high packet loss (at 5% and up my experiments gave me a huge advantage over any control flow algorithm of TCP, even more on high-latency networks)


Have you tried engaging with IETF-QUIC?


I'm a nobody, the protocol is already well defined and what I need would call for something close to a rewrite, which is why I am actually doing my own.

Hopefully in a one or two months I will have a stable enough implementation so people might be interested enough to contribute, then I can think about writing a proper rfc.


If you can nonetheless voice a design issue, consider putting it on the record in their own forum [1], even if your concerns won't result in substantive changes in the end.

[1] https://github.com/quicwg/base-drafts/blob/master/CONTRIBUTI...


From your website it sounds like your project is much bigger than just improving QUIC. Wouldn’t it make sense to bring your expertise to improve QUIC in the short term? It seems to be relatively common to hear people talk about how nobody will listen to them because of cronyism or something, but then the thing that they are proposing is actually a one-man rewrite of everything. Maybe nobody has the time to dig into your massive, non-working project. Also, it’s kind of an implicit statement that you are not interested in working with anyone else. Maybe if you approached things in a more collaborative way, your ideas would get some traction. I’m reminded of a relevant XKCD about standards here.


QUIC has already enough intelligent people behind it, I'll look at the github page to see if I can say something, but the main difference is probably the scope.

The scope of QUIC is quite clear: it aims at putting together TCP and TLS. It already does that well enough, it won't do more. I found that limiting, the only option I have is to do something myself.

I tried talking to people around (conference and privately) but what I got from it is basically: first show that it can work, then we can talk. I tried to talk about the theory and objectives behind before the code, but without an implementation it does not seem to be worth much.

Google is a big company that can put people to work on something and that gets things done, wether it is a good idea or not. I can't pay anyone, I have not found people interested in even only the theory, so I'll go on, and maybe something will change when things start to work.


I encourage you to just enter the working group and engage them via whatever medium they're using. There's nothing to lose, really, and much potential win for both them and you.




Consider applying for YC's Fall 2026 batch! Applications are open till July 27.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: