{"id":9061,"date":"2016-07-20T17:13:21","date_gmt":"2016-07-20T15:13:21","guid":{"rendered":"https:\/\/daniel.haxx.se\/blog\/?p=9061"},"modified":"2016-07-20T17:13:21","modified_gmt":"2016-07-20T15:13:21","slug":"curl-wants-to-quic","status":"publish","type":"post","link":"https:\/\/daniel.haxx.se\/blog\/2016\/07\/20\/curl-wants-to-quic\/","title":{"rendered":"curl wants to QUIC"},"content":{"rendered":"<p>The interesting Google transfer protocol that is known as <a href=\"https:\/\/www.chromium.org\/quic\">QUIC<\/a> is being passed through the <a href=\"http:\/\/ietf.org\/\">IETF<\/a> grinding machines to hopefully end up with a proper &#8220;spec&#8221; that has been reviewed and agreed to by many peers and that will end up being a protocol that is thoroughly documented with a lot of protocol people&#8217;s consensus. Follow the <a href=\"https:\/\/www.ietf.org\/mailman\/listinfo\/quic\">IETF QUIC mailing list<\/a> for all the action.<\/p>\n<h2>I&#8217;d like us to join the fun<\/h2>\n<p>Similarly to how we implemented HTTP\/2 support early on for <a href=\"https:\/\/curl.haxx.se\/\">curl<\/a>, I would like us to get &#8220;on the bandwagon&#8221; early for QUIC to be able to both aid the protocol development and serve as a testing tool for both the protocol and the server implementations but then also of course to get us a solid implementation for users who&#8217;d like a proper QUIC capable client for data transfers.<\/p>\n<h2>implementations<\/h2>\n<p>The current version (made entirely by Google and not the output of the work they&#8217;re now doing on it within the IETF) of the QUIC protocol is already being widely used as Chrome speaks it with Google&#8217;s services in preference to HTTP\/2 and other protocol options. There exist only a few other implementations of QUIC outside of the official ones Google offers as open source. <a href=\"https:\/\/caddyserver.com\/\">Caddy<\/a> offers a separate server implementation for example.<\/p>\n<h2>the Google code base<\/h2>\n<p>For curl&#8217;s sake, it can&#8217;t use the Google code as a basis for a QUIC implementation since it is C++ and code used within the Chrome browser is really too entangled with the browser and its particular environment to become very good when converted into a library. There&#8217;s a <a href=\"https:\/\/github.com\/devsisters\/libquic\">libquic<\/a> project doing exactly this.<\/p>\n<h2>for curl and others<\/h2>\n<p>The ideal way to implement QUIC for curl would be to create &#8220;nghttp2&#8221; alternative that does QUIC. An <em>ngquic<\/em> if you will! A library that handles the low level protocol fiddling, the binary framing etc. Done that way, a QUIC library could be used by more projects who&#8217;d like QUIC support and all people who&#8217;d like to see this protocol supported in those tools and libraries could join in and make it happen. Such a library would need to be written in plain C and be suitably licensed for it to be really interesting for curl use.<\/p>\n<h2>a needed QUIC library<\/h2>\n<p>I&#8217;m hoping my post here will inspire someone to get such a project going. I will not hesitate to join in and help it get somewhere! I haven&#8217;t started such a project myself because I think I already have enough projects on my plate so I fear I wouldn&#8217;t be a good leader or maintainer of a project like this. But of course, if nobody else will do it I will do it myself eventually. If I can think of a good name for it.<\/p>\n<h2>some wishes for such a library<\/h2>\n<ul>\n<li>Written in C, to offer the same level of portability as curl itself and to allow it to get used as extensions by other languages etc<\/li>\n<li>FOSS-licensed suitably<\/li>\n<li>It should preferably not &#8220;own&#8221; the socket but also work in-memory and to allow applications to do many parallel connections etc.<\/li>\n<li>Non-blocking. It shouldn&#8217;t wait for things on its own but let the application do that.<\/li>\n<li>Should probably offer both client and server functionality for maximum use.<\/li>\n<li>What else?<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>The interesting Google transfer protocol that is known as QUIC is being passed through the IETF grinding machines to hopefully end up with a proper &#8220;spec&#8221; that has been reviewed and agreed to by many peers and that will end up being a protocol that is thoroughly documented with a lot of protocol people&#8217;s consensus. &hellip; <a href=\"https:\/\/daniel.haxx.se\/blog\/2016\/07\/20\/curl-wants-to-quic\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">curl wants to QUIC<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,13,45],"tags":[352,292,33,369,249,379,414],"class_list":["post-9061","post","type-post","status-publish","format-standard","hentry","category-curl","category-net","category-web","tag-c89","tag-chrome","tag-curl-and-libcurl","tag-http2","tag-ietf","tag-nghttp2","tag-quic"],"_links":{"self":[{"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/posts\/9061","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/comments?post=9061"}],"version-history":[{"count":22,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/posts\/9061\/revisions"}],"predecessor-version":[{"id":9083,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/posts\/9061\/revisions\/9083"}],"wp:attachment":[{"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/media?parent=9061"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/categories?post=9061"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/daniel.haxx.se\/blog\/wp-json\/wp\/v2\/tags?post=9061"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}