torrent.tex 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. \section{Objectifs}
  2. La finalité de ce module est de pouvoir lire des flux vidéos depuis un torrent,
  3. c'est-à-dire d'effectuer la lecture d'un média transmis en streaming pair à
  4. pair.
  5. Le module en lui-même est également un très bon candidat pour exploiter un
  6. nouveau type de module dans libvlccore: les \inltype{stream_extractor}. Ces
  7. composants s'insèrent au niveau du \inltype{demux} et lui fournissent une
  8. interface pour choisir quel média lire à partir du fichier torrent ou du lien
  9. magnet. Le concept amené par ce nouveau type de module est facilement
  10. descriptible par l'exemple. Le premier module réalisé ayant cette capacité est
  11. celui capable de lire des archives. Cela permet alors d'ouvrir l'archive comme
  12. si il s'agissait d'un dossier et lire n'importe quel flux au sein de ce premier
  13. flux.
  14. Ce module existait déjà avant le début de mon travail, mais j'ai travaillé sur
  15. les problématiques suivantes.
  16. \begin{itemize}
  17. \item Portage du module et mise à jour des dépendances.
  18. \item Ajout du support pour GnuTLS.\@
  19. \item Intégration avec WebTorrent.
  20. \end{itemize}
  21. \section{Support de Windows et Android}
  22. \subsection{Réimplémentation de promesses}
  23. L'implémentation initiale était écrite avec la bibliothèque standard en C++14.
  24. le module n'était alors pas utilisable sous Windows compilé avec MinGW en
  25. version winpthread. Il a donc fallu écrire un wrapper remplaçant les mutexes,
  26. threads et variables de conditions utilisés en substituant pour l'implémentation
  27. disponible dans VLC.\@
  28. Le travail était donc en particulier d'écrire une nouvelle implémentation des
  29. promesses et futures.
  30. Le concept se sépare en deux parties: d'un côté les futures sont renvoyées à
  31. l'utilisateur lorsqu'il souhaite effectuer une action asynchrone. Lorsque
  32. l'utilisateur souhaite utiliser la valeur, il peut utiliser la fonction
  33. \inltype{get}. Lors de l'appel à \inltype{get}, soit la valeur est disponible et
  34. elle est retournée, soit une erreur est disponible sous forme d'exception et
  35. elle est lancée, soit aucun des deux n'est encore disponible et l'appel bloque
  36. jusqu'à la validation de la promesse. De l'autre côté, la promesse est utilisée
  37. par la fonction asynchrone pour fournir la valeur ou l'erreur à renvoyer. Une
  38. promesse ne peut être exaucée qu'une seule fois par une valeur ou une erreur.
  39. % TODO: expliquer thread-safe
  40. Afin de faire fonctionner ces deux parties ensemble, il faut les doter d'un état
  41. partagé. L'implémentation utilise un pointeur avec comptage de référence sur cet
  42. état partagé pour gérer atomiquement sa durée de vie, puis l'état contenu dans
  43. le pointeur fournit une interface thread-safe.
  44. L'intégration dans le module se fait par la classe déjà existante
  45. \inltype{i11e_promise}, pour \og{}promesse interruptible\fg{}, qui permet de définir les
  46. attentes des promesses comme un point d'annulation possible pour le thread.
  47. \subsection{Correction des problèmes de compilation de libtorrent}
  48. La seconde partie du travail a consisté à faire compiler libtorrent sur les
  49. autres plateformes que Linux. J'ai pour cela ouvert des tickets et proposé des
  50. \og{}pull request\fg{}, principalement pour le système de build. J'ai aussi intégré des
  51. patch temporaires rajoutant une implémentation des threads pour winpthread. Cela
  52. semble rentrer en conflit avec le travail effectué précédemment, mais cette
  53. initiative est seulement cloisonnée à la dépendance et ne déborde pas sur VLC.
  54. \@ C'est notamment une solution temporaire apparues avec le remplacement de
  55. \inltype{boost::thread}, destinée à disparaitre dans le futur et un patch
  56. s'accorde plus facilement avec cet esprit.
  57. % TODO: https://github.com/arvidn/libtorrent/pull/2999
  58. % TODO: ajouter références vers les pull requests
  59. Sur les cinq pull requests proposées, quatre ont été acceptées et intégrées:
  60. \begin{itemize}
  61. \item \og{}dynamically load getauxval so as to support older android devices\fg{}
  62. \#2830: utilise \inltype{dlsym} pour charger dynamiquement
  63. \inltype{getauxval} et éviter la situation où la bibliothèque ne compile pas
  64. quand \inltype{sys/auxv.h} n'est pas disponible.
  65. \item \og{} Add missing define for old android sdk\fg{} \#2831 corrige des erreurs
  66. de compilation avec netlink lorsque certaines constantes ne sont pas
  67. définies.
  68. \item \og{}fix if defined TORRENT\_ANDROID\fg{} \#2836 définit la constante
  69. \inltype{TORRENT_ANDROID} pour faire fonctionner la pull request précédente.
  70. \item \og{}add windows socket libraries in Makefile.am\fg{} \#2834 corrige la
  71. configuration autotools du projet qui n'était pas à jour avec les autres
  72. scripts de construction.
  73. \end{itemize}
  74. \section{Étude des besoins pour l'ajout du support SSL}
  75. Lors de l'utilisation de trackers privés, il est possible d'utiliser des
  76. certificats SSL pour s'assurer que la personne se connectant aux autres hôtes
  77. appartient bien au réseau, en plus de chiffrer très faiblement les données avec
  78. un algorithme RC4.
  79. % TODO décrire BEP
  80. Libtorrent supporte\cite{SSLlibtorrent} la BEP 35\cite{BEP35} qui est une extension au protocole apportant cette
  81. fonctionnalité. En interne, libtorrent utilise OpenSSL.\@ Or, la licence
  82. d'OpenSSL n'est pas compatible avec les applications sous licence GPL.\@
  83. L'objectif de cette mission était donc d'essayer d'intégrer GnuTLS dans
  84. Libtorrent en parallèle du support pour OpenSSL.\@
  85. Après discussion avec le développeur principal de Libtorrent, le projet s'est
  86. transformé en l'intégration de GnuTLS dans boost::asio, la bibliothèque réseau
  87. utilisée par Libtorrent. Quelques tentatives d'intégration ont néanmoins été
  88. faites directement dans libtorrent pour modifier d'autres parties dépendant
  89. directement d'OpenSSL.
  90. A la suite d'une autre discussion avec des développeurs souhaitant aussi
  91. l'arrivée de cette fonctionnalité, évoquant la difficulté de faire accepter une
  92. pull request sur le dépôt officiel, et devant la quantité de travail à effectuer
  93. pour cette intégration, le projet a été mis en pause pour donner la priorité au
  94. reste du stage.
  95. \section{Projet subsidiaire, support du WebTorrent}
  96. Le module était déjà fonctionnel et est désormais compatible avec toutes les
  97. plateformes importantes, malgré le manque de support pour OpenSSL.\@ Cependant
  98. il ne peut pas être intégré et distribué avec VLC pour des raisons
  99. principalement politiques. Un logiciel aussi connu distribuant un moyen
  100. d'utiliser des torrents illégaux seraient mal vu et représente une position
  101. difficile à assumer.
  102. Suivant l'annonce de la sortie de PeerTube, se voulant être un Youtube
  103. décentralisé fonctionnant grâce à Webtorrent, l'idée de s'intégrer nativement à
  104. Peertube a émergé comme une alternative correcte pour justifier l'intégration
  105. de ce module. Après une discussion avec Jean-Baptiste, l'idée fut acceptée et
  106. j'ai pû commencer à me renseigner sur les différents moyens à notre disposition
  107. pour utiliser webtorrent dans le module torrent.
  108. La stratégie fut sans surprise de procéder à l'intégration dans Libtorrent du
  109. support de Webtorrent. Malheureusement ce dernier n'est pas encore standardisé
  110. dans une BEP, ou \og{}BitTorrent Enhancement Proposal\fg{} comme décrit dans la BEP 001.
  111. L'extension au protocole n'est donc pas encore terminée ni acceptée et seule une
  112. implémentation de référence en nodeJS est disponible.
  113. En suivant les discussions autour de cette intégration, je suis rapidement
  114. arrivé à la nécessité d'intégrer une bibliothèque permettant de supporter une
  115. connexion WebRTC directement dans libtorrent, le protocole BitTorrent étant
  116. identique une fois l'établissement de celle-ci. À ce jour, aucune action
  117. significative n'a encore été entreprise pour avancer sur cette tâche, par manque
  118. de temps.