WebTransport API
wicg.github.io
wicg.github.io
I can't find the video link, but the slides from that session are here: https://datatracker.ietf.org/meeting/106/materials/slides-10...
Webtransport is designed as a 'QUIC-native' client-server communication protocol to replace websockets. You can think of it like websockets but better (faster handshake, it reuses the http2 / QUIC connection, and you can relax websocket's reliability & ordering constraints). Or you can think of it as WebRTC, except way simpler for the 95% case where you want to communicate server/client.
I'm excited about it for browser based video games.
It looks complicated, but there's very little thats new here for browsers and web servers to implement. Remember QUIC is already built on top of UDP, and internally, QUIC supports basically all of webtransport's features natively. Webtransport mostly just re-exposes many of QUIC's features to applications. Browsers and HTTP servers are adding all that functionality anyway - so we may as well take advantage of it in our web applications.
My favorite criticism voiced at the IETF was the name - webtransport has nothing to do with the web, and its not a transport. Its mostly just an application API around some of QUIC's features, with fallbacks for HTTP 1.1 and HTTP2.
Is there anything wrong with websockets? I thought websockets were cool.
WebTransport works on HTTP/3 and exposes a part of the underlying UDP QUIC connection (while still allowing HTTP/3 messages to travel across the same underlying connection), allowing for stream-based or packet-based subconnections, reliable or unreliable. Basically, it’s a lot more flexible and doesn’t require setting up an entire new connection to work.
I'm excited for the option of having an unreliable connection. Currently you'd need to establish a webrtc data connection to the server, which is a bit cumbersome when you really don't need or want the rest of webrtc.
HTTP is still very much geared towards request/response semantics, just sometimes serving requests you didn‘t yet know you want to make.
Also, WebTransport seems to be more of an extension of the idea of WebSockets to UDP and other reliability/ordering semantics than an outright replacement.
The remaining difference would be websockets having builtin frame delimiters and a meaning of text and binary frames - whereas with HTTP streams you would need to do that on the appliction level.
Getting Streaming APIs for HTTP was planned to be part of the ReadableStream and WritableStream extensions for fetch - but I have no idea how that effort went since I last looked at it (5 years ago).
I might have just found a weekend project.
I am going to assume things will improve one HTTP/3 is finalised. But right now I dont see QUIC from non-google server at all.
And I cant help but think ( May be it is just me ), are we trying to over-engineer the Internet?
Edit: I just check on the clients side. Turns out Safari 14 may be the first browser to ship with HTTP/3 enabled by default.
You won't see webtransport appearing for awhile either. Its all still in draft status. The IETF doesn't rush these things.
And for what its worth, the spec for Webtransport is being worked on with close collaboration with the QUIC (HTTP/3) working group at the IETF. Everyone wants webtransport and QUIC to be a good fit for one another, and straightforward to implement in browsers once its ready.
I worry about over-engineering too; but the best way to express those fears is to get involved. Standards are written by those who show up. And the IETF welcomes anyone who's interested to join the mailing lists and attend IETF sessions. (So long as you accept the community norms.) Even the in-person events (when they come back) bend over backwards to welcome remote attendance and remote questions.
This is the video of the webtransport BoF session from Singapore last year, if you're curious how this sort of thing plays out in person. There were only about 25 people there:
https://play.conf.meetecho.com/Playout/?session=IETF106-WEBT...
Or the direct youtube link (without the text from remote participants): https://youtu.be/o5cJEuO2-vk
0. https://www.bram.us/2020/04/08/how-to-enable-http3-in-chrome...
1. https://mailarchive.ietf.org/arch/msg/quic/F7wvKGnA1FJasmaE3...
It addresses a number of the top comments here, e.g. why not just use WebRTC data channels:
"While WebRTC data channel has been used for client/server communications (e.g. for cloud gaming applications), this requires that the server endpoint implement several protocols uncommonly found on servers (ICE, DTLS, and SCTP) and that the application use a complex API (RTCPeerConnection) designed for a very different use case."
I can see this replacing most use cases of WebSockets once brought to ubiquity.
channel = new RTCPeerConnection().createDataChannel("foo", {ordered: false})
Then you can read from it with: channel.onopen = () => { ... }
channel.onmessage = (event) => { ... }
This is widely supported in every modern browser.(The main issue, and this has nothing to do with the client API, is that WebRTC implementations tend to end up assuming unique ports for each user--which would be needed to help with NAT--but if you aren't behind NAT then the ICE layer already has a connection ID so you should be able to multiplex them all over a single open port.)
I am really excited for DTLS connection ids[0] to land. Then you will have everything you need to run ICE+DTLS (and SCTP over that) and be able to demux/load balance it easier.
[0] https://datatracker.ietf.org/doc/draft-ietf-tls-dtls-connect...
https://bloggeek.me/turn-public-ip-address/
To be perfectly honest, I'm still fuzzy on the why, but numerous blog posts, stack overflow questions, and the Kurento forums agree. This being Hacker News maybe someone with chime in with the technical reasoning.
ICE TCP did get a little more limited recently in Chromium though [0] because of the TCP port scanning issue [1]
I have also heard that some gateways/firewalls/$x don't allow any non-TLS traffic, so you can't even establish ICE. In those cases the DTLS/TLS transport of TURN is nice.
[0] https://lists.w3.org/Archives/Public/public-webrtc/2020Feb/0...
[1] https://medium.com/tenable-techblog/using-webrtc-ice-servers...
STUN and TURN allow the negotiation to include services outside the local network so that you can relay signaling and stream data to a set of endpoints that both peers can use to communicate with one another. This could be the peers directly or it could be a set of 3rd party servers run by Google or someone open to the public and you can't assume any particular network topology.
When Bernard published the QuicTransport stuff I tried a few different versions and it only worked aioquic[0] (which is a really fantastic implementation)! But with 29 drafts and most servers not supporting them all feels like we still have some time to go.
So QUIC as a server is much less likely to happen then ICE/DTLS/SCTP which have implementations that work everywhere.
No, it rather sounds like you have a hammer called WebRTC and you're attempting to use it on a nail called "bidirectional server/client communication".
Why deal with the complex protocol stack of WebRTC which solves, among other things, NAT traversal, mutual authentication and encryption independently of server certificates, multiplexing of data and A/V content on a single port and much more. And I say that as someone who absolutely loves WebRTC for A/V and secure P2P use cases.
There is a true gap of "UDP for the web", which this fills.
"WebSockets over UDP" don't need to be built on QUIC, but I'm assuming by the time you have added all the security features needed to make this as secure as WebSockets for web apps, you'll effectively end up with something equivalent.
Leaving out the ICE will of course make WebRTC look palatable.
STUN, TURN, and ICE are a few technologies you need to understand to get started with WebRTC. I'd guess most folks aren't familiar when first looking into it.
The complexity is worth it if you're determined to push most bandwidth costs to clients like I am.
If you want near 100% connectivity at a lower complexity, WebSockets are almost always preferred.
This is just not something you run into with WebSockets.
I'd recommend simple-peer for anyone who does choose to use WebRTC. The maintainers are usually able to smooth these issues out in a reasonable timeframe. <3
We tried to do it, but the IETF event was cancelled https://twitter.com/steely_glint/status/1230447935307026432. I am hoping that in the next 6 months we can have something like that so that all the WebRTC implementations will work together a lot better.
As for "too many protocols": QUIC is already in the browser. This is just giving you an API to it. Think of it like WebSockets for the HTTP3 world.
EDIT: bizarrely, I found this article on The Verge more descriptive of what metastream does than the website, WIKI and source code :-) [1].
1: https://www.theverge.com/2020/3/25/21191604/watch-movies-fri...
It's a simpler spec to solve a simpler problem. WebRTC is necessarily complex, but still overkill for a bunch of scenarios.
Specifically, how would this work for say, a PHP app that wants to stream stuff? I use https://reactphp.org/ for websockets in PHP (so I can have a shared codebase with my main app, etc).
I don't think I understand how this would look on the server-side. I'm interested to understand how it would look like to support this in Caddy (I'm one of the core contributors).
https://github.com/tinspin/rupy/wiki/Comet-Stream
The only thing that is annoying in the browser is that Chrome does not allow you to remove or change the User-Agent header which wastes a little bandwidth.
Rupy is a complete beast in terms of multi-core power, as long as the selector thread is not saturated it can scale linearly on all cores on shared memory = no memory copying or locks like all other solutions!
But the real upside is you get one process for async. HTTP (client and server), including database; which means you can use micro services the way they should be used by hosting all services on all machines and call them locally = more robust and less complex (no discovery after the initial client -> server DNS) completely without IO-wait!
WebSockets are completely over-engineered, as is HTTP/2 and 3...
So to answer your question: rupy is the final solution to internet servers. ;)
Now I'm working on the final solution for internet clients: http://talk.binarytask.com/task?id=5959519327505901449
And internet 2.0: http://radiomesh.org
And the final computer: http://talk.binarytask.com/task?id=8015986770003767235
Joint parallel is the opposite of that, where you need very fast shared memory between the cores. Meaning all cores touch all data, it's a rarer form of parallelism because it is hard.
But if you want to write a MMO server f.ex. you need to understand how this works all the way down to the hardware.
According to that definition If you have a really tiny task that has fast memory (embarrassingly parallel + little memory) and a huge task that has really slow memory they are the same (1/1 == 100000/100000) so really what does that definition say!
Also it seems only instruction levels of parallelism are fine-grained. This means everything I will ever do and talk about is coarse-grained. So how can I tell people my software is 10x faster than Erlang for a MMO type of server problem space?
I'm going to access contiguous memory with 2 separate threads simultaneously without locks in C when I finalize my 3D MMO engine client this fall and then I'll understand more on how these things really work, right now I'm a little confused.
I think "Joint Parallelism " is more telling, it puts focus on the bottle neck of our civilization which is / and will always be: memory speed!
F.ex. Erlang is completely meaningless for "joint parallelism", because it uses memory copying instead of monitors/locks and even there Java can be even more performant according to the creator of the Java concurrency package:
"While I'm on the topic of concurrency I should mention my far too brief chat with Doug Lea. He commented that multi-threaded Java these days far outperforms C, due to the memory management and a garbage collector. If I recall correctly he said "only 12 times faster than C means you haven't started optimizing"." - Martin Fowler (https://martinfowler.com/bliki/OOPSLA2005.html)
I have mailed Doug to get an explanation, but the only thing I can tell you is that my implementation of what he talks about in that quote is proof that he is right. How he is right, I still don't totally understand! He hasn't and probably wont reply though!
More worrying is the memory copying that the kernel is doing, I think the last step for computing advances is to go back and simplify the OS.
My prediction is that we will get kernel bypass for network IO pretty soon and disk IO will follow after that, at least for servers.
WebSockets only works for the mere basics.
Also webrtc functionality is a superset of this so it's not a technically necessary protocol.
If anyone is wondering if this is already implemented anywhere, we're currently experimenting with it in Chrome: https://web.dev/quictransport/ -- I'd be curious to hear what people think about it.