QUIC, a multiplexed stream transport over UDP
chromium.org
chromium.org
It's the same model as SPDY. See a problem (HTTP1/x utilizing the network poorly). Implement a proprietary protocol from just your clients talking with your web properties. Work out kinks. Standardize as HTTP/2.
I wonder what the HTTP/2 equivalent of QUIC will be.
Interesting aside. As I typed that summary above. I couldn't help but think of Microsoft and how SPDY might still exists as a private "market leading feature" if Google sold server software...
In all honesty, I gave up and iterated my own secure UDP protocol based on the excellent Micro Transport Protocol.
[0]http://src.chromium.org/viewvc/chrome/trunk/src/net/tools/qu... [1]https://github.com/devsisters/libquic
[edit]
I read deeper in, and apparently, QUIC optionally allows sending packets in groups, with an additional packet that is the XOR of the other packets in the groups; this means that you can fill-in any single dropped packet by sending an extra packet ahead of time.
I really wish there was a solid "TCP replacement" with optional reliability, optional ordering and multiplexing that I can run over real networks as user level code, among other features. But the view from the ground from what I've seen is that people either use TCP or build their own protocol that runs over UDP (I'm thinking about games specifically here).
Am I missing an option here? Maybe I should dig into libquic and really figure out how to use it and if it can do what I want.
[1] https://github.com/devsisters/libquic [2] https://code.google.com/p/sctp-refimpl/
JIC you haven't seen it, it covers some of the bases: http://enet.bespin.org/
IIRC I got frustrated with its (at least at the time) inability to send a packet while waiting on a packet to be received so I gave up and started writing my own spin on RFC 908.
Edit: from the docs
> To combat this latency and reduce the ordering restrictions on packets, ENet provides multiple channels of communication over a given connection. Each channel is independently sequenced, and so the delivery status of a packet in one channel will not stall the delivery of other packets in another channel.
I found this issue which looks related to your problem: https://github.com/lsalzman/enet/issues/23
An issue there describes a hack (sending a packet to your own socket to wake up enet_host_service). Not a terrible hack and much like the "self-pipe" trick.
And there's also the fact that I want something that runs on the BEAM VM...
What's the use-case you're thinking of exactly? Why "optional" reliability and ordering? What are the cases when you'd use the reliability and when not?
There are other models of simulation that aren't as loose (lock step-style for example).
Other messages would not be unreliable/unordered. Important state changes, chat messages, etc.
I know voice and video applications can cope with lost packets as well. This is in fact what SCTP was built for.
[edit] And implementation in userspace.
tl;dr minimizing latency, particularly in establishing a connection, is an important design objective.
It's also in plenty of OS kernels already, such as solaris and linux, and can be written as userspace libraries.
1: http://www.cisco.com/c/en/us/td/docs/ios/12_4t/12_4t15/htsct...
> it sits at the IP layer so all routers need to do is pass it as IP
Erm... no. The vast majority of consumer electronics are built up from NAT. You are NOT getting past your Verizon/Comcast router with IP alone.
It's getting interpreted as TCP, and then getting NATted over to something else. As far as i can tell, UDP has a similar process.
But its a major problem with SCTP and consumer routers. Have you ever tried to send an SCTP connection across your typical consumer Verizon router?
... on IPv4. On IPv6 you don't have to worry about NAT, and IPv6 usage is growing: the percentage of Google traffic conducted over IPv6 has doubled in the past year and is significantly higher on weekends, which means consumers are driving a lot of that traffic. It's now over 7% on weekends and growing by about one percentage point every 3-4 months. That seems to me like a sufficiently large pool of potential testers.
The NAT problem is really finally going away. What we need to be worrying about is dumb firewalls, but I'd bet that there will be just as many consumer routers that fail to make any of their firewall rules apply to IPv6 as there will be routers that can pass TCP over IPv6 but not arbitrary protocols.
There's a wicked chicken-and-egg problem deploying SCTP: a popular service would be a good reason to push vendors, enterprise firewall admins, etc. to support SCTP but it'd be financial suicide to build a general service which depends on it now.
I didn't see it clearly treated in the documents at the linked site: is out of order packet delivery supported? I see they they use multiple streams to avoid head of line blocking, but within a stream, can packets be delivered out of order?
[edit] See SCTP for reliable multiplexed out-of-order datagrams.
"Of these, quic is my favorite option for the future. It is a truly phenmenal transport, with tons of things done very, very well. However, though the dragon is ready to hatch from its egg, it must still be unearthed from the enormous Code Caverns, of the Chromium Mountains, a quest not to be taken lightly."
https://github.com/ipfs/go-ipfs/issues/57#issuecomment-70162...