From 686a272064eb795006605e51a41f6d070336dd75 Mon Sep 17 00:00:00 2001 From: Mirko Milovanovic Date: Tue, 18 Mar 2025 18:22:21 +0100 Subject: [PATCH] feat: update bibliography with new references and chapter 4.0 --- Biblio.bib | 149 ++++++++++++++++++++++++++++------- Tesi.tex | 58 +++++++++++--- images/chrome_Mqt9TamrBT.png | Bin 0 -> 9375 bytes 3 files changed, 168 insertions(+), 39 deletions(-) create mode 100644 images/chrome_Mqt9TamrBT.png diff --git a/Biblio.bib b/Biblio.bib index b8cf8f3..d4e4317 100644 --- a/Biblio.bib +++ b/Biblio.bib @@ -1,4 +1,27 @@ -@misc{activitypubActivityPubRocks, +@article{Blum2021, + title = {WebRTC - Realtime Communication for the Open Web Platform: What was once a way to bring audio and video to the web has expanded into more use cases we could ever imagine.}, + volume = {19}, + ISSN = {1542-7749}, + url = {http://dx.doi.org/10.1145/3454122.3457587}, + DOI = {10.1145/3454122.3457587}, + number = {1}, + journal = {Queue}, + publisher = {Association for Computing Machinery (ACM)}, + author = {Blum, Niklas and Lachapelle, Serge and Alvestrand, Harald}, + year = {2021}, + month = feb, + pages = {77–93} +} + + @misc{acestreamAnnouncementStream, + author = {}, + title = {{A}nnouncement! {A}{C}{E} {S}tream; {N}ew era of {T}{V} and {I}nternet broadcasting --- oldforum.acestream.media}, + url = {http://oldforum.acestream.media/index.php?topic=1479.0}, + year = {}, + note = {[Accessed 28-09-2023]} +} + + @misc{activitypubActivityPubRocks, author = {}, title = {{A}ctivity{P}ub {R}ocks! --- activitypub.rocks}, howpublished = {\url{https://activitypub.rocks/}}, @@ -6,7 +29,7 @@ note = {[Accessed 04-Apr-2023]} } - @misc{ai4businessDataTroppo, +@misc{ai4businessDataTroppo, author = {Federica Maria Rita Livelli}, title = {{A}{I} e big data, troppo potere nelle mani di pochi: il dibattito - {A}{I}4{B}usiness --- ai4business.it}, howpublished = {\url{https://www.ai4business.it/intelligenza-artificiale/ai-e-big-data-favoriscono-la-concentrazione-del-potere/}}, @@ -14,7 +37,15 @@ note = {[Accessed 01-Sep-2022]} } - @misc{ARPANET_2022, +@misc{archiveStream, + author = {}, + title = {{A}ce {S}tream --- web.archive.org}, + url = {https://web.archive.org/web/20180618052904/http://info.acestream.org/#/about/acestream}, + year = {}, + note = {[Accessed 28-09-2023]} +} + +@misc{ARPANET_2022, title = {{ARPANET} --- {W}ikipedia{,} The Free Encyclopedia}, rights = {Creative Commons Attribution-ShareAlike License}, url = {https://en.wikipedia.org/w/index.php?title=ARPANET&oldid=1105956998}, @@ -63,6 +94,38 @@ journal = {Peer-to-Peer Networking and Applications} } +@misc{framablogPeerTubeOut, + author = {}, + title = {{P}eer{T}ube v6 is out, and powered by your ideas ! --- framablog.org}, + howpublished = {\url{https://framablog.org/2023/11/28/peertube-v6-is-out-and-powered-by-your-ideas/\#-and-there-s-always-more-}}, + year = {}, + note = {[Accessed 18-03-2025]} +} + +@misc{framablogPeerTubeV7, + author = {}, + title = {{P}eer{T}ube v7 : offer a complete makeover to your video platform ! --- framablog.org}, + howpublished = {\url{https://framablog.org/2024/12/17/peertube-v7-offer-a-complete-makeover-to-your-video-platform/}}, + year = {}, + note = {[Accessed 18-03-2025]} +} + +@misc{githubGitHubWebtorrentbittorrenttracker, + author = {}, + title = {{G}it{H}ub - webtorrent/bittorrent-tracker: {S}imple, robust, {B}it{T}orrent tracker (client \& server) implementation --- github.com}, + howpublished = {\url{https://github.com/webtorrent/bittorrent-tracker?tab=readme-ov-file}}, + year = {}, + note = {[Accessed 18-03-2025]} +} + +@misc{githubWebtorrentdocsfaqmdMaster, + author = {}, + title = {webtorrent/docs/faq.md at master · webtorrent/webtorrent --- github.com}, + howpublished = {\url{https://github.com/webtorrent/webtorrent/blob/master/docs/faq.md\#how-does-webtorrent-work}}, + year = {}, + note = {[Accessed 18-03-2025]} +} + @misc{ipfsIPFSWhitepaper, doi = {10.48550/ARXIV.1407.3561}, url = {https://arxiv.org/abs/1407.3561}, @@ -82,6 +145,14 @@ note = {[Accessed 04-Apr-2023]} } +@misc{joinpeertubePeerTubeStress, + author = {}, + title = {{P}eer{T}ube stress tests: resilience lies in your peers! | {J}oin{P}eer{T}ube --- joinpeertube.org}, + howpublished = {\url{https://joinpeertube.org/news/stress-test-2023}}, + year = {}, + note = {[Accessed 18-03-2025]} +} + @article{Multi-CDN:TowardsPrivacyinContentDeliveryNetworks, doi = {10.1109/tdsc.2018.2833110}, url = {https://doi.org/10.1109/tdsc.2018.2833110}, @@ -96,6 +167,14 @@ journal = {{IEEE} Transactions on Dependable and Secure Computing} } +@misc{novageMediaLoader, + author = {}, + title = {{P}2{P} {M}edia {L}oader --- novage.com.ua}, + howpublished = {\url{https://novage.com.ua/p2p-media-loader/technical-overview}}, + year = {}, + note = {[Accessed 18-03-2025]} +} + @article{Parameswaran2001, doi = {10.1109/2.933501}, url = {https://doi.org/10.1109/2.933501}, @@ -136,6 +215,14 @@ language = {it-IT} } +@phdthesis{ResearchBasedDataRightsManagementUsingBlockchainOverEthereumNetwork, + author = {Naz, Muqaddas and Javaid, Nadeem and Iqbal, Sohail}, + year = {2019}, + month = {09}, + pages = {}, + title = {Research Based Data Rights Management Using Blockchain Over Ethereum Network} +} + @misc{rfc5128, series = {Request for Comments}, number = 5128, @@ -159,6 +246,22 @@ note = {[Accessed 02-Apr-2023]} } +@misc{tailscaleTraversalWorks, + author = {}, + title = {{H}ow {N}{A}{T} traversal works --- tailscale.com}, + howpublished = {\url{https://tailscale.com/blog/how-nat-traversal-works}}, + year = {}, + note = {[Accessed 18-03-2025]} +} + +@misc{theoryBitTorrentSpecificationTheoryOrg, + author = {}, + title = {{B}it{T}orrent{S}pecification - {T}heory{O}rg --- wiki.theory.org}, + howpublished = {\url{https://wiki.theory.org/BitTorrentSpecification}}, + year = {}, + note = {[Accessed 18-03-2025]} +} + @inproceedings{theTwitchCase, author = {Deng, Jie and Tyson, Gareth and Cuadrado, Félix and Uhlig, Steve}, year = {2017}, @@ -195,7 +298,7 @@ note = {[Accessed 11-Feb-2023]} } -@misc{w3c, + @misc{w3c, author = {W3C}, title = {What is the difference between the Web and the Internet?}, howpublished = {\url{https://www.w3.org/Help/}}, @@ -203,6 +306,14 @@ note = {[Accessed 31-Aug-2022]} } +@misc{webBuildBackend, + author = {}, + title = {{B}uild the backend services needed for a {W}eb{R}{T}{C} app  |  {A}rticles  |  web.dev --- web.dev}, + howpublished = {\url{https://web.dev/articles/webrtc-infrastructure\#what-is-signaling}}, + year = {}, + note = {[Accessed 18-03-2025]} +} + @misc{wiki:ActivityPub, author = {Wikipedia}, title = {{ActivityPub} --- {W}ikipedia{,} The Free Encyclopedia}, @@ -211,7 +322,7 @@ note = {[Online; accessed 05-April-2023]} } - @misc{wikipediaLicenzainformatica, +@misc{wikipediaLicenzainformatica, author = {Wikipedia}, title = {{L}icenza (informatica) - {W}ikipedia --- it.wikipedia.org}, howpublished = {\url{https://it.wikipedia.org/wiki/Licenza_(informatica)}}, @@ -235,26 +346,10 @@ note = {[Accessed 09-Feb-2023]} } -@phdthesis{ResearchBasedDataRightsManagementUsingBlockchainOverEthereumNetwork, -author = {Naz, Muqaddas and Javaid, Nadeem and Iqbal, Sohail}, -year = {2019}, -month = {09}, -pages = {}, -title = {Research Based Data Rights Management Using Blockchain Over Ethereum Network} -} - -@misc{acestreamAnnouncementStream, - author = {}, - title = {{A}nnouncement! {A}{C}{E} {S}tream; {N}ew era of {T}{V} and {I}nternet broadcasting --- oldforum.acestream.media}, - url = {http://oldforum.acestream.media/index.php?topic=1479.0}, - year = {}, - note = {[Accessed 28-09-2023]}, -} - -@misc{archiveStream, - author = {}, - title = {{A}ce {S}tream --- web.archive.org}, - url = {https://web.archive.org/web/20180618052904/http://info.acestream.org/#/about/acestream}, - year = {}, - note = {[Accessed 28-09-2023]}, +@misc{wikipediaWebRTCWikipedia, + author = {}, + title = {{W}eb{R}{T}{C} - {W}ikipedia --- en.wikipedia.org}, + howpublished = {\url{https://en.wikipedia.org/wiki/WebRTC}}, + year = {}, + note = {[Accessed 18-03-2025]} } \ No newline at end of file diff --git a/Tesi.tex b/Tesi.tex index 69621f5..5908c1b 100644 --- a/Tesi.tex +++ b/Tesi.tex @@ -11,9 +11,6 @@ \usepackage{colorprofiles} \usepackage[a-2b,mathxmp]{pdfx} -\usepackage{biblatex} -\bibliography{Biblio.bib} - \usepackage{hyperref} \hypersetup{ colorlinks, @@ -22,6 +19,9 @@ urlcolor={blue!100!black} } +\usepackage{biblatex} +\bibliography{Biblio.bib} + \usepackage{graphicx} \usepackage{geometry} @@ -68,8 +68,6 @@ \usetikzlibrary{arrows} \usepackage{titlesec} -\setcounter{secnumdepth}{3} -\setcounter{tocdepth}{3} \newenvironment{usecaseenv}{ \def\arraystretch{2} @@ -544,17 +542,53 @@ Queste metriche possono essere visualizzate attraverso dashboard Grafana o altri \chapter{Verifica empirica delle prestazioni P2P di PeerTube} -Nel novembre 2023, il team di PeerTube ha pubblicato un articolo in cui sostiene che la loro implementazione P2P può ridurre il carico sul server fino all'80% in condizioni ottimali. L'articolo presenta i risultati di test condotti con diversi numeri di peer e configurazioni. +A dicembre 2023, il team di PeerTube ha pubblicato un articolo in cui va ad analizzarne le prestazioni facendo degli `stress test' per verificare se la tecnologia P2P integrata nel sistema sia effettivamente in grado di ridurre il carico sui server con circa 1000 utenti connessi contemporaneamente, in quanto, secondo i dati raccolti da Twitch nel 2022, coprivano il 99\% dei casi di utilizzo della piattaforma. -Principali affermazioni dell'articolo: +\ + +Per realizzare test veritieri, il team ha simulato 1.000 spettatori simultanei utilizzando 1.000 browser Chrome, ciascuno con un indirizzo IP pubblico IPv6 dedicato. Questo è stato realizzato tramite `Selenium grid', un software di automazione e testing per i browser, affiancato da Docker su cloud Hetzner e successivamente con un potente server fornito da Octopuce. + +La scelta di 1.000 spettatori è significativa poiché copre la stragrande maggioranza delle dirette streaming su piattaforme importanti come Twitch, suggerendo che PeerTube può essere adeguato per un'ampia gamma di casi d'uso. +In condizioni ottimali, l'aspetto P2P di PeerTube dovrebbe ridurre la larghezza di banda necessaria per trasmettere un video in diretta di un fattore da 3 a 4, standa quanto detto degli sviluppatori di PeerTube. + +\ + +Sono stati condotti 4 scenari di test principali: \begin{itemize} - \item Con 10 peer, il carico sul server viene ridotto del 30-50% - \item Con 50 peer, la riduzione raggiunge il 60-70% - \item Con 100+ peer, si può arrivare all'80% di riduzione - \item L'impostazione "High Latency" migliora ulteriormente l'efficienza P2P + \item Live streaming con impostazione `Normal Latency' + \item Live streaming con impostazione `High Latency' + \item Live streaming con impostazione `High Latency' e 50\% dei peer con P2P disabilitato + \item Un normale video `on-demand' \end{itemize} -Tuttavia, l'articolo non fornisce dettagli sufficienti sulla metodologia utilizzata né rilascia gli strumenti per riprodurre i test in modo indipendente. +su una macchina virtuale con: +\begin{itemize} + \item 4 vCore i7-8700 CPU @ 3.20GHz + \item 4 GB di RAM + \item 1 Gbps di banda +\end{itemize} + +I dati dei test sono stati raccolti tramite OpenTelemetry e Grafana, con metriche come: +\begin{itemize} + \item Percentuale di dati trasferiti via P2P vs. dal server + \item Utilizzo di CPU + \item Comportamento in condizioni di rete variabili + \item Numero di spettatori +\end{itemize} + +con i quali, infine, sono stati in grado di dimostrare che PeerTube è in grado di gestire 1.000 spettatori simultanei con un carico minimo sui server, grazie alla tecnologia P2P integrata in quanto la quantità di dati trasferiti via P2P è progressivamente aumentata con il tempo fino a raggiungere un rapporto del 75\% dei dati totali trasferiti per i video in diretta e del 98\% per i video `on-demand'. + +\begin{figure}[H] + \centering + \includegraphics[width=\textwidth]{images/chrome_Mqt9TamrBT.png} + \caption{PeerTube conclusioni sullo stress test.} +\end{figure} + +Tuttavia, l'articolo non fornisce dettagli sufficienti sulla metodologia utilizzata né rilascia gli strumenti specifici per riprodurre i test in modo indipendente. \cite{joinpeertubePeerTubeStress} + +\ + +Perciò abbiamo deciso di creare un sistema di test automatizzato che possa riprodurre i test descritti nell'articolo originale. \section{Metodologia per la verifica empirica} diff --git a/images/chrome_Mqt9TamrBT.png b/images/chrome_Mqt9TamrBT.png new file mode 100644 index 0000000000000000000000000000000000000000..164443338ca290cd7104ac533f60abaaf62af1ef GIT binary patch literal 9375 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 H&a?jl48-oe literal 0 HcmV?d00001