<!doctypehtml><html lang=en><meta charset=utf-8><meta content=width=device-width,initial-scale=1.0 name=viewport><meta content=ie=edge http-equiv=X-UA-Compatible><title>
   Google’s QUIC protocol: moving the web from TCP to UDP
  </title><meta content="index, follow"name=robots><link href=https://ma.ttias.be/googles-quic-protocol-moving-web-tcp-udp/ rel=canonical><meta content="Mattias Geniar"name=author><meta content="The QUIC protocol (Quick UDP Internet Connections) is an entirely new protocol for the web developed on top of UDP instead of TCP."name=description><meta content="Google’s QUIC protocol: moving the web from TCP to UDP"prefix="og: http://ogp.me/ns#"property=og:title><meta content="The QUIC protocol (Quick UDP Internet Connections) is an entirely new protocol for the web developed on top of UDP instead of TCP."prefix="og: http://ogp.me/ns#"property=og:description><meta prefix="og: http://ogp.me/ns#"content=article property=og:type><meta prefix="og: http://ogp.me/ns#"content=https://ma.ttias.be/googles-quic-protocol-moving-web-tcp-udp/ property=og:url><meta prefix="og: http://ogp.me/ns#"content=https://ma.ttias.be//wp-content/uploads/2016/07/tcpdump_header_flags.png property=og:image><meta content=2016-07-30T13:52:12+00:00 property=article:published_time><meta content=2016-07-30T13:52:12+00:00 property=article:modified_time><meta content=https://www.facebook.com/www.ma.ttias.be/ property=article:author><meta content=https://www.facebook.com/www.ma.ttias.be/ property=article:publisher><meta content=blog property=article:section><meta content=summary_large_image name=twitter:card><meta content=@mattiasgeniar name=twitter:site><meta content="Google’s QUIC protocol: moving the web from TCP to UDP"name=twitter:title><meta content="The QUIC protocol (Quick UDP Internet Connections) is an entirely new protocol for the web developed on top of UDP instead of TCP."name=twitter:description><meta content=https://ma.ttias.be//wp-content/uploads/2016/07/tcpdump_header_flags.png name=twitter:image><link href=https://ma.ttias.be/css/styles.min.b85173f3f398bed21ee2c825271580f8302e2d0611ae7582701561deaf64d471.css integrity=sha256-uFFz8/OYvtIe4sglJxWA+DAuLQYRrnWCcBVh3q9k1HE= rel=stylesheet><meta content="Hugo 0.71.1"name=generator><body class="bg-white font-sans leading-normal tracking-normal text-lg"><nav class="fixed w-full z-10 top-0 border-b-4 border-indigo-200 bg-white"id=header><div class="w-full md:max-w-4xl mx-auto flex flex-wrap items-center justify-between mt-0 py-3"><div class=pl-4><a class="text-gray-900 text-base no-underline hover:no-underline font-extrabold text-xl"href=/> Mattias Geniar </a></div><div class="block lg:hidden pr-4"><button class="flex items-center px-3 py-2 border rounded text-gray-500 border-gray-600 hover:text-gray-900 hover:border-teal-500 appearance-none focus:outline-none"id=nav-toggle><svg class="fill-current h-3 w-3"viewbox="0 0 20 20"xmlns=http://www.w3.org/2000/svg><title>Menu</title><path d="M0 3h20v2H0V3zm0 6h20v2H0V9zm0 6h20v2H0v-2z"></path></svg></button></div><div class="w-full flex-grow lg:flex lg:items-center lg:w-auto hidden lg:block mt-2 lg:mt-0 bg-gray-100 md:bg-transparent z-20"id=nav-content><ul class="list-reset lg:flex justify-end flex-1 items-center"><li class=mr-2><a class="inline-block text-gray-600 no-underline hover:text-gray-900 hover:text-underline py-2 px-4 active"href=/blog/> <span> Blog </span> </a><li class=mr-2><a class="inline-block text-gray-600 no-underline hover:text-gray-900 hover:text-underline py-2 px-4"href=/cronweekly/> <span> Newsletter </span> </a><li class=mr-2><a class="inline-block text-gray-600 no-underline hover:text-gray-900 hover:text-underline py-2 px-4"href=/syscast/> <span> Podcast </span> </a><li class=mr-2><a class="inline-block text-gray-600 no-underline hover:text-gray-900 hover:text-underline py-2 px-4"href=/projects/> <span> Projects </span> </a><li class=mr-2><a class="inline-block text-gray-600 no-underline hover:text-gray-900 hover:text-underline py-2 px-4"href=/talks/> <span> Talks </span> </a><li class=mr-2><a class="inline-block text-gray-600 no-underline hover:text-gray-900 hover:text-underline py-2 px-4"href=/contact/> <span> Contact </span> </a><li><a class="inline-block text-gray-600 no-underline hover:text-gray-900 hover:text-underline py-2 px-4 mt-2"href=/search/> <svg class="fill-current w-5"viewbox="0 0 512 512"aria-hidden=true data-icon=search data-prefix=fas focusable=false role=img xmlns=http://www.w3.org/2000/svg><path d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"></path></svg> </a></ul></div></div></nav><div id=content><div class="w-screen max-w-full pt-20 header-curved"><div class="container w-full md:max-w-4xl px-4 md:px-6 text-xl text-gray-800 leading-normal mx-auto"><div class=pb-8><h1 class="font-thin break-normal leading-tight text-gray-900 pt-6 pb-4 text-4xl md:text-5xl">Google’s QUIC protocol: moving the web from TCP to UDP</h1></div></div></div><div class="container w-full md:max-w-4xl mx-auto mt-8"><div class="w-full px-4 md:px-6 text-xl text-gray-800 leading-normal"><div class="block flex w-full items-center mb-8 mt-4"><img alt="Profile image of Mattias Geniar"class="w-12 h-12 rounded-full mr-4"loading=lazy src=data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAASABIAAD/2wCEAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx4BBQUFBwYHDggIDh4UERQeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHv/AABEIAJAAkAMBIgACEQEDEQH/xACNAAACAwEBAQEAAAAAAAAAAAAFBgMEBwIBCAAQAAIBAwIEBAMGBgIDAQAAAAECAwAEEQUhBhIxQRNRYXEHIjIUI1KBkbEVQqHB4fAkYghD0fEBAAIDAQEAAAAAAAAAAAAAAAMFAQIEBgARAAICAgIBBAMBAQAAAAAAAAABAgMEERIhMQUTIkEzUXGRI//aAAwDAQACEQMRAD8A+hxpvM307e1SNpfMNhReGTPVf6VYXB/lrPyZPFC+ujDrivzaSufppk5M7cteeFjcip5sjihd/hI7qK4fS8b4otqt7DZW0k0rBVRSzHyFZzxB8QbmOKY2FojR9Emdv7f5q0ZSb0iHBaGp0hhH3jgAetLuu8b8OaTL4EhlnkH1CFc8v5nArF+IPiFrU13IZtZulAJBijjRQvlnbJpD1/i7UJi7JdSSO53cgbeQxR1XNlNRXk+nLf4icKSqOS6mQ9xJbsMfn0odxDxzpbWhNpexvnYEHA/WvlI6vqysJFv50wchgdh+lGNK4wlnT7PqNzEs5+mZNuf0YdPzoyqcewbcH0axe6vfTyvzSkDPQHpVYXUo6uf1pJsuKTNItleEC5A/48428QD+Q+Z/f3o5p+rW90gV3CydCP8AelMaboP4yWhffjSXyj2gtPN4g3NcRHO2aiZa8BIPlW5JaMDLM0JVchs1WJINSeKxOCdq8YKRkV4jZE7seprjnbzrtlrgLkE14g+vlSMDO2Krajqdnp8ReZh086XLvUrm2gLyEgCsu4/4nmvGa3jkb1wa5Wil2y0jqLblXHbNOm+Ielx3PheKn61DrPxH063iysgyew3r57eSQncn3rvxnSFp3DSeGMhT3/xTCeDCC5NmGGZOcuKXk0fjHjqa5tDHFAzpKv1Ntt7VlOsaxccjGa6mCttygjce3Sg2p63JczsHmKgnJOM4FB8vfTCGCN+Qndz1asUIqPYwab6BWs3LvclnLH/sO9CDBcTy4STlzWjQ8INPEGCMuNwRX614Ol8bDjCd6Or4pHnhzZnP8KmuLnwLdJZyCAzsx3PoKP2XAGoSrzOnJ7+VatonD9vaKuIht3xTDFbRgfSP0ocsiT8B4YEfLMQvOBdYRV8FmbByDnpVGe7u7SUQXwaO4jBUM23MPwk/sex96+gGjgwQQB+VLXFnCtnrluxh5VlA69qmFzfki3ESW4iDwnxRPNeJZ3TmWM9Gc4ZR7+m3WneUJjK//tZBNpc+ka1Nb3Ezxyp8vOPw5z/atE4ZcTzMplZnSIBxnbPY/pTKi1qSW+hLkUpxb12HrZFfY1LNCqLnNV2VozkVzLK5TBNMGxWkQTvg4FV/EZa6c75NRPuKg9o2v4mcRLCrW9uRzHYYrL40eWQvISSetX7yaXULlp5jnP8ASoj8uyisGNSqYa+xjk3O2W/ogaBSeld/ZgtvLzsEXkOSamiU5yaC8XXXgyQK8pSEKXbBwPLf9gK9lSftvROIk7FsS9X06Y3kdtaqzO5CgBcnfzrRuF+Dms7VJbtAHIBCnrVL4cRx3esLfXHLhDzIpO/uf7VpqR+OeZSMZpBkWtfFHTYlKa5sExWCxqFVKjexA3IovcMsJOBnHftVCe9XOxGe9Ug2xg4rRAkGMAjapBFkHGKjN4n8xrw3sYcqDmjJlejyW1fBKmoB9z13PrUV3rNjG/gteQo/kzCrEUtpexcqXEbMR8uG61ZbM83Fvoyz4qWClxqkKDniblk26qTQfhzU2s9WE2WMckQBXHVckD89qe+KtOa7sru3K7kEAevasi0ifJmJkKzQlsKegUHpWvGsf+CfNqSe/wBmxI/ilQu4bpU0lhIQMVxw6FnghnxsyKR+lFZrpA/LttTly/QgUF9i5fW7Rdaq7AUS1SdZHIGKGtVlLoG+mNMQwMV0yYxXSYUZroOGIGKCaCSALy79aUviVADYJOoBZMgA9yf/AJvTrHEpXNL/AMQraOXhm5fq0OJB7A7/ANKFctwYah6mir8KFM0NzJnBBzkDzp/1G9h03TmnkyXf5YwDjOO9JXwMQ3VrqarsFZAPTrVzj+6uEvJAilxEPDiXzbz/AHrm7Vu1o63HfGhNC1xDq2s3TM0VyYIiejNigVnrF9bzHm1DmPN05sirOrWvEXhA21lEmVJJlIZydurHOAd9gKDT6NeAxNIkPisxD8pC4GdunWtij8TI7Hz12aRoc8+oWwdMsT5dKHcXXsulR8sjFQ1GPhZYTWccsE5LqRzKSO1Dvidprajd2yBX5F5iMd6DFfI2ST9rkZwJv4heBYxcM2f/AFj+5pitBNpcauzXUW+Q8gBX9RsKDx6CAjwXF4YpWYFSAUAHljO/+Ku6fw3JaQFYdUkZ3wMs2Q23dc439q0NLXkwrly8DlY6qb+HklH3q9W/F61l3xNsRonEqXkS+HBfREMQNg+d/wBR+1aHwvpV9aSgPFhU6EHIIoN8c7SOXRbR2GOWUjOOmVqKJf8AQ9lR3UwlwFqLHh+FpDnBZF9gcCr13cl5CwJ3pe4JgltOGrKC4UpLyczqeqknOKMOyedPIdRRy1j+TOC3M1RTuFHWq9xdcjHBoXc3ckjkDpU80C4j+k7McUQtwoUHvQiMjmwD0ohYyBm5SalhVsLRkeH1xVG5+yyxTxXatJC8bK6r1II3qS6couFoRLchHy7e4oc1uLQauahZFyXRd/8AH6FLe31mBT4jeJHg9yPmH9q0G54ZtbiU3Dxq7A5GR3pM+GNnFpXGV9aQMWjubJJ+u3Opyf6MP0rQ5L4AHLAY9a5W3bs2d5jVJR4v6EfXOEJJJCVu3iQncKAf3odacMWFhL4jHxZvxyfMR7eVNmq6nEoKq2/p3pZTUYbnWILBZOVpXwxJ2UeZNGT0j1lMNhXTLSQSSyopAC4JO1L3E9pO08bopIjzn0zTyZ9Pjs/AhukLIfnOdyaVNY1C1DCWSdSoO+DnNeqe/IayCUdFfTbG3vrVPtkMcnN+NRRjTuF9GikEiWNsjdiqDNJl3r0dhdpNasz2zn542/kPmPemOy4gWSJWBG47d6Jy15AVVxYfubKyt0JVFU9iKyn4yW5uNGCIACsqt6Hene41cyfU+37Uq8bRm/gtLaMnMlwi5/PerQl8tozZcFx0KiXjQFYOYsVAXbvtRyy0m/uoVlZGjVuhPemlPh5HBGt4VLcuDv3r9q+px29mba3QeIuw9KbKT1o4+Ve5MWp9ENvFzyMG9TUNpplpKxJIOOtVNS1u4wY5ug70T4OFtdlZGkGD5mqc+9ItFR8BOxtA8pLSHBNXZLaK3PiCTNCrN3DY8RhVh4mkO7mry5HuUNeC5cXgFsSfKk/Ub2SSdgpPltTNNAPsxA70tyW3h3BJHU175PyDbianwXaLDbaXxLzry3UC28kZGCCuzEH3AqfU7sQmZOfPKSPagXDfEZs+H4dJeBGQXBcStuVDEZA8qh1+fku5M55WOT2HlSG+qULHs7LFzFZXGSe3pbBuuaoUR35tgMk0uaXfx8s93MxyRkY647UU12xF5p0qgkbEg+e1I9ne3en3Mdve6eqxuo5LiWT7s47HbaiVpNEX3S3o4vde1zTJHubS4lkQvvHISy4PkaGX+p8RavcfZ18SONtz4QOM+RNaRp9tbXdvAl1xFpFqr833COnMuN+5/OhN/f8ACNoMTcd2IlWQxvHDIhYdQNlyaLGS/RlbWtOYD0K4W0smtZSSerEjP5Ve0DWZI702IkEiE/dMDv7UFvP4vqssEehXMzxuRz3E8HIMf9QwyTR/RuH1sdVshcXLzzkMxZsdh2xXrEtbZNcpxa0+g5LqBgUPK4Vf3q7w3dLfcR6UrqPDErEluh2O4pb1x1kmZAfkG35kGrvB1rc6pqXhW7FRAplz+Ek4qKY7ZGVfpNs3HWtRgXS3hgKs3L2rI7u2upb2YvEyBmyDWg6TataW/Ndtz4HelzXtWtjeFIkxtg4ply29MSe21HkmZZxijWnOD1FDODNTuYp3RSSuc0d40gN5c8xJAAxigukQpaTbYOapJNPoycNvs0KBvn2q7E+TQ5Nm2q3C24rdoz8mX5TmKgtymZOnei5OUxVGVMtUaIcj8m0OOlW72fx7TmlPMXXlOW3z5/0qrj5QK4vVY2uyhgPq8/SsedVygpL6GXpeRxscP2d295keCxBBUYHpiiHD2nwXmkNDcwrJh26jPfrSfJdJETlDkA99j6U7fDqX7XZyRFQj45lUuMmlEk4raOirnymkwLqnB3BEcpe64d0x3Y7sYVBPv51Vt4eFNLJGn6ZZWR6FhGqg+1N3FnDo1S0II5WU5G+CTSNpnBl7JqardH7iInY53NFrsbj2w1ls4vSig5YrHLmVDzAjOQMDFCNZl8DVxPzKOQFQPMU4zx22m2koHLzRrzctZTxXrBuL4mIDKuCADvuf616Kc2Zr7NefJ+uL3LEsO+N/6U+/CBBa2FxeSEl7iTAz+Ff85rK5pW8QKFzgHlHbP+9q1bQJEsbCC3XYJGBWvHh3sUZ93xSHXVL9fszAHtSFfFftLydzRO+vueEgMaAXUmQTW7iKXY9aFri2dw5KHAAqjwp/y58SDODVzXl8VTUHCieDOT61RrsGrHyHlrbkkYBicGvB8jYNMvEuhixcuhx3OKCOkMiBF5A3pRK7VJJoLbS4vR6jjlqF2HNV+HTXWPneRce1Dr0KkmBjPpRYyTfQGUWl2d5yKmhgF0kkGMkxsR23Aqop2orwyOfWrdMcwYkEenKaHk/il/AuH+eH9QhanDJDBNGeVSjZ+YEV1wzxE2m3iRzylXDZVgPqz19KbuMtMaOVPuS6jPzL1A8s1neq2aySNzLIgHVlG60jrkpxOosg65Gu2fEqSiNXKsT9R5uld3msWbRNyyEFBkknGP8A6awv7RqlqCLeRmQ/Vzdcdqll1TUyjovLGDvzc3arcEXWS9aY5cV8TW8aSOrbMCOp2/3NZne3Mt1e+OQxJYgYPUA15Kk88we4n8Q9eVulWobV7qRLeMMGzsMbe+aNHUUZJyc2FuGLOS8u445Q/KXB5ieuN+lPstwI5mXPQ4qlwhpH2SNXKgkLyBvPzq7xDZywzLcLG5hlH1gbBh1H96JiWxdrizL6jjz9hTS8MilvAwIDGq08mV61AhyPOopXbcYppxOecypf7qar6W3hynNSXDE1DbnDHNRwKc+z6A4qspZYyuCfbFIN3YG1uAwcqxPc1rerLEwPOFHuaVNVj01FLSvFn1FK8e5paOgyaVJ7Fi5aZLTPjn2xQlQsmWY5NF7+8s5j4NqfEJ6KgzVay0kTT808oRR9Sqenuf7Ct0LFFbYvnU5vUeyrBC8p5IlZ28h1p94D4eENnPq10wMg5oYkBzyn+Yn9v1pT4g1GLTLSCOwRYkPNkgblvX8s0Q+FvF0LpPw/dTBZHkMttzHZs/Uvv3/Wl/qF1kqWoDf0rFqrvTs8/X9D2p28c0bRuobsfakfiHQZVjeSD587sDnp6eVP1+h8Qt50NuEJUg+VJ6ZOJ0F8VIxTV9OvI7j5V9QSMihsun3KRbRnLdj/AL0rXb6zQsQ8ex74oZNYpn5Y1/StitMDpMxh0qdnz4bGQnGVOw9RTnw1w8LdVkm27keZo7ZaaniZ8IefSiEkbKFRV3r0rGyYVJEaKF5VRQABjA7VX4+1OPTeFG35ZZZY1i88g5J/TNEjGsEDyysqhFyxOwArGePOJH1/VgIGIsbccsIH8x7v+fb096vi1SnYn9Irl3Kupr7Y0adq0d2uAAWZc8p2BYeXlmpYnguyq2xYyOcBHwCT3HuPKkrR5pIwXJOwwPSil5KJYE1BSeV8LcBNirDo48jTtNo5ydULPIWv7O8gJMtrMgHUlDj9elD3O1drxLfWZVpZ2JXCz4+l1P0yD9iPzonbT6VqjzGYNFMxyHjbzHdelTG9p6kgFnpza3W/9P/Z><div class="flex-1 px-2 items-center"><p class="text-base font-bold text-base md:text-xl leading-none">Mattias Geniar, July 30, 2016<p class="font-thin text-base mt-2">Follow me on Twitter as <a class="underline hover:no-underline"href=https://twitter.com/mattiasgeniar> @mattiasgeniar </a></div></div><main><div class="content blog-content"><p class=lead>The QUIC protocol (Quick UDP Internet Connections) is an entirely new protocol for the web developed on top of UDP instead of TCP.<p class=lead>Some are even (jokingly) calling it <a href=https://daniel.haxx.se/blog/2016/07/27/workshop-day-two/> TCP/2 </a> .<p>I only learned about QUIC a few weeks ago while doing the <a href=http://podcast.sysca.st/podcast/4-curl-libcurl-future-web-daniel-stenberg/> curl & libcurl episode of the SysCast podcast </a> .<p>The really interesting bit about the QUIC protocol is the move to UDP.<p>Now, the web is built on top of TCP for its reliability as a transmission protocol. To start a TCP connection a  <em> 3-way handshake </em> is performed. This means additional round-trips <em> (network packets being sent back and forth) </em> for each starting connection which adds significant delays to any new connection.<p><img class="alignnone size-full wp-image-8056"alt=tcp_3_way_handshake height=294 src=/wp-content/uploads/2016/07/tcp_3_way_handshake.png width=346><p><em class=source-mention> (Source: <a href=https://www.nanog.org/sites/default/files//meetings/NANOG64/1051/20150603_Rogan_Quic_Next_Generation_v1.pdf> Next generation multiplexed transport over UDP (PDF) </a> ) </em><p>If on top of that you also need to negotiate TLS, to create a secure, encrypted, https connection, even more network packets have to be sent back and forth.<p><img class="alignnone size-full wp-image-8057"alt=tcp_3_way_handshake_with_tls height=388 src=/wp-content/uploads/2016/07/tcp_3_way_handshake_with_tls.png width=388><p><em class=source-mention> (Source: <a href=https://www.nanog.org/sites/default/files//meetings/NANOG64/1051/20150603_Rogan_Quic_Next_Generation_v1.pdf> Next generation multiplexed transport over UDP (PDF) </a> ) </em><p>Innovation like <a href=https://en.wikipedia.org/wiki/TCP_Fast_Open> TCP Fast Open </a> will improve the situation for TCP, but this isn’t widely adopted yet.<p>UDP on the other hand is more of a  <em> fire and forget </em> protocol. A message is sent over UDP and it’s  <em> assumed </em> to arrive at the destination. The benefit is less time spent on the network to validate packets, the downside is that in order to be reliable, something has to be built  <em> on top of </em> UDP to confirm packet delivery.<p>That’s where Google’s QUIC protocol comes in.<p>The QUIC protocol can start a connection <em> and </em> negotiate all the TLS (HTTPs) parameters in 1 or 2 packets (depends on if it’s a new server you are connecting to or a known host).<p><img class="alignnone size-full wp-image-8058"alt=udp_quic_with_tls height=281 src=/wp-content/uploads/2016/07/udp_quic_with_tls.png width=356><p><em class=source-mention> (Source: <a href=https://www.nanog.org/sites/default/files//meetings/NANOG64/1051/20150603_Rogan_Quic_Next_Generation_v1.pdf> Next generation multiplexed transport over UDP (PDF) </a> ) </em><p>This can make a huge difference for the initial connection and start of download for a page.<h2 id=why-is-quic-needed>Why is QUIC needed?</h2><p>It’s absolutely mind boggling what the team developing the QUIC protocol is doing. It wants to combine the speed and  <em> possibilities </em> of the UDP protocol with the reliability of the TCP protocol.<p>Wikipedia explains it fairly well.<blockquote><p>As improving TCP is a long-term goal for Google, QUIC aims to be nearly equivalent to an independent TCP connection, but with much reduced latency and better SPDY-like stream-multiplexing support.<p>If QUIC features prove effective, those features could migrate into a later version of TCP and TLS (which have a notably longer deployment cycle).<p><a href=https://en.wikipedia.org/wiki/QUIC> <cite> QUIC </cite> </a></blockquote><p>There’s a part of that quote that needs emphasising: <em> <strong> if QUIC features prove effective, those features could migrate into a later version of TCP </strong> . </em><p>The TCP protocol is rather highly regulated. Its implementation is inside the Windows and Linux kernel, it’s in each phone OS, … it’s pretty much in every low-level device. Improving on the way TCP works is going to be hard, as each of those TCP implementation needs to follow.<p>UDP on the other hand is relatively simple in design. It’s  <em> faster </em> to implement a new protocol on top of UDP to prove some of the theories Google has about TCP. That way, once they can confirm their theories about network congestion, stream blocking, … they can begin their efforts to move the good parts of QUIC to the TCP protocol.<p>But altering the TCP stack requires work from the Linux kernel & Windows, intermediary middleboxes, users to update their stack, … Doing the same thing in UDP is much more difficult for the developers making the protocol but allows them to iterate much faster and implement those theories in  <em> months </em> instead of  <em> years or decades </em> .<h2 id=where-does-quic-fit-in>Where does QUIC fit in?</h2><p>If you look at the layers which make up a modern HTTPs connection, QUIC replaces the TLS stack and parts of HTTP/2.<p>The QUIC protocol implements its <a href=https://docs.google.com/document/d/1g5nIXAIkN_Y-7XJW5K45IblHd_L2f5LTaDUDwvZ5L6g/edit> own crypto-layer </a> so does not make use of the existing TLS 1.2.<p><img class="alignnone size-full wp-image-8094"alt=tcp_udp_quic_http2_compared height=636 src=/wp-content/uploads/2016/07/tcp_udp_quic_http2_compared.png width=1344><p>It replaces TCP with UDP and on top of QUIC is a smaller HTTP/2 API used to communicate with remote servers. The reason it’s smaller is because the multiplexing and connection management is already handled by QUIC. What’s left is an interpretation of the HTTP protocol.<h2 id=tcp-head-of-line-blocking>TCP head-of-line blocking</h2><p>With SPDY and <a href=/?s=http2> HTTP/2 </a> we now have a single TCP connection being used to connect to a server instead of multiple connections for each asset on a page. That one TCP connection can independently request and receive resources.<p><img class="alignnone size-full wp-image-8064"alt=spdy_multiplexed_assets height=228 src=/wp-content/uploads/2016/07/spdy_multiplexed_assets.png width=850><p><em class=source-mention> (Source: <a href=https://docs.google.com/presentation/d/13LSNCCvBijabnn1S4-Bb6wRlm79gN6hnPFHByEXXptk/present?slide=id.g17a0599c4_1164> QUIC: next generation multiplexed transport over UDP </a> ) </em><p>Now that everything depends on that single TCP connection, a downside is introduced: <strong> head-of-line blocking </strong> .<p>In TCP, packets need to <strike> arrive </strike> be processed in the correct order. If a packet is lost on its way to/from the server, it needs to be retransmitted. The TCP connection needs to wait (or “block”) on that TCP packet before it can continue to parse the other packets, because <strong> the order in which TCP packets are processed matters. </strong><p><img class="alignnone size-full wp-image-8066"alt=spdy_multiplexed_assets_head_of_line_blocked height=256 src=/wp-content/uploads/2016/07/spdy_multiplexed_assets_head_of_line_blocked.png width=745><p><em class=source-mention> (Source: <a href=https://docs.google.com/presentation/d/13LSNCCvBijabnn1S4-Bb6wRlm79gN6hnPFHByEXXptk/present?slide=id.g17a0599c4_1164> QUIC: next generation multiplexed transport over UDP </a> ) </em><p>In QUIC, this is solved by not making use of TCP anymore.<p><strong> UDP is not dependent on the order in which packets are received. </strong> While it’s still possible for packets to get lost during transit, they will only impact an individual resource (as in: a single CSS/JS file) and not block the entire connection.<p><img class="alignnone size-full wp-image-8068"alt=quic_multiplexing height=233 src=/wp-content/uploads/2016/07/quic_multiplexing.png width=860><p><em class=source-mention> (Source: <a href=https://docs.google.com/presentation/d/13LSNCCvBijabnn1S4-Bb6wRlm79gN6hnPFHByEXXptk/present?slide=id.g17a0599c4_1164> QUIC: next generation multiplexed transport over UDP </a> ) </em><p>QUIC is essentially combining the best parts of SPDY and HTTP2 (the multiplexing) on top of a non-blocking transportation protocol.<h2 id=why-fewer-packets-matter-so-much>Why fewer packets matter so much</h2><p>If you’re lucky enough to be on a fast internet connection, you can have latencies between you and a remote server between the 10-50ms range. Every packet you send across the network will take that amount of time to be received.<p>For latencies < 50ms, the benefit may not be immediately clear.<p>It’s mostly noticeable when you are talking to a server on another continent or via a mobile carrier using Edge, 3G/4G/LTE. To reach a server from Europe in the US, you have to cross the Atlantic ocean. You immediately get a latency penalty of <strong> +100ms </strong> or higher purely because of the distance that needs to be traveled.<p><img class="alignnone size-full wp-image-8073"alt=network_round_trip_europe_london height=437 src=/wp-content/uploads/2016/07/network_round_trip_europe_london.png width=973><p><em class=source-mention> (Source: <a href=https://docs.google.com/presentation/d/13LSNCCvBijabnn1S4-Bb6wRlm79gN6hnPFHByEXXptk/present?slide=id.g17a0599c4_1164> QUIC: next generation multiplexed transport over UDP </a> ) </em><p>Mobile networks have the same kind of latency: it’s not unlikely to have a 100-150ms latency between your mobile phone and a remote server on a slow connection, merely because of the radio frequencies and intermediate networks that have to be traveled. In 4G/LTE situations, a 50ms latency is easier to get.<p>On mobile devices and for large-distance networks, the difference between sending/receiving 4 packets (TCP + TLS) and 1 packet (QUIC) can be up to 300ms of saved time for that initial connection.<h2 id=forward-error-correction-preventing-failure>Forward Error Correction: preventing failure</h2><p>A nifty feature of QUIC is FEC or <strong> Forward Error Correction </strong> . Every packet that gets sent also includes enough data of the other packets so that a missing packet can be reconstructed without having to retransmit it.<p><strong> This is essentially RAID 5 on the network level. </strong><p>Because of this, there is a trade-off: each UDP packet contains more <em> payload </em> than is strictly necessary, because it accounts for the <em> potential </em> of missed packets that can more easily be recreated this way.<p>The current ratio seems to be around 10 packets. So for every 10 UDP packets sent, there is enough data to reconstruct a missing packet. A 10% overhead, if you will.<p>Consider Forward Error Correction as a sacrifice in terms of <em> “data per UDP packet” </em> that can be sent, but the gain is not having to retransmit a lost packet, which would take a lot longer <em> (recipient has to confirm a missing packet, request it again and await the response) </em> .<h2 id=session-resumption--parallel-downloads>Session resumption & parallel downloads</h2><p>Another exciting opportunity with the switch to UDP is the fact that you are no longer dependent on the <em> source IP </em> of the connection.<p>In TCP, you need 4 parameters to make up a connection. The so-called <strong> quadruplets </strong> .<p>To start a new TCP connection, you need a source IP, source port, destination IP and destination port. On a Linux server, you can see those quadruplets using <code>
         netstat
        </code> .<pre>$ netstat -anlp | grep ':443'
...
tcp6       0      0 2a03:a800:a1:1952::f:443 2604:a580:2:1::7:57940  TIME_WAIT   -
tcp        0      0 31.193.180.217:443       81.82.98.95:59355       TIME_WAIT   -
...
</pre><p>If any of the parameters (source IP/port or destination IP/port) change, a new TCP connection needs to be made.<p>This is why keeping a stable connection on a mobile device is so hard, because you may be constantly switching between WiFi and 3G/LTE.<p><img class="alignnone size-full wp-image-8102"alt=quic_parking_lot_problem height=902 src=/wp-content/uploads/2016/07/quic_parking_lot_problem.png width=1720><p><em class=source-mention> (Source: <a href=https://docs.google.com/presentation/d/13LSNCCvBijabnn1S4-Bb6wRlm79gN6hnPFHByEXXptk/present?slide=id.g17a0599c4_1164> QUIC: next generation multiplexed transport over UDP </a> ) </em><p>With QUIC, since it’s now using UDP, there are no quadruplets.<p>QUIC has implemented its own identifier for unique connections called the <strong> Connection UUID </strong> . It’s possible to go from WiFi to LTE and still keep your Connection UUID, so no need to renegotiate the connection or TLS. Your previous connection is still valid.<p>This works the same way as the <a href=https://mosh.mit.edu/> Mosh Shell </a> , keeping SSH connections alive over UDP for a better roaming & mobile experience.<p>This also opens the doors to using multiple sources to fetch content. If the Connection UUID can be shared over a WiFi <em> and </em> cellular connection, it’s in theory possible to use both media to download content. You’re effectively streaming or downloading content in parallel, using every available interface you have.<p>While still theoretical, UDP allows for such innovation.<h2 id=the-quic-protocol-in-action>The QUIC protocol in action</h2><p>The Chrome browser has had (experimental) support for QUIC since 2014. If you want test QUIC, <a href=/enable-quic-protocol-google-chrome/> you can enable the protocol in Chrome </a> . Practically, you can only test the QUIC protocol against Google services.<p>The biggest benefit Google has is the combination of owning both the <em> browser </em> and the <em> server </em> marketshare. By enabling QUIC on both the client (Chrome) and the server (Google services like YouTube, Google.com), they can run large-scale tests of new protocols <em> in production </em> .<p>There’s a convenient Chrome plugin that can show the HTTP/2 and QUIC protocol as an icon in your browser: <a href=https://chrome.google.com/webstore/detail/http2-and-spdy-indicator/mpbpobfflnpcgagjijhmgnchggcjblin?hl=en> HTTP/2 and SPDY indicator </a> .<p>You can see how QUIC is being used by opening the <code>
         chrome://net-internals/#quic
        </code> tab right now (you’ll also notice the <strong> Connection UUID </strong> mentioned earlier).<p><img class="alignnone size-full wp-image-8079"alt=quic_net_internals_sessions height=260 src=/wp-content/uploads/2016/07/quic_net_internals_sessions.png width=936><p>If you’re interested in the low-level details, you can even see all the live connections and get individual per-packet captures: <code>
         chrome://net-internals/#events&q=type:QUIC_SESSION%20is:active
        </code> .<p><img class="alignnone size-full wp-image-8080"alt=quic_debug_packets_chrome height=355 src=/wp-content/uploads/2016/07/quic_debug_packets_chrome.png width=1010><p>Similar to how you can see the internals of a SDPY or HTTP/2 connection.<h2 id=wont-someone-think-of-the-firewall>Won’t someone think of the firewall?</h2><p>If you’re a sysadmin or network engineer, you probably gave a little shrug at the beginning when I mentioned QUIC being UDP instead of TCP. You’ve probably got a good reason for that, too.<p>For instance, when we at <a href=https://www.nucleus.be/en/> Nucleus Hosting </a> configure a firewall for a webserver, those firewall rules look like these.<p><img class="alignnone size-full wp-image-8082"alt=firewall_http_https_incoming_allow height=119 src=/wp-content/uploads/2016/07/firewall_http_https_incoming_allow.png width=881><p>Take special note of the <strong> protocol column: TCP </strong> .<p>Our firewall isn’t very different from the one deployed by thousands of other sysadmins. At this time, there’s no reason for a webserver to allow anything other than <code>
         80/TCP
        </code> or <code>
         443/TCP
        </code> . TCP only. No UDP.<p>Well, if we want to allow the QUIC protocol, we will need to allow <code>
         443/UDP
        </code> too.<p>For servers, this means opening incoming <code>
         443/UDP
        </code> to the webserver. For clients, it means allowing outgoing <code>
         443/UDP
        </code> to the internet.<p>In large enterprises, I can see this be an issue. Getting it past security to allow UDP on a normally TCP-only port sounds <em> fishy </em> .<p>I would’ve actually thought this to be a major problem in terms of connectivity, but as Google has done the experiments – this turns out to <a href=https://www.ietf.org/proceedings/96/slides/slides-96-quic-3.pdf> not be the case </a> .<p><img class="alignnone wp-image-8083 size-medium"alt=quic_connection_statistics height=195 src=/wp-content/uploads/2016/07/quic_connection_statistics-300x195.png width=300><p><em class=source-mention> (Source: <a href=https://www.ietf.org/proceedings/96/slides/slides-96-quic-3.pdf> QUIC Deployment Experience @Google </a> ) </em><p>Those numbers were given at a recent HTTP workshop in Sweden. A couple of key-pointers;<ul><li>Since QUIC is only supported on Google Services now, the server-side firewalling is probably OK.<li>These numbers are client-side only: they show how many clients are allowed to do UDP over port 443.<li>QUIC can be disabled in Chrome for compliance reasons. I bet there are a lot of enterprises that have disabled QUIC so those connections aren’t even attempted.</ul><p>Since QUIC is also TLS-enabled, we only need to worry about UDP on port 443. UDP on port 80 isn’t very likely to happen soon.<p>The advantage of doing things encrypted-only is that Deep Packet Inspection middleware (aka: intrusion prevention systems) can’t decrypt the TLS traffic and modify the protocol, they see binary data over the fire and will – hopefully – just let it go through.<h2 id=running-quic-server-side>Running QUIC server-side</h2><p>Right now, the only webserver that can get you QUIC is <a href=https://github.com/mholt/caddy/wiki/QUIC> Caddy </a> since version 0.9.<p>Both client-side and server-side support is considered experimental, so it’s up to you to run it.<p>Since no one has QUIC support enabled by default in the client, you’re probably still safe to run it and enable QUIC in your own browser(s). ( <strong> Update: since Chrome 52, everyone has QUIC enabled by default, even to non-whitelisted domains </strong> )<p>To help debug QUIC I hope curl will implement it soon, <a href=https://daniel.haxx.se/blog/2016/07/20/curl-wants-to-quic/> there certainly is interest </a> .<h2 id=performance-benefits-of-quic>Performance benefits of QUIC</h2><p>In a <a href=http://blog.chromium.org/2015/04/a-quic-update-on-googles-experimental.html> 2015 blogpost </a> Google has shared several results from the QUIC implementation.<blockquote><p>As a result, QUIC outshines TCP under poor network conditions, shaving a full second off the Google Search page load time for the slowest 1% of connections.<p>These benefits are even more apparent for video services like YouTube. Users report 30% fewer rebuffers when watching videos over QUIC.</blockquote><blockquote><p><cite> <a href=http://blog.chromium.org/2015/04/a-quic-update-on-googles-experimental.html> A QUIC update on Google’s experimental transport (2015) </a> </cite></blockquote><p>The YouTube statistics are especially interesting. If these kinds of improvements are possible, we’ll see a quick adoption in video streaming services like Vimeo or “adult streaming services”.<h2 id=conclusion>Conclusion</h2><p>I find the QUIC protocol to be truly fascinating!<p><a name=roskind> </a><p>The amount of work that has gone into it, the fact that it’s already running for the biggest websites available and that it’s <em> working </em> blow my mind.<p>I can’t wait see the QUIC spec become final and implemented in other browsers and webservers!<h2 id=update-comment-from-jim-roskind-designer-of-quic>Update: comment from Jim Roskind, designer of QUIC</h2><p>Jim Roskind was kind enough to leave a comment on this blog ( <a href=#comment-36462> see below </a> ) that deserves emphasising.<blockquote><p>Having spent years on the research, design and deployment of QUIC, I can add some insight. Your comment about UDP ports being blocked was exactly my conjecture when we were experimenting with QUIC’s (UDP) viability (before spending time on the detailed design and architecture). My conjecture was that the reason we could only get 93% reachability was because enterprise customers were commonly blocking UDP (perchance other than what was needed for DNS).<p>If you recall that historically, enterprise customers routinely blocked TCP port 80 “to prevent employees from wasting their time surfing,” then you know that overly conservative security does happen (and usability drives changes!). As it becomes commonly known that allowing UDP:443 to egress will provide better user experience (i.e., employees can get their job done faster, and with less wasted bandwidth), then I expect that usability will once again trump security … and the UDP:443 port will be open in most enterprise scenarios.<p>… also … your headline using the words “TCP/2” may well IMO be on target. I expect that the rate of evolution of QUIC congestion avoidance will allow QUIC to track the advances (new hardware deployment? new cell tower protocols? etc.) of the internet much faster than TCP.<p>As a result, I expect QUIC to largely displace TCP, even as QUIC provides any/all technology suggestions for incorporation into TCP. TCP is routinely implemented in the kernel, which makes evolutionary steps take 5-15 years (including market penetration!… not to mention battles with middle-boxes), while QUIC can evolve in the course of weeks or months.<p><cite> <a href=#comment-36462> – Jim (QUIC Architect) </a> </cite></blockquote><p>Thanks Jim for the feedback, it’s amazing to see the original author of the QUIC protocol respond!<h2 id=further-reading>Further reading</h2><p>If you’re looking for more information, have a look at these resources:<ul><li><a href=https://www.nanog.org/sites/default/files//meetings/NANOG64/1051/20150603_Rogan_Quic_Next_Generation_v1.pdf> QUIC: Next generation multiplexed transport over UDP </a><li><a href=https://www.ietf.org/proceedings/96/slides/slides-96-quic-3.pdf> QUIC Deployment experiences @ Google </a><li><a href=https://docs.google.com/document/d/1RNHkx_VvKWyWg6Lr8SZ-saqsQx7rFV-ev2jRFUoVD34/mobilebasic> Design and Rationale of QUIC </a><li><a href=https://tools.ietf.org/html/draft-tsvwg-quic-protocol-00> IETF Draft: QUIC: A UDP-Based Secure and Reliable Transport for HTTP/2 </a></ul><p>Many thanks to Google for leading the efforts here!</div><aside class="hidden lg:block tableOfContentContainer border-indigo-200"id=tableOfContentContainer><h3>Table of contents</h3><nav id=TableOfContents><ul><li><ul><li><a href=#why-is-quic-needed> Why is QUIC needed? </a><li><a href=#where-does-quic-fit-in> Where does QUIC fit in? </a><li><a href=#tcp-head-of-line-blocking> TCP head-of-line blocking </a><li><a href=#why-fewer-packets-matter-so-much> Why fewer packets matter so much </a><li><a href=#forward-error-correction-preventing-failure> Forward Error Correction: preventing failure </a><li><a href=#session-resumption--parallel-downloads> Session resumption & parallel downloads </a><li><a href=#the-quic-protocol-in-action> The QUIC protocol in action </a><li><a href=#wont-someone-think-of-the-firewall> Won’t someone think of the firewall? </a><li><a href=#running-quic-server-side> Running QUIC server-side </a><li><a href=#performance-benefits-of-quic> Performance benefits of QUIC </a><li><a href=#conclusion> Conclusion </a><li><a href=#update-comment-from-jim-roskind-designer-of-quic> Update: comment from Jim Roskind, designer of QUIC </a><li><a href=#further-reading> Further reading </a></ul></ul></nav></aside></main><script>window.addEventListener('DOMContentLoaded', () => {
                    


                    const observerForTableOfContentActiveState = new IntersectionObserver(entries => {
                        entries.forEach(entry => {
                            const id = entry.target.getAttribute('id');

                            if (entry.intersectionRatio > 0) {
                                
                                clearActiveStatesInTableOfContents();

                                
                                document.querySelector(`aside nav li a[href="#${id}"]`).parentElement.classList.add('active');
                            }
                        });
                    });

                    
                    document.querySelectorAll('h1[id],h2[id],h3[id],h4[id]').forEach((section) => {
                        observerForTableOfContentActiveState.observe(section);
                    });

                });

                function clearActiveStatesInTableOfContents() {
                    document.querySelectorAll('aside nav li').forEach((section) => {
                        section.classList.remove('active');
                    });
                }</script><hr class="border border-2 border-gray-100 mt-8"><div class="content comments mt-8 overflow-hidden"><div class="w-full text-center pl-4"><ul class="list-reset flex flex-wrap justify-between share-links"><li class="mb-4 md:mb-0"><a class=share href=https://twitter.com/intent/tweet?text=Google%e2%80%99s%20QUIC%20protocol%3a%20moving%20the%20web%20from%20TCP%20to%20UDP&via=mattiasgeniar&url=https%3a%2f%2fma.ttias.be%2fgoogles-quic-protocol-moving-web-tcp-udp%2f target=_blank> <svg viewbox="0 0 512 512"aria-hidden=true class=text-blue-900 data-icon=twitter data-prefix=fab focusable=false role=img xmlns=http://www.w3.org/2000/svg><path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"></path></svg> </a><li class="mb-4 md:mb-0"><a href=https://www.facebook.com/dialog/share?app_id=561520434630185&display=popup&href=https%3a%2f%2fma.ttias.be%2fgoogles-quic-protocol-moving-web-tcp-udp%2f&redirect_uri=https%3a%2f%2fma.ttias.be%2fgoogles-quic-protocol-moving-web-tcp-udp%2f target=_blank> <svg viewbox="0 0 320 512"aria-hidden=true class=text-blue-900 data-icon=facebook-f data-prefix=fab focusable=false role=img xmlns=http://www.w3.org/2000/svg><path d="M279.14 288l14.22-92.66h-88.91v-60.13c0-25.35 12.42-50.06 52.24-50.06h40.42V6.26S260.43 0 225.36 0c-73.22 0-121.08 44.38-121.08 124.72v70.62H22.89V288h81.39v224h100.17V288z"></path></svg> </a><li class="mb-4 md:mb-0"><a href=https://www.reddit.com/submit?url=https%3a%2f%2fma.ttias.be%2fgoogles-quic-protocol-moving-web-tcp-udp%2f target=_blank> <svg viewbox="0 0 512 512"aria-hidden=true class=text-blue-900 data-icon=reddit data-prefix=fab focusable=false role=img xmlns=http://www.w3.org/2000/svg><path d="M201.5 305.5c-13.8 0-24.9-11.1-24.9-24.6 0-13.8 11.1-24.9 24.9-24.9 13.6 0 24.6 11.1 24.6 24.9 0 13.6-11.1 24.6-24.6 24.6zM504 256c0 137-111 248-248 248S8 393 8 256 119 8 256 8s248 111 248 248zm-132.3-41.2c-9.4 0-17.7 3.9-23.8 10-22.4-15.5-52.6-25.5-86.1-26.6l17.4-78.3 55.4 12.5c0 13.6 11.1 24.6 24.6 24.6 13.8 0 24.9-11.3 24.9-24.9s-11.1-24.9-24.9-24.9c-9.7 0-18 5.8-22.1 13.8l-61.2-13.6c-3-.8-6.1 1.4-6.9 4.4l-19.1 86.4c-33.2 1.4-63.1 11.3-85.5 26.8-6.1-6.4-14.7-10.2-24.1-10.2-34.9 0-46.3 46.9-14.4 62.8-1.1 5-1.7 10.2-1.7 15.5 0 52.6 59.2 95.2 132 95.2 73.1 0 132.3-42.6 132.3-95.2 0-5.3-.6-10.8-1.9-15.8 31.3-16 19.8-62.5-14.9-62.5zM302.8 331c-18.2 18.2-76.1 17.9-93.6 0-2.2-2.2-6.1-2.2-8.3 0-2.5 2.5-2.5 6.4 0 8.6 22.8 22.8 87.3 22.8 110.2 0 2.5-2.2 2.5-6.1 0-8.6-2.2-2.2-6.1-2.2-8.3 0zm7.7-75c-13.6 0-24.6 11.1-24.6 24.9 0 13.6 11.1 24.6 24.6 24.6 13.8 0 24.9-11.1 24.9-24.6 0-13.8-11-24.9-24.9-24.9z"></path></svg> </a><li class="mb-4 md:mb-0"><a href=https://news.ycombinator.com/submitlink?u=https%3a%2f%2fma.ttias.be%2fgoogles-quic-protocol-moving-web-tcp-udp%2f&t=Google%e2%80%99s%20QUIC%20protocol%3a%20moving%20the%20web%20from%20TCP%20to%20UDP target=_blank> <svg viewbox="0 0 448 512"aria-hidden=true class=text-blue-900 data-icon=hacker-news data-prefix=fab focusable=false role=img xmlns=http://www.w3.org/2000/svg><path d="M0 32v448h448V32H0zm21.2 197.2H21c.1-.1.2-.3.3-.4 0 .1 0 .3-.1.4zm218 53.9V384h-31.4V281.3L128 128h37.3c52.5 98.3 49.2 101.2 59.3 125.6 12.3-27 5.8-24.4 60.6-125.6H320l-80.8 155.1z"fill=currentColor></path></svg> </a><li class="mb-4 md:mb-0"><a href=https://www.linkedin.com/sharing/share-offsite/?url=https%3a%2f%2fma.ttias.be%2fgoogles-quic-protocol-moving-web-tcp-udp%2f target=_blank> <svg viewbox="0 0 448 512"aria-hidden=true class=text-blue-900 data-icon=linkedin data-prefix=fab focusable=false role=img xmlns=http://www.w3.org/2000/svg><path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"fill=currentColor></path></svg> </a></ul></div></div><hr class="border border-2 border-gray-100 mt-8"><div class="content comments border rounded-lg mt-12 overflow-hidden"><div class="w-full pr-4 bg-blue-300 p-4 px-8"><h3 class=text-5xl>Want to subscribe to the cron.weekly newsletter?</h3><p>I write a weekly-ish newsletter on Linux, open source & webdevelopment called <a href=/cronweekly> cron.weekly </a> .<p>It features the latest news, guides & tutorials and new open source projects. You can sign up via email below.<div class="w-full pr-4"><form accept-charset=utf-8 action=https://newsletter.ma.ttias.be/subscribe/03689300-e2ab-4566-874d-fda6b4f2e758 method=POST><div class="flex px-4 items-center"><div class="w-3/4 mr-4"><input class="appearance-none rounded shadow p-3 text-gray-700 mr-2 focus:outline-none w-full"placeholder="e-mail address"name=email></div><div class=important-address-information id=form-address><input id=address name=address><input id=name name=name><input id=website name=website><input id=url name=url></div><div class=w-1/4><input class="appearance-none text-white text-base font-semibold tracking-wide uppercase p-3 rounded shadow bg-blue-900 hover:bg-blue-800"name=submit type=submit value=Subscribe></div></div></form></div><p class="text-sm text-center">No spam. Just some good, practical Linux & open source content.</div></div></div></div></div><footer class="footer-curved mt-24"><div class="container max-w-4xl mx-auto flex py-8"><div class="w-full mx-auto flex flex-wrap"><div class="flex w-full md:w-1/2"><div class=px-8><h3 class="font-bold text-gray-900 text-2xl text-center lg:text-left">Who dis? 🤔</h3><p class="py-4 text-gray-900 text-xl leading-loose">Hi! I'm Mattias Geniar, an independent developer, Linux sysadmin & general problem solver. Looking for help? I'm available for hire as a <a class=link-dark href=/consultancy> consultant </a> . Want to get in touch? Have a look at <a class=link-dark href=/contact> my contact page </a> .</div></div><div class="flex w-full md:w-1/2"><div class=px-8><h3 class="font-bold text-gray-900 text-2xl">Follow me on social media 😇</h3><ul class="list-reset items-center text-xl pt-3"><li><a class="inline-block text-indigo-900 py-1 px-2 font"href=https://twitter.com/mattiasgeniar target=_blank> <svg class="w-6 h-6 inline-block text-gray-900 fill-current mr-1"viewbox="0 0 24 24"height=24 width=24 xmlns=http://www.w3.org/2000/svg><path d="M24 4.557c-.883.392-1.832.656-2.828.775 1.017-.609 1.798-1.574 2.165-2.724-.951.564-2.005.974-3.127 1.195-.897-.957-2.178-1.555-3.594-1.555-3.179 0-5.515 2.966-4.797 6.045-4.091-.205-7.719-2.165-10.148-5.144-1.29 2.213-.669 5.108 1.523 6.574-.806-.026-1.566-.247-2.229-.616-.054 2.281 1.581 4.415 3.949 4.89-.693.188-1.452.232-2.224.084.626 1.956 2.444 3.379 4.6 3.419-2.07 1.623-4.678 2.348-7.29 2.04 2.179 1.397 4.768 2.212 7.548 2.212 9.142 0 14.307-7.721 13.995-14.646.962-.695 1.797-1.562 2.457-2.549z"></path></svg> Twitter </a><li><a class="inline-block text-gray-900 py-1 px-2"href=https://www.linkedin.com/in/mattiasgeniar/ target=_blank> <svg class="w-6 h-6 inline-block text-gray-900 fill-current mr-1"viewbox="0 0 24 24"height=24 width=24 xmlns=http://www.w3.org/2000/svg><path d="M19 0h-14c-2.761 0-5 2.239-5 5v14c0 2.761 2.239 5 5 5h14c2.762 0 5-2.239 5-5v-14c0-2.761-2.238-5-5-5zm-11 19h-3v-11h3v11zm-1.5-12.268c-.966 0-1.75-.79-1.75-1.764s.784-1.764 1.75-1.764 1.75.79 1.75 1.764-.783 1.764-1.75 1.764zm13.5 12.268h-3v-5.604c0-3.368-4-3.113-4 0v5.604h-3v-11h3v1.765c1.396-2.586 7-2.777 7 2.476v6.759z"></path></svg> LinkedIn </a><li><a class="inline-block text-gray-900 py-1 px-2"href=https://github.com/mattiasgeniar target=_blank> <svg class="w-6 h-6 inline-block text-gray-900 fill-current mr-1"viewbox="0 0 24 24"height=24 width=24 xmlns=http://www.w3.org/2000/svg><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"></path></svg> GitHub </a><li><a class="inline-block text-gray-900 py-1 px-2"href=https://www.facebook.com/www.ma.ttias.be/ target=_blank> <svg class="w-6 h-6 inline-block text-gray-900 fill-current mr-1"viewbox="0 0 24 24"height=24 width=24 xmlns=http://www.w3.org/2000/svg><path d="M12 0c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm3 8h-1.35c-.538 0-.65.221-.65.778v1.222h2l-.209 2h-1.791v7h-3v-7h-2v-2h2v-2.308c0-1.769.931-2.692 3.029-2.692h1.971v3z"></path></svg> Facebook </a></ul></div></div></div></div></footer><script>document.getElementById('nav-toggle').onclick = function(){
    document.getElementById("nav-content").classList.toggle("hidden");
}</script>