\documentclass{beamer}
%\documentclass[ignorenonframetext,handout]{beamer}
%\usepackage{pgfpages}
%\pgfpagesuselayout{2 on 1}[a4paper,border shrink=5mm]

\usetheme{Antibes}
\usepackage[french]{babel}
\usepackage[utf8x]{inputenc}
\usepackage{bortzmeyer-utils}

\title{Le protocole QUIC, ou la nouvelle couche de transport (\insertframenumber/\inserttotalframenumber)}
\author{Stéphane Bortzmeyer\\\texttt{stephane+capitoledulibre@bortzmeyer.org}}
\date{Capitole du Libre, Toulouse, 16 novembre 2019}
\setlength{\parskip}{15pt plus 10pt minus 10pt} 
\newcommand{\of}{.6}

\begin{document}

\maketitle

\begin{frame}
  \frametitle{Retour sur le modèle en couches}
  \includegraphics[scale=0.45]{Internet_Protocol_Analysis_-_Transport_Layer.png}

  \tiny{Dave Braunschweig [CC BY-SA 3.0
      (https://creativecommons.org/licenses/by-sa/3.0)], via Wikimedia
  Commons} % https://commons.wikimedia.org/wiki/File:Internet_Protocol_Analysis_-_Transport_Layer.png
\end{frame}

\begin{frame}
  \frametitle{Ce que fait une couche Transport}
  \begin{overlayarea}{\textwidth}{\of\textheight}
    \begin{itemize}
      \item<2->Dissimuler aux applications les fantaisies du
        réseau\only<2>{ (paquets perdus, paquets réordonnancés…)},
      \item<3->Tout en contrôlant le flux de données\only<3>{ (ne pas
        étouffer le récepteur)},
      \item<4->Et en évitant la congestion.  
    \end{itemize}  
  \end{overlayarea}
\end{frame}

% Quels problèmes essaie-t-on de résoudre ?
\begin{frame}
  \frametitle{Les limites de TCP}
  \begin{overlayarea}{\textwidth}{\of\textheight}
    \begin{itemize}
    \item<1->TCP est un énorme succès\only<1>{, propulse la grande majorité des
      échanges, s'adapte à des cas très différents},
    \item<2->Mais…  
    \item<3->Il est mal adapté au Web\only<3>{, avec ses pages composées de
      plusieurs objets,} % Javascript, CSS, images…
    \item<4->Si on met tout sur une connexion, l'objet le plus lent
      bloque les autres\only<4>{ (\foreign{Head-of-Line
        blocking})},
    \item<5->Même si on utilise les ruisseaux de HTTP/2, un paquet
      perdu, et tout le monde attend,
    \item<6->Si on fait une connexion TCP par objet, on ne peut pas
      partager les mesures de RTT,\only<6>{ ou l'établissement de TLS,}
    \item<7->Avec TLS, l'ouverture de connexion est lente\only<7>{
      car TLS doit attendre TCP}. Or, la \emph{latence} est
      cruciale. % Ce n'est pas la capacité qui compte.
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{Les limites des mises en œuvre de TCP}
  \begin{overlayarea}{\textwidth}{\of\textheight}
    \begin{itemize}
    \item<2->TCP est typiquement dans le noyau (ce n'est pas
      obligatoire mais c'est l'habitude),
     \item<3->Il peut être intéressant d'avoir la couche transport
       dans l'application (mises à jour plus faciles et plus
       fréquentes),
     \item<4->Il y a aussi une histoire politique : l'application
      n'a pas forcément le même fournisseur que le système d'exploitation.
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{Le problème des middleboxes}
  \begin{overlayarea}{\textwidth}{\of\textheight}
    \begin{itemize}
    \item<2->L'Internet est truffé de \foreign{middleboxes}, des
      boitiers intermédiaires qui tripotent la couche Transport,
    \item<3->NAT, pare-feux…\only<3>{ (pas les routeurs, qui s'arrêtent à la
      couche Réseau)},  
    \item<4->Les \foreign{middleboxes} bloquent tout ce qu'elles ne
      connaissent pas. En pratique, seuls TCP, UDP et ICMP
      passent.\only<4>{ Et encore : les options sont souvent
        bloquées.} % Cas de TCP FastOpen
    \item<5->Cette \emph{ossification} fait qu'on ne peut plus
      déployer un nouveau protocole de transport.
    \item<6->Tout nouveau protocole de transport doit donc tourner sur
      UDP.\only<6>{ C'est le cas par exemple d'un autre concurrent de
        TCP, SCTP (RFC 6951).}
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{QUIC}
  \begin{overlayarea}{\textwidth}{\of\textheight}
    \begin{itemize}
    \item<2->\only<2>{\foreign{Quick UDP Internet Connection} (en fait, on
      n'utilise plus ce développé, juste le nom QUIC).} QUIC est un
      concurrent de TCP, ce n'est \emph{pas} « faire tourner HTTP sur
      UDP », % Dire que QUIC est UDP n'explique pas bien et même
      % confusionne.
    \item<3->QUIC fait donc tout ce que fait TCP\only<3>{
      (authentification faible de l'adresse IP source, retransmission
      des perdus, contrôle de
      congestion…)}, 
    \item<4->QUIC gère une connexion composée de plusieurs
      ruisseaux\only<4>{ (\foreign{streams}), comme dans HTTP/2}, le contrôle de flux se
        fait par ruisseau, % Donc pas de ralentissement d'un ruisseau si un paquet se perd.
    \item<5->Connexions identifiées par le \foreign{Connection ID},
      pas le port\only<5>{, car un routeur NAT a pu changer le port
        source}. % QUIC ne sait pas quand la connexion se termine,
      % contrairement au cas de TCP
      % On peut même changer l'adresse IP : gag pour access_log    
    \item<6->À l'intérieur d'un paquet QUIC, plusieurs trames\only<6>{ (qui
      peuvent être dans des ruisseaux différents)},
    \item<7->Les trames ont un type\only<7>{ (\computer{STREAM}, \computer{CRYPTO},
      \computer{ACK}, \computer{PING},
      \computer{PADDING}, etc)}.
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{Le chiffrement}
  \begin{overlayarea}{\textwidth}{\of\textheight}
    \begin{itemize}
    \item<2->Systématiquement chiffré ; pas de QUIC sans
      chiffrement\only<2>{ (Bas les pattes, les \foreign{middleboxes} !)},
    \item<3->Et avec AEAD (chiffrement intègre),
    \item<4->Le chiffrement se fait avec TLS \emph{mais},
    \item<5->Plus de protocole des enregistrements\only<5>{
      (\foreign{Record Layer})}, on ne garde que celui de
      salutation. TLS est à côté de QUIC, plus au-dessus, il chiffre
      avec le matériel fourni par TLS. % Il est donc difficile
                                % d'utiliser les bibliothèques existantes.
    \item<6->QUIC permet le remplissage, pour gêner l'analyse des
      tailles de paquets.  
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{La visibilité}
  \begin{overlayarea}{\textwidth}{\of\textheight}
    \begin{itemize}
    \item<2->Avec TCP\only<2>{, même en utilisant TLS ou SSH}, le
      fonctionnement du protocole de Transport était \emph{visible}
      aux \foreign{middleboxes},
    \item<3->RFC 8546 : la vue depuis le réseau\only<3>{ (\foreign{wire image})},
    \item<4->La visibilité permet des attaques comme les faux RST
      TCP\only<4>{ (utilisé par certains FAI pour casser BitTorrent)},
    \item<5->Au contraire, QUIC chiffre presque tout.\only<5>{ Les
      \foreign{middleboxes} ne doivent pas voir la couche Transport.}
    \item<6->Certains FAI ne vont pas être contents de ce renforcement
      du modèle de bout en bout\only<6>{ (RFC 8404)},
    \item<7->Exemple du débat sur le \foreign{spin bit}, un bit non
      chiffré pour permettre aux observateurs de mesurer le RTT. Le
      \foreign{spin bit} est optionnel, pour protéger l'intimité.
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{HTTP sur QUIC, ou HTTP/3}
  \begin{overlayarea}{\textwidth}{\of\textheight}
    \begin{itemize}
      \item<2->QUIC est très optimisé pour HTTP\only<2>{ (multiplexage
        des ruisseaux, contrôle de flux par ruisseau, latence à
        l'établissement de la connexion le plus faible possible…)},
      \item<3->HTTP/3 a la même sémantique que HTTP\only<3>{ (\computer{GET},
        \computer{POST}, \computer{User-Agent:},
        \computer{Content-Type:}…)},
     \item<4->Son encodage ressemble à celui de HTTP/2\only<4>{ (donc binaire)},   
    \item<5->Une requête/réponse par ruisseau. Chaque ruisseau ne sert
      qu'une fois,
    \item<6->Trames QUIC \computer{HEADERS} et \computer{DATA},
    \item<7->On utilise \computer{Alt-Svc:} (RFC 7838) pour savoir s'il sait
      faire du \computer{h3}\only<7>{ (risque que QUIC soit
        bloqué)}. Ou ALPN (RFC 7301). % ALPN est spécifique à TLS
      \end{itemize}  
  \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{La normalisation}
  \begin{overlayarea}{\textwidth}{\of\textheight}
    \begin{itemize}
    \item<2->À l'origine développé par Google vers 2012,
    \item<3->Passage à l'IETF en 2015-2016, % Premier draft en 2015,
                                            % draft-hamilton-quic-transport-protocol
                                            % WG créé en 2016
    \item<4->Principale différence avec la version Google, le
      protocole de cryptographie spécifique a été remplacé par TLS, % Il se nommait QUIC-Crypto <https://docs.google.com/document/d/1g5nIXAIkN_Y-7XJW5K45IblHd_L2f5LTaDUDwvZ5L6g/edit>
    \item<5->Autre différence, HTTP/3 défini séparément de QUIC, % Le
                                % protocole Google était purement
                                % HTTP. Ceci dit, en pratique, celui
      % de l'IETF est très axé HTTP.
      % Troisième différence, QPACK % https://www.ietf.org/blog/whats-happening-quic/
    \item<6->RFC publiés… plus tard.
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{Les mises en œuvre}
  \begin{overlayarea}{\textwidth}{\of\textheight}
    \begin{itemize}
    \item<2->NGTCP2 (en C) \url{https://github.com/ngtcp2/ngtcp2} et
      NGHTTP3,
    \item<3->Quiche (en Rust)
      \url{https://github.com/cloudflare/quiche},
    \item<4->aioquic (en Python)
      \url{https://github.com/aiortc/aioquic},
    \item<5->Quicly (en C) \url{https://github.com/h2o/quicly},
    \item<6->Déjà dans curl (option de compilation). % IETF QUIC pas
                                % encore dans les navigateurs.
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\begin{frame}
  \frametitle{Conclusion}
  \begin{overlayarea}{\textwidth}{\of\textheight}
    \begin{itemize}
    \item<2->QUIC est déjà largement déployé, dans sa version Google,
    \item<3->La version IETF avance mais c'est long,
    \item<4->Mon pari est qu'elle sera un succès, porté par les fortes
      demandes de HTTP.
    \item<5->Si vous ne lisez qu'une chose sur QUIC : le livre de
      Daniel Stenberg \url{https://http3-explained.haxx.se/}.
    \end{itemize}  
  \end{overlayarea}
\end{frame}

\end{document}
