feat: add new references to bibliography, fix lexical errors
All checks were successful
Build LaTeX Document / build_latex (push) Successful in 3m55s

This commit is contained in:
2025-04-01 15:12:00 +02:00
parent 09745960cc
commit f5bb59f433
2 changed files with 222 additions and 153 deletions

View File

@@ -165,6 +165,14 @@
note = {[Accessed 20-03-2025]} note = {[Accessed 20-03-2025]}
} }
@misc{geeksforgeeksAggregationMongoDB,
author = {},
title = {{A}ggregation in {M}ongo{D}{B} - {G}eeksfor{G}eeks --- geeksforgeeks.org},
howpublished = {\url{https://www.geeksforgeeks.org/aggregation-in-mongodb/}},
year = {},
note = {[Accessed 01-04-2025]}
}
@misc{geeksforgeeksContainerizationUsing, @misc{geeksforgeeksContainerizationUsing,
author = {}, author = {},
title = {{C}ontainerization using {D}ocker - {G}eeksfor{G}eeks --- geeksforgeeks.org}, title = {{C}ontainerization using {D}ocker - {G}eeksfor{G}eeks --- geeksforgeeks.org},
@@ -221,6 +229,22 @@
note = {[Accessed 18-03-2025]} note = {[Accessed 18-03-2025]}
} }
@misc{influxdataInfrastructureMonitoring,
author = {},
title = {{I}nfrastructure {M}onitoring {B}asics with {T}elegraf, {I}nflux{D}{B}, and {G}rafana --- influxdata.com},
howpublished = {\url{https://www.influxdata.com/blog/infrastructure-monitoring-basics-telegraf-influxdb-grafana/}},
year = {},
note = {[Accessed 01-04-2025]}
}
@misc{innovationyourselfDockerDocker,
author = {},
title = {{D}ocker vs {D}ocker {C}ompose vs {D}ocker {S}warm s docker engine --- innovationyourself.com},
howpublished = {\url{https://innovationyourself.com/docker-vs-docker-compose-vs-docker-swarm/}},
year = {},
note = {[Accessed 01-04-2025]}
}
@misc{ipfsIPFSWhitepaper, @misc{ipfsIPFSWhitepaper,
doi = {10.48550/ARXIV.1407.3561}, doi = {10.48550/ARXIV.1407.3561},
url = {https://arxiv.org/abs/1407.3561}, url = {https://arxiv.org/abs/1407.3561},
@@ -331,6 +355,14 @@
note = {[Accessed 07-Mar-2023]} note = {[Accessed 07-Mar-2023]}
} }
@misc{qabrainsSeleniumGrid,
author = {},
title = {{S}elenium {G}rid 4 - {A}rchitecture and {C}ommunication --- qabrains.com},
howpublished = {\url{https://qabrains.com/selenium-grid-4-architecture-and-communication}},
year = {},
note = {[Accessed 01-04-2025]}
}
@phdthesis{ResearchBasedDataRightsManagementUsingBlockchainOverEthereumNetwork, @phdthesis{ResearchBasedDataRightsManagementUsingBlockchainOverEthereumNetwork,
author = {Naz, Muqaddas and Javaid, Nadeem and Iqbal, Sohail}, author = {Naz, Muqaddas and Javaid, Nadeem and Iqbal, Sohail},
year = {2019}, year = {2019},
@@ -439,6 +471,14 @@
month = {9} month = {9}
} }
@online{The360Degree,
author = {The 360 Degree},
title = {Own work},
year = {2022},
url = {https://commons.wikimedia.org/w/index.php?curid=116056511},
note = {Licensed under CC BY-SA 4.0}
}
@misc{theoryBitTorrentSpecificationTheoryOrg, @misc{theoryBitTorrentSpecificationTheoryOrg,
author = {}, author = {},
title = {{B}it{T}orrent{S}pecification - {T}heory{O}rg --- wiki.theory.org}, title = {{B}it{T}orrent{S}pecification - {T}heory{O}rg --- wiki.theory.org},
@@ -483,6 +523,22 @@
note = {[Accessed 11-Feb-2023]} note = {[Accessed 11-Feb-2023]}
} }
@misc{uclvDockerOverview,
author = {},
title = {{D}ocker overview --- docker-docs.uclv.cu},
howpublished = {\url{https://docker-docs.uclv.cu/get-started/overview/}},
year = {},
note = {[Accessed 01-04-2025]}
}
@online{VignoniCalimo2009,
author = {David Vignoni and Calimo},
title = {By Gnome-fs-client.svg: David Vignoni, Gnome-fs-server.svg: David Vignoni, derivative work: Calimo},
year = {2009},
url = {https://commons.wikimedia.org/w/index.php?curid=15782858},
note = {Licensed under LGPL}
}
@misc{w3c, @misc{w3c,
author = {W3C}, author = {W3C},
title = {What is the difference between the Web and the Internet?}, title = {What is the difference between the Web and the Internet?},
@@ -515,7 +571,7 @@
note = {[Accessed 20-03-2025]} note = {[Accessed 20-03-2025]}
} }
@misc{wiki:ActivityPub, @misc{wiki:ActivityPub,
author = {Wikipedia}, author = {Wikipedia},
title = {{ActivityPub} --- {W}ikipedia{,} The Free Encyclopedia}, title = {{ActivityPub} --- {W}ikipedia{,} The Free Encyclopedia},
year = {2023}, year = {2023},
@@ -547,6 +603,14 @@
note = {[Online; accessed 31-March-2025]} note = {[Online; accessed 31-March-2025]}
} }
@misc{wiki:Network_address_translation,
author = {Wikipedia},
title = {{Network address translation} --- {W}ikipedia{,} The Free Encyclopedia},
year = {2025},
howpublished = {\url{http://en.wikipedia.org/w/index.php?title=Network\%20address\%20translation&oldid=1283227709}},
note = {[Online; accessed 01-April-2025]}
}
@misc{wiki:PeerTube, @misc{wiki:PeerTube,
author = {Wikipedia}, author = {Wikipedia},
title = {{PeerTube} --- {W}ikipedia{,} The Free Encyclopedia}, title = {{PeerTube} --- {W}ikipedia{,} The Free Encyclopedia},
@@ -555,7 +619,7 @@
note = {[Online; accessed 24-March-2025]} note = {[Online; accessed 24-March-2025]}
} }
@misc{wiki:Unicast, @misc{wiki:Unicast,
author = {Wikipedia}, author = {Wikipedia},
title = {{Unicast} --- {W}ikipedia{,} The Free Encyclopedia}, title = {{Unicast} --- {W}ikipedia{,} The Free Encyclopedia},
year = {2025}, year = {2025},
@@ -571,7 +635,7 @@
note = {[Accessed 25-Jan-2023]} note = {[Accessed 25-Jan-2023]}
} }
@misc{wikipediaTraversalWikipedia, @misc{wikipediaTraversalWikipedia,
author = {}, author = {},
title = {{N}{A}{T} traversal - {W}ikipedia --- en.wikipedia.org}, title = {{N}{A}{T} traversal - {W}ikipedia --- en.wikipedia.org},
howpublished = {\url{https://en.wikipedia.org/wiki/NAT_traversal}}, howpublished = {\url{https://en.wikipedia.org/wiki/NAT_traversal}},
@@ -579,7 +643,7 @@
note = {[Accessed 08-Mar-2023]} note = {[Accessed 08-Mar-2023]}
} }
@misc{wikipediaTwitchservice, @misc{wikipediaTwitchservice,
author = {}, author = {},
title = {{T}witch (service) - {W}ikipedia --- en.wikipedia.org}, title = {{T}witch (service) - {W}ikipedia --- en.wikipedia.org},
howpublished = {\url{https://en.wikipedia.org/wiki/Twitch_(service)}}, howpublished = {\url{https://en.wikipedia.org/wiki/Twitch_(service)}},

303
Tesi.tex
View File

@@ -169,9 +169,13 @@
% The actual command definition % The actual command definition
\let\oldFigureName\figurename %save the old definition of the caption's figure name \let\oldFigureName\figurename %save the old definition of the caption's figure name
\newcounter{usecase}[chapter] % Create a new counter for use cases, reset every chapter
\renewcommand{\theusecase}{\thechapter.\arabic{usecase}} % Define numbering format
\newcommand{\usecase}[5]{ \newcommand{\usecase}[5]{
\stepcounter{usecase} % Increment the use case counter
\vspace*{0.5cm} % adds a bit of padding to make it look nicer \vspace*{0.5cm} % adds a bit of padding to make it look nicer
\renewcommand{\figurename}{Use case} %call figure name "Use case" instead \renewcommand{\figurename}{} %call figure name "Use case" instead
\begin{figure}[htbp] \begin{figure}[htbp]
\begin{center} \begin{center}
\begin{usecaseenv} \begin{usecaseenv}
@@ -181,7 +185,7 @@
\addrow{Obiettivi:}{#4} \addrow{Obiettivi:}{#4}
\end{usecaseenv} \end{usecaseenv}
\end{center} \end{center}
\caption{#5} \caption*{Use case \theusecase #5}
\end{figure} \end{figure}
\renewcommand{\figurename}{\oldFigureName} %reset caption figure name \renewcommand{\figurename}{\oldFigureName} %reset caption figure name
} }
@@ -189,7 +193,7 @@
\let\oldFigureName\figurename %save the old definition of the caption's figure name \let\oldFigureName\figurename %save the old definition of the caption's figure name
\newcommand{\serviceCharacteristics}[6]{ \newcommand{\serviceCharacteristics}[6]{
\vspace*{0.5cm} % adds a bit of padding to make it look nicer \vspace*{0.5cm} % adds a bit of padding to make it look nicer
\renewcommand{\figurename}{} %call figure name "Use case" instead \renewcommand{\figurename}{}
\begin{figure}[H] \begin{figure}[H]
\begin{center} \begin{center}
\begin{characteristicsEnv} \begin{characteristicsEnv}
@@ -290,19 +294,19 @@ Infine, un pensiero di gratitudine a tutti coloro che, pur non essendo citati es
\pagenumbering{arabic} \pagenumbering{arabic}
\setcounter{page}{1} \setcounter{page}{1}
Fin dai suoi albori Internet, nato da ARPAnet, svolge un ruolo importantissimo nella vita di tutti noi, che sia condividere informazioni militari, utilizzare servizi erogati via Web, o più recentemente guardare contenuti audiovisivi ``on-the-go'', ovvero quello di connettere le persone intorno al globo nei più svariati modi possibili attraverso l'utilizzo di calcolatori come computer e/o dispositivi mobili ``connessi''. Fin dai suoi albori Internet, nato da ARPAnet, svolge un ruolo importantissimo nella vita di tutti noi, che sia per condividere informazioni militari, utilizzare servizi erogati via Web o, come sta accadendo in questi ultimi anni, guardare contenuti audiovisivi ``on-the-go'', connettendo cioè le persone intorno al globo nei più svariati modi possibili attraverso l'utilizzo di calcolatori come computer e dispositivi mobili ``connessi''.
Negli anni e per come è stato concepito Internet stesso architetturalmente, si sono venuti a formare veri metodi di comunicazione tra gli utilizzatori e gli erogatori di servizi Internet, più o meno sicuri, efficaci o resilienti rispetto a tematiche come la privacy dei dati, la centralizzazione e costi di operazione. Negli anni, e per come è stato concepito Internet stesso architetturalmente, si sono venuti a formare veri metodi di comunicazione tra gli utilizzatori e gli erogatori di servizi Internet, più o meno sicuri, efficaci o resilienti rispetto a tematiche come la privacy dei dati, la centralizzazione e costi di operazione.
Il modello Client/Server è certamente il più diffuso, reso famoso dall'imponente World Wide Web, il modo più intuitivo di utilizzare Internet ma certamente non l'unico.\cite{w3c} Questa architettura, specialmente nell'ambito della trasmissione di contenuti audiovisivi in streaming, presenta notevoli sfide tecniche ed economiche. L'infrastruttura centralizzata richiede server potenti e costosi che devono gestire simultaneamente migliaia di connessioni, con un consumo di banda che cresce linearmente con il numero di spettatori. Il modello Client/Server è certamente il più diffuso, reso famoso dall'imponente World Wide Web, il modo più intuitivo di utilizzare Internet ma certamente non l'unico\cite{w3c}. Questa architettura, in particolare nell'ambito della trasmissione di contenuti audiovisivi in streaming, presenta notevoli sfide tecniche ed economiche. L'infrastruttura centralizzata richiede server potenti e costosi che devono gestire simultaneamente migliaia di connessioni, con un consumo di banda che cresce linearmente con il numero di spettatori.
Negli ultimi anni, diverse piattaforme hanno cercato di risolvere questo problema attraverso l'adozione di tecnologie peer-to-peer (P2P) per la distribuzione dei contenuti. Tra queste, PeerTube si distingue come una delle soluzioni più promettenti, combinando una struttura federata con tecnologie di streaming P2P che promettono di ridurre significativamente il carico sui server centrali. Negli ultimi anni, diverse piattaforme hanno cercato di risolvere questo problema attraverso l'adozione di tecnologie peer-to-peer (P2P) per la distribuzione dei contenuti. Tra queste, PeerTube si distingue come una delle soluzioni più promettenti, combinando una struttura federata con tecnologie di streaming P2P che promettono di ridurre in modo significativo il carico sui server centrali.
Questa tesi si propone di analizzare criticamente le affermazioni fatte dagli sviluppatori di PeerTube riguardo l'efficienza e l'efficacia del loro approccio P2P nel contesto dello streaming video. Partiremo da un'analisi del panorama attuale dello streaming centralizzato, ne evidenzieremo i limiti, per poi esplorare le alternative decentralizzate e concentrarci su PeerTube, ricreando e ampliando i test condotti dai suoi sviluppatori per verificarne empiricamente le prestazioni. Questa tesi si propone di analizzare criticamente le affermazioni fatte dagli sviluppatori di PeerTube riguardo l'efficienza e l'efficacia del loro approccio P2P nel contesto dello streaming video. Partiremo da un'analisi del panorama attuale dello streaming centralizzato, ne evidenzieremo i limiti per poi esplorare le alternative decentralizzate e concentrarci su PeerTube, ricreando e ampliando i test condotti dai suoi sviluppatori per verificarne empiricamente le prestazioni.
\section{Il problema dello streaming centralizzato} \section{Il problema dello streaming centralizzato}
Un sistema Client/Server tradizionale per lo streaming video presenta diverse problematiche critiche: Un sistema Client/Server tradizionale per lo streaming video presenta diverse criticità:
\begin{itemize} \begin{itemize}
\item \textbf{Scalabilità limitata}: I server centrali devono gestire tutto il traffico in uscita, con costi di banda che crescono linearmente con il numero di spettatori. \item \textbf{Scalabilità limitata}: I server centrali devono gestire tutto il traffico in uscita, con costi di banda che crescono linearmente con il numero di spettatori.
@@ -319,7 +323,7 @@ Le tecnologie peer-to-peer offrono un approccio alternativo che potrebbe risolve
\item \textbf{Distribuzione del carico}: Ogni client può anche fungere da distributore per altri client, riducendo il carico sul server originale. \item \textbf{Distribuzione del carico}: Ogni client può anche fungere da distributore per altri client, riducendo il carico sul server originale.
\item \textbf{Maggiore resilienza}: L'assenza di un punto centrale di fallimento rende il sistema più robusto. \item \textbf{Maggiore resilienza}: L'assenza di un punto centrale di fallimento rende il sistema più robusto.
\item \textbf{Riduzione dei costi}: I costi di banda vengono distribuiti tra i partecipanti anziché essere sostenuti da un unico fornitore. \item \textbf{Riduzione dei costi}: I costi di banda vengono distribuiti tra i partecipanti anziché essere sostenuti da un unico fornitore.
\item \textbf{Decentralizzazione del controllo}: Nessuna entità singola può controllare completamente il flusso di informazioni. \item \textbf{Decentralizzazione del controllo}: Nessuna entità singola può controllare totalmente il flusso di informazioni.
\end{itemize} \end{itemize}
Tra le varie piattaforme che utilizzano questo approccio, PeerTube ha attirato la nostra attenzione per la sua architettura ibrida che combina federazione e P2P, e per le affermazioni dei suoi sviluppatori riguardo l'efficienza di questo approccio. In particolare, un articolo pubblicato dal team di PeerTube sostiene che la loro implementazione P2P può ridurre il carico sul server di origine fino all'80\%, una cifra che merita un'analisi approfondita e una verifica indipendente. Tra le varie piattaforme che utilizzano questo approccio, PeerTube ha attirato la nostra attenzione per la sua architettura ibrida che combina federazione e P2P, e per le affermazioni dei suoi sviluppatori riguardo l'efficienza di questo approccio. In particolare, un articolo pubblicato dal team di PeerTube sostiene che la loro implementazione P2P può ridurre il carico sul server di origine fino all'80\%, una cifra che merita un'analisi approfondita e una verifica indipendente.
@@ -331,12 +335,12 @@ Tra le varie piattaforme che utilizzano questo approccio, PeerTube ha attirato l
\subsection{Client/Server e il Web 2.0} \subsection{Client/Server e il Web 2.0}
Un sistema Client/Server è un tipo di computazione distribuita in cui i clienti effettuano delle richieste verso un server che a sua volta risponde con i dati/servizi richiesti restando in attesa. I client possono essere di vario tipo e trovarsi ovunque nel globo e in generale integrano una parte hardware (smartphone, PCs, \dots) ad una software (applicazioni GUI, web browser, \dots). I server, invece, sono delle macchine specializzate spesso raggruppate assieme in grandi data center, interconnesse tra di loro per fornire uno o più servizi a molteplici client contemporaneamente. Un sistema Client/Server è un tipo di computazione distribuita in cui i clienti effettuano delle richieste verso un server che, a sua volta, risponde con i dati/servizi richiesti restando in attesa. I client possono essere di vario tipo e trovarsi ovunque nel globo e, in generale, integrano una parte hardware (smartphone, PCs, \dots) a una software (applicazioni GUI, web browser, \dots). I server sono invece macchine specializzate spesso raggruppate assieme in grandi data center, interconnesse tra di loro per fornire uno o più servizi a molteplici client contemporaneamente.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=300pt]{images/Client-server-model.png} \includegraphics[width=300pt]{images/Client-server-model.png}
\caption{Modello Client/Server tradizionale} \caption{Modello Client/Server tradizionale \cite{VignoniCalimo2009}.}
\end{figure} \end{figure}
Questo modello ha dominato l'era del Web 2.0, caratterizzata da: Questo modello ha dominato l'era del Web 2.0, caratterizzata da:
@@ -364,7 +368,7 @@ Il modello peer-to-peer rappresenta un approccio alternativo in cui ogni nodo de
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=250pt]{images/p2p-network.png} \includegraphics[width=250pt]{images/p2p-network.png}
\caption{Modello P2P} \caption{Modello P2P \cite{The360Degree}.}
\end{figure} \end{figure}
\begin{itemize} \begin{itemize}
@@ -380,7 +384,7 @@ Tuttavia, le soluzioni P2P presentano anche alcune sfide:
\item Maggiore complessità tecnica \item Maggiore complessità tecnica
\item Possibili problemi di latenza e qualità del servizio \item Possibili problemi di latenza e qualità del servizio
\item Difficoltà nel garantire contenuti legali e moderazione \item Difficoltà nel garantire contenuti legali e moderazione
\item Sfide tecniche come il NAT traversal e la connettività tra peer \item Sfide tecniche come il NAT traversal
\end{itemize} \end{itemize}
\section{Modelli di distribuzione dei dati in rete} \section{Modelli di distribuzione dei dati in rete}
@@ -478,25 +482,26 @@ Le applicazioni CDN (Content Delivery Network) rappresentano un altro approccio
Nell'evoluzione dello streaming video, stiamo assistendo a un crescente interesse verso soluzioni ibride che combinano questi diversi modelli per ottimizzare l'esperienza utente, l'efficienza della rete e i costi operativi. Nell'evoluzione dello streaming video, stiamo assistendo a un crescente interesse verso soluzioni ibride che combinano questi diversi modelli per ottimizzare l'esperienza utente, l'efficienza della rete e i costi operativi.
\break
\section{Casi d'uso per lo streaming decentralizzato} \section{Casi d'uso per lo streaming decentralizzato}
Vediamo degli esempi di come questa interazione potrebbe essere svolta: Vediamo degli esempi di come questa interazione potrebbe essere svolta:
\usecase{Esempio d'interazione ``one to many''}{Un utente davanti al proprio computer vorrebbe condividere quello che vede sullo schermo con i propri amici o followers}{Utente principale, viewers, computer, connessione internet}{Condivisione in live streaming di un contenuto a schermo via internet con TCP/IP}{} \usecase{Esempio d'interazione ``one to many''}{Un utente davanti al proprio computer vorrebbe condividere quello che vede sullo schermo con i propri amici o followers}{Utente principale, viewers, computer, connessione internet}{Condivisione in live streaming di un contenuto a schermo via internet con TCP/IP}{}
\usecase{Esempio d'interazione ``many to many''}{Più utenti al proprio computer vorrebbero comunicare e interagire tra di loro contemporaneamente simil conference-call}{Utenti multipli, computer, connessione internet, microfono, telecamera}{Live streaming e interazione real-time tra utenti via internet con TCP/IP}{} \usecase{Esempio d'interazione ``many to many''}{Più utenti al proprio computer vorrebbero comunicare e interagire tra di loro contemporaneamente, come una conference-call}{Utenti multipli, computer, connessione internet, microfono, telecamera}{Live streaming e interazione real-time tra utenti via internet con TCP/IP}{}
\usecase{Esempio d'interazione ``one to many''}{Unazienda per questioni legate alla sicurezza sul lavoro si ritrova con la necessitò di dover fare dei ``workshop'' in diretta ai propri dipendenti con diverse locazioni sparse per il nel mondo senza utilizzare però grandi servizi cloud dato lelevato costo di banda e di noleggio del servizio per singolo utente finale, in questo caso il singolo dipendente}{Dipendenti, azienda}{Video streaming dei ``workshop'' per i dipendenti sparsi per il mondo}{} \usecase{Esempio d'interazione ``one to many''}{Unazienda, per questioni legate alla sicurezza sul lavoro, si ritrova con la necessitò di dover fare dei ``workshop'' in diretta ai propri dipendenti con diverse locazioni sparse per il nel mondo senza utilizzare però grandi servizi cloud, dato lelevato costo di banda e di noleggio del servizio per singolo utente finale (in questo caso il singolo dipendente)}{Dipendenti, azienda}{Video streaming dei ``workshop'' per i dipendenti sparsi per il mondo}{}
\usecase{Esempio d'interazione ``one to many''}{Un gruppo di amici deve svolgere un progetto universitario assieme e quindi interagire tra di loro facendo pair programming condividendo lo schermo gli uni con gli altri. Per questioni di privacy e sicurezza non vuole utilizzare un servizio pubblico come Discord in quanto vorrebbero tenere tutto segreto fino al giorno della presentazione}{Studenti}{Pair programming}{} \usecase{Esempio d'interazione ``one to many''}{Degli amici devono svolgere un progetto universitario assieme e quindi interagire tra di loro facendo pair programming condividendo lo schermo gli uni con gli altri. Per questioni di privacy e sicurezza non vogliono utilizzare un servizio pubblico come Discord in quanto vorrebbero tenere tutto segreto fino al giorno della presentazione}{Studenti}{Pair programming}{}
\usecase{Esempio d'interazione ``one to many''}{Una casa produttrice di film emergente vuole condividere i nuovi film in produzione con dei trailer ma a causa di dispute legate ai DRM, copyright e content strike di altre aziende più grandi non vuole utilizzare dei servizi già esistenti con EULA molto restringenti ma vuole avere il controllo dei propri diritti sul contenuto creato da essa stessa}{Filmmakers, appassionati di film}{Condivisione degli ultimi trailer per i film prodotti dalla casa}{} \usecase{Esempio d'interazione ``one to many''}{Una casa produttrice di film emergente vuole condividere i nuovi film in produzione con dei trailer ma a causa di dispute legate a DRM, copyright e content strike di altre aziende più grandi, non vuole utilizzare dei servizi già esistenti con EULA molto restringenti ma vuole avere il controllo dei propri diritti sul contenuto che ha creato}{Filmmakers, appassionati di film}{Condivisione degli ultimi trailer prodotti dalla casa}{}
\usecase{Esempio d'interazione ``one to many''}{Un gruppo di amici vuole fare una serata di gioco online e vuole condividere il proprio schermo con gli altri giocatori per poter giocare assieme}{Gamer}{Condivisione dello schermo per giocare assieme}{} \usecase{Esempio d'interazione ``one to many''}{Un gruppo di amici vuole fare una serata di gioco online e ognuno di loro vuole condividere il proprio schermo con gli altri giocatori per giocare assieme}{Gamer}{Giocare assieme tramite condivisione dello schermo}{}
\break \break
In sintesi, l'analisi dei casi d'uso evidenzia la necessità di una soluzione di streaming decentralizzata e a licenza libera, capace di operare in modalità uno-a-molti o molti-a-molti, senza affidarsi a servizi cloud proprietari e senza richiedere il deploy di una complessa infrastruttura hardware globale. I requisiti fondamentali, soprattutto in relazione all'elevato fabbisogno di banda tipico dei contenuti video, si declinano nei seguenti scenari applicativi: L'analisi dei casi d'uso evidenzia la necessità di una soluzione di streaming decentralizzata e a licenza libera, capace di operare in modalità uno-a-molti o molti-a-molti, senza affidarsi a servizi cloud proprietari e senza richiedere il deploy di una complessa infrastruttura hardware globale. I requisiti fondamentali, soprattutto in relazione all'elevato fabbisogno di banda tipico dei contenuti video, si declinano nei seguenti scenari applicativi:
\hfill\break \hfill\break
\textbf{Commerciale:} \textbf{Commerciale:}
@@ -520,7 +525,7 @@ In sintesi, l'analisi dei casi d'uso evidenzia la necessità di una soluzione di
\item Organizzazione di lan party, \item Organizzazione di lan party,
\item Supporto per streaming di gaming e attività live da parte di streamer, \item Supporto per streaming di gaming e attività live da parte di streamer,
\item Conference calls in piccoli gruppi, \item Conference calls in piccoli gruppi,
\item Impiego per telecamere di sicurezza, \item Impiego per telecamere di sicurezza per questioni di privacy,
\item Moderazione dei contenuti online. \item Moderazione dei contenuti online.
\end{itemize} \end{itemize}
@@ -544,9 +549,9 @@ Twitch è una piattaforma di live streaming di proprietà di Amazon lanciata nel
\caption{Home page di Twitch.} \caption{Home page di Twitch.}
\end{figure} \end{figure}
Una delle più famose e grandi, la piattaforma è stata originariamente sviluppata come una controparte di streaming per Justin.tv, una piattaforma di streaming generale. Tuttavia, Twitch si è concentrata esclusivamente sui contenuti di videogiochi e di eSports, anche se oggi rimane tutt'ora la scelta "de-facto" per molti utenti non solo per lo streaming di contenuti videoludici ma anche per lo "streaming general purpose" come ad esempio lo streaming di musica, arte, cucina e di varie attività creative. Una delle più grandi e famose, la piattaforma è stata originariamente sviluppata come una controparte di streaming per Justin.tv, una piattaforma di streaming generale. Tuttavia, Twitch si è concentrata esclusivamente sui contenuti di videogiochi e di eSports, anche se continua tutt'ora a essere la scelta "de-facto" per molti utenti non solo per lo streaming di contenuti videoludici ma anche per lo "streaming general purpose" come per esempio lo streaming di musica, arte, cucina e di varie attività creative.
Negli anni successivi, ha visto una rapida crescita e ha attirato una vasta gamma di creatori di contenuti, dalle grandi organizzazioni di esports ai singoli streamer indipendenti, fino ad oggi con una user base di circa 3 milioni di viewers e 1.5 milioni di broadcaster giornalieri rispettivamente. Negli anni successivi, Twitch ha visto una rapida crescita e ha attirato una vasta gamma di creatori di contenuti, dalle grandi organizzazioni di eSports ai singoli streamer indipendenti, fino ad arrivare ad oggi con una base rispettivamente di circa 3 milioni di viewers e 1.5 milioni di broadcaster giornalieri.
Twitch offre molti servizi sotto un unico sito web accessibile con un semplice browser: Twitch offre molti servizi sotto un unico sito web accessibile con un semplice browser:
@@ -556,17 +561,19 @@ Twitch offre molti servizi sotto un unico sito web accessibile con un semplice b
{Stream video e testo per funzionalità di live chat} {Stream video e testo per funzionalità di live chat}
{Proprietaria con contratto di utilizzo `EULA'} {Proprietaria con contratto di utilizzo `EULA'}
\break
\subsubsection{YouTube} \subsubsection{YouTube}
Youtube è una piattaforma di sharing online di video statici, di proprietà di Google, specializzata nella condivisione globale di video generici con funzionalità aggiuntive di social media, monetizzazione e live streaming. Youtube è una piattaforma di sharing online di video statici, di proprietà di Google, specializzata nella condivisione globale di video generici con funzionalità aggiuntive di social media, monetizzazione e live streaming.
\begin{figure}[H] \begin{figure}[htbp]
\centering \centering
\includegraphics[width=\textwidth]{images/youtubeHome.png} \includegraphics[width=\textwidth]{images/youtubeHome.png}
\caption{Home page di Youtube.} \caption{Home page di Youtube.}
\end{figure} \end{figure}
La compagnia è stata lanciata nel febbraio 2005 come indipendente ed è poi stata successivamente acquisita da Google. Al momento viene considerata la piattaforma più grande e longeva di questo segmento, con più di 2.5 miliardi di utenti mensili e milioni di ore di video condivisi ogni giorno. Dall'acquisizione, YouTube ha espanso la propria offerta al di fuori della sola condivisione di video "amatoriali", includendo contenuti come film di produzione professionale, video musicali ufficiali, documentari, news, ecc. Ha anche integrato la piattaforma pubblicitaria AdSense, sempre di proprietà di Google, permettendo a tutti gli utenti amatoriali o professionali approvati di poter ricevere un ricavo economico dalle pubblicità e dal marketing presenti sul sito. La compagnia è stata lanciata nel febbraio 2005 come indipendente ed è poi stata successivamente acquisita da Google.\\Al momento è considerata la piattaforma più grande e longeva di questo segmento, con più di 2.5 miliardi di utenti mensili e milioni di ore di video condivisi ogni giorno. Dall'acquisizione, YouTube ha espanso la propria offerta al di fuori della sola condivisione di video "amatoriali", includendo contenuti come film di produzione professionale, video musicali ufficiali, documentari, news, ecc.\\Ha anche integrato la piattaforma pubblicitaria chiamata `AdSense', sempre di proprietà di Google, permettendo a tutti gli utenti amatoriali o professionali approvati di poter ricevere un ricavo economico dalle pubblicità e dal marketing presenti sul sito.
\vfil
\serviceCharacteristics{Chiunque sul web}{Servizio accessibile via browser o applicazione mobile}{Centralizzata con utilizzo di CDN}{Video statici, live stream}{Proprietaria con contratto di utilizzo `EULA'} \serviceCharacteristics{Chiunque sul web}{Servizio accessibile via browser o applicazione mobile}{Centralizzata con utilizzo di CDN}{Video statici, live stream}{Proprietaria con contratto di utilizzo `EULA'}
@@ -574,9 +581,9 @@ La compagnia è stata lanciata nel febbraio 2005 come indipendente ed è poi sta
\subsubsection{Tahoe-LAFS} \subsubsection{Tahoe-LAFS}
Tahoe-LAFS è un sistema di file distribuito, open source, decentralizzato e sicuro che permette agli utenti di memorizzare e condividere file in un ambiente di rete distribuita chiamata `Grid'. Sviluppato da un gruppo di ricercatori dell'Università di Maryland, dal 2007 ed è stato rilasciato come software open source sotto licenza GPL. Tahoe-LAFS è stato progettato per essere un sistema di file distribuito sicuro, affidabile e scalabile, in modo da poter essere utilizzato in ambienti di rete distribuita, dato che promette di essere un sistema `provider-independent', ovvero che i fornitori dei server intermediari non hanno mai la possibilità di accedere o modificare i dati memorizzati dagli utenti finali perché che non sono loro a garantire la confidenzialità, l'integrità o l'assoluta disponibilità dei dati, ma sono i client finali a farlo. Tahoe-LAFS è un sistema di file distribuito, open source, decentralizzato e sicuro, che permette agli utenti di memorizzare e condividere file in un ambiente di rete distribuita chiamata `Grid'. Sviluppato da un gruppo di ricercatori dell'Università di Maryland, dal 2007 è stato rilasciato come software open source sotto licenza GPL. Tahoe-LAFS è stato progettato per essere un sistema di file distribuito sicuro, affidabile e scalabile, in modo da poter essere utilizzato in ambienti di rete distribuita, dato che promette di essere un sistema `provider-independent': i fornitori dei server intermediari non hanno mai la possibilità di accedere o modificare i dati memorizzati dagli utenti finali perché non sono loro a garantire la confidenzialità, l'integrità o l'assoluta disponibilità dei dati, ma sono i client finali a farlo.
Alla base, Tahoe-LAFS è essenzialmente un sistema di archiviazione chiave-valore. L'archivio utilizza delle corte stringhe, circa 100 byte, chiamate `capabilities' come chiavi e dati arbitrari come valori. Tahoe-LAFS è essenzialmente un sistema di archiviazione chiave-valore. L'archivio utilizza delle corte stringhe, circa 100 byte, chiamate \textit{capabilities} come chiavi e dati arbitrari come valori.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
@@ -584,33 +591,33 @@ Alla base, Tahoe-LAFS è essenzialmente un sistema di archiviazione chiave-valor
\caption{Tahoe-LAFS logo.} \caption{Tahoe-LAFS logo.}
\end{figure} \end{figure}
Si possono condividere queste `capabilities' per dare agli altri accesso a determinati valori sulla `Grid'. Ad esempio, si può dare la possibilità di lettura ad un amico e conservare il permesso di scrittura per te stessi. Queste `capabilities' posso essere condivise per dare agli altri accesso a determinati valori sulla `Grid'. Ad esempio, si può dare la possibilità di lettura a un amico e conservare il permesso di scrittura per se stessi.
Per eliminare un valore, basta dimenticare (cioè eliminare) la chiave della `capability', e, una volta fatto sarà impossibile recuperare i dati. I server di archiviazione però hanno un modo per fare `garbage-collection' da condivisioni non referenziate. Per eliminare un valore, basta dimenticare (cioè eliminare) la chiave della `capability': una volta fatto, sarà impossibile recuperare i dati. I server di archiviazione hanno però un modo per fare `garbage-collection' da condivisioni non referenziate.
In aggiunta al sistema chiave-valore, viene affiancato un livello i file-storage classico, che consente di condividere, con altri utenti, sotto-directory senza, ad esempio, rivelare l'esistenza o il contenuto delle directory principali. In aggiunta al sistema chiave-valore, viene affiancato un livello file-storage classico, che consente di condividere sotto-directory con altri utenti senza, ad esempio, rivelare l'esistenza o il contenuto delle directory principali.
Come detto prima, sono i clienti a garantire l'integrità e la confidenzialità dei dati, e questo viene realizzato grazie alla crittografia che viene eseguita su ogni `capability' prima di essere caricata sul `Grid'. Ogni valore viene prima crittografato con una chiave asimmetrica e poi spezzettato in parti più piccole, e più maneggiabili. Questi segmenti diventano poi effettivamente gli `share' che verranno memorizzati nei noti della rete, che ricordiamo, svolgono solo la funzione di memorizzazione dei dati, gli utenti non si affidano a loro per altro. \cite{tahoelafsAbouttahoerstTrunkdocs} \cite{torprojectHeartTahoeLAFS} Come indicato poco sopra, sono i clienti a garantire l'integrità e la confidenzialità dei dati. Questo viene realizzato grazie alla crittografia che viene eseguita su ogni `capability' prima di essere caricata sul `Grid'. Ogni valore viene prima crittografato con una chiave asimmetrica e poi suddiviso in parti più piccole, e più maneggiabili. Questi segmenti diventano poi effettivamente gli `share' che verranno memorizzati nei nodi della rete che, ricordiamo, svolgono solo la funzione di memorizzazione dei dati, gli utenti non si affidano a loro per altro \cite{tahoelafsAbouttahoerstTrunkdocs} \cite{torprojectHeartTahoeLAFS}.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=\textwidth]{images/tahoe-simple-data-flow.png} \includegraphics[width=\textwidth]{images/tahoe-simple-data-flow.png}
\caption{Tahoe-LAFS simple data flow.} \caption{Tahoe-LAFS simple data flow \cite{torprojectHeartTahoeLAFS}.}
\end{figure} \end{figure}
\serviceCharacteristics{Utenti e server di terze parti}{Software client lato utente}{Decentralizzata e `provider-indipendent'}{Qualsiasi tipo di file binario}{GPL} \serviceCharacteristics{Utenti e server di terze parti}{Software client lato utente}{Decentralizzata e `provider-indipendent'}{Qualsiasi tipo di file binario}{GPL}
\subsubsection{IPFS} \subsubsection{IPFS}
IPFS o `InterPlanetary File System' è una suite di protocolli e librerie open source per la condivisione di file in un ambiente di rete distribuita utilizzando meccanismi di `content-addressing'. IPFS è stato sviluppato da Protocol Labs, un'azienda di ricerca e sviluppo nel 2014. IPFS o `InterPlanetary File System' è una suite di protocolli e librerie open source per la condivisione di file in un ambiente di rete distribuita utilizzando meccanismi di `content-addressing'. Sviluppato nel 2014 da Protocol Labs, un'azienda di ricerca e sviluppo.
IPFS punta a creare un file system condiviso da una rete di nodi decentralizzata che comunica attraverso P2P, dove i singoli file sono organizzati come blocchi indipendentemente individuabili ed immutabili (ovvero che non possono essere modificati ma solo aggiunti o eliminati) con degli identificatori chiamati `CID (Content identifiers)' memorizzati in un database distribuito chiamato `DHT (Distributed Hash Table)' che viene condiviso con ogni singolo nodo della rete al fine di facilitare il routing dei dati attraverso essa stessa. IPFS punta a creare un file system condiviso da una rete di nodi decentralizzata che comunica attraverso P2P, dove i singoli file sono organizzati come blocchi indipendentemente individuabili e immutabili (ovvero che non possono essere modificati ma solo aggiunti o eliminati) con degli identificatori chiamati `CID (Content identifiers)' i quali sono memorizzati in un database distribuito chiamato `DHT (Distributed Hash Table)' che viene condiviso con ogni singolo nodo della rete al fine di facilitare il routing dei dati attraverso essa stessa.
Uno dei problemi di IPFS è che per design stesso, ogni singolo file è visibile a tutti i nodi della rete e quindi non è possibile creare un sistema di condivisione di file privati, ma solo di file pubblici, che però volendo possono essere crittografati, impedendo la lettura dei dati da parte di attori terzi. \cite{ipfsWhatIPFS} \cite{ipfsIPFSWhitepaper} Uno dei problemi di IPFS è che, per suo stesso design, ogni singolo file è visibile a tutti i nodi della rete e quindi non è possibile creare un sistema di condivisione di file privati, ma solo di file pubblici che, se lo si desidera, possono essere crittografati, impedendo la lettura dei dati da parte di attori terzi \cite{ipfsWhatIPFS} \cite{ipfsIPFSWhitepaper}.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=\textwidth]{images/Data-sharing-on-IPFS-by-owner.png} \includegraphics[width=\textwidth]{images/Data-sharing-on-IPFS-by-owner.png}
\caption{IPFS data flow. \cite{ResearchBasedDataRightsManagementUsingBlockchainOverEthereumNetwork}} \caption{IPFS data flow \cite{ResearchBasedDataRightsManagementUsingBlockchainOverEthereumNetwork}.}
\end{figure} \end{figure}
\serviceCharacteristics{Nodi della rete}{Protocolli e software lato client}{Decentralizzata simil Blockchain}{Qualsiasi tipo di file binario}{MIT} \serviceCharacteristics{Nodi della rete}{Protocolli e software lato client}{Decentralizzata simil Blockchain}{Qualsiasi tipo di file binario}{MIT}
@@ -620,8 +627,8 @@ PeerTube è un servizio di video sharing open source, federalizzato e decentrali
Fa parte del cosiddetto `Fediverse', un insieme di server interconnessi che comunicano tramite ActivityPub, un protocollo di comunicazione aperto per creare reti federate. Fa parte del cosiddetto `Fediverse', un insieme di server interconnessi che comunicano tramite ActivityPub, un protocollo di comunicazione aperto per creare reti federate.
Inizialmente creato come una piattaforma di video sharing per i creatori di contenuti indipendenti, è stato progettato per essere estensibile e adattabile a qualsiasi tipo di contenuto video che rispetti i termini delle singole istanze che vengono messe a disposizione pubblicamente. Inizialmente creato come una piattaforma di video sharing per i creatori di contenuti indipendenti, è stato progettato per essere estensibile e adattabile a qualsiasi tipo di contenuto video che rispetti i termini delle singole istanze che vengono messe a disposizione pubblicamente.
Il funzionamento è del tutto simile ad altre piattaforme video tipo (YouTube, Vimeo, Dailymotion, ecc.) con supporto per video statici e livestream, ma con la differenza che i video possono essere memorizzati e condivisi non solo dalle singole istanze della federazione attraverso il normale HTTP ma anche tra i client finali usando P2P per alleggerire il carico di banda. Il funzionamento è simile ad altre piattaforme video tipo (YouTube, Vimeo, Dailymotion, ecc.) con supporto per video statici e livestream, con la differenza che i video possono essere memorizzati e condivisi non solo dalle singole istanze della federazione attraverso il normale HTTP ma anche tra i client finali usando P2P per alleggerire il carico di banda.
PeerTube è iniziato come progetto indipendente da un singolo sviluppatore che poi è stato affiancato dalla no-profit Framasoft. \cite{peertubeAbout} \cite{wiki:ActivityPub} \cite{activitypubActivityPubRocks} PeerTube è iniziato come progetto indipendente da un singolo sviluppatore che poi è stato affiancato dalla no-profit Framasoft \cite{peertubeAbout} \cite{wiki:ActivityPub} \cite{activitypubActivityPubRocks}.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
@@ -638,7 +645,7 @@ PeerTube è iniziato come progetto indipendente da un singolo sviluppatore che p
\end{figure} \end{figure}
\subsubsection{Ace Stream} \subsubsection{Ace Stream}
Ace Stream è un software proprietario di video streaming basato su P2P, sviluppato da un gruppo di sviluppatori russi, che permette agli utenti di trasmettere in diretta video e audio, riprodurre file multimediali, e ricevere e condividere contenuti in tempo reale. Il software è stato rilasciato per la prima volta nel 2013 e da allora è stato scaricato più di 100 milioni di volte. Ace Stream offre una vasta gamma di funzionalità che lo rendono popolare tra gli utenti che desiderano guardare contenuti in streaming. Utilizzando la tecnologia P2P, il software consente agli utenti di trasmettere video e audio in tempo reale, senza dover attendere il completamento del download. Questo significa che gli utenti possono godere di una riproduzione fluida e senza interruzioni, anche con connessioni internet più lente. Ace Stream è un software proprietario di video streaming basato su P2P, sviluppato da un gruppo di sviluppatori russi, che permette agli utenti di trasmettere in diretta video e audio, riprodurre file multimediali, ricevere e condividere contenuti in tempo reale. Il software è stato rilasciato per la prima volta nel 2013 e da allora è stato scaricato più di 100 milioni di volte. Ace Stream offre una vasta gamma di funzionalità che lo rendono popolare tra gli utenti che desiderano guardare contenuti in streaming. Utilizzando la tecnologia P2P, il software consente agli utenti di trasmettere video e audio in tempo reale, senza dover attendere il completamento del download. Questo significa che gli utenti possono godere di una riproduzione fluida e senza interruzioni, anche con connessioni internet più lente.
\begin{figure}[htb] \begin{figure}[htb]
\centering \centering
@@ -646,46 +653,46 @@ Ace Stream è un software proprietario di video streaming basato su P2P, svilupp
\caption{PeerTube.} \caption{PeerTube.}
\end{figure} \end{figure}
Inoltre, Ace Stream supporta la riproduzione di file multimediali locali, consentendo agli utenti di guardare i propri film, serie TV e altri contenuti salvati sul proprio dispositivo. Il software supporta una vasta gamma di formati video e audio, garantendo un'alta compatibilità. Inoltre, Ace Stream supporta la riproduzione di file multimediali locali, consentendo agli utenti di guardare film, serie TV e altri contenuti salvati sul proprio dispositivo. Il software supporta una vasta gamma di formati video e audio, garantendo un'alta compatibilità.
Un'altra caratteristica interessante di Ace Stream è la possibilità di ricevere e condividere contenuti in tempo reale. Gli utenti possono creare i propri canali di streaming e condividere i propri contenuti con altri utenti. Questo rende il software ideale per gli appassionati di sport, che possono trasmettere eventi sportivi in diretta e condividerli con altri appassionati. Un'altra caratteristica interessante di Ace Stream è la possibilità di ricevere e condividere contenuti in tempo reale. Gli utenti possono creare i propri canali di streaming e condividere i propri contenuti con altri utenti. Questo rende il software ideale per esempio per gli appassionati di sport, che possono trasmettere eventi sportivi in diretta e condividerli con altri utenti.
Ace Stream è disponibile per diverse piattaforme, tra cui Windows, Mac, Linux e Android, il che lo rende accessibile a un vasto pubblico. Inoltre, il software è gratuito da scaricare e utilizzare, rendendolo ancora più attraente per gli utenti. Ace Stream è disponibile per diverse piattaforme, tra cui Windows, Mac, Linux e Android: ciò lo rende accessibile a un vasto pubblico. Inoltre, il software è gratuito da scaricare e utilizzare, rendendolo ancora più attraente per gli utenti.
In conclusione, Ace Stream è un software potente e versatile per lo streaming di video e audio. Grazie alla sua tecnologia P2P, offre una riproduzione fluida e senza interruzioni, consentendo agli utenti di godersi i propri contenuti preferiti in tempo reale. Con la possibilità di condividere contenuti e creare canali di streaming, Ace Stream offre un'esperienza di streaming interattiva e coinvolgente. \cite{acestreamAnnouncementStream} \cite{archiveStream} In conclusione, Ace Stream è un software potente e versatile per lo streaming di video e audio. Grazie alla sua tecnologia P2P, offre una riproduzione fluida e senza interruzioni, consentendo agli utenti di godersi i propri contenuti preferiti in tempo reale. Con la possibilità di condividere contenuti e creare canali di streaming, Ace Stream offre un'esperienza di streaming interattiva e coinvolgente \cite{acestreamAnnouncementStream} \cite{archiveStream}.
\serviceCharacteristics{Utenti registrati e non delle singole istanze}{Browser web e server indipendenti}{Federalizzata e decentralizzata P2P}{Video statici e livestream}{AGPLv3+} \serviceCharacteristics{Utenti registrati e non delle singole istanze}{Browser web e server indipendenti}{Federalizzata e decentralizzata P2P}{Video statici e livestream}{AGPLv3+}
\chapter{PeerTube: architettura e tecnologie} \chapter{PeerTube: architettura e tecnologie}
Tra tutti i progetti open source che si occupano di decentralizzazione e P2P, PeerTube è uno dei più interessanti e promettenti. In questo capitolo, esamineremo l'architettura e le tecnologie alla base di PeerTube, analizzando come il progetto si è evoluto nel corso degli anni e quali sono le sue caratteristiche principali. Tra i vari progetti open source che si occupano di decentralizzazione e P2P, PeerTube è uno dei più interessanti e promettenti. In questo capitolo, esamineremo l'architettura e le tecnologie alla base di PeerTube, analizzando come il progetto si è evoluto nel corso degli anni e quali sono le sue caratteristiche principali.
\section{Storia e evoluzione del progetto} \section{Storia ed evoluzione del progetto}
PeerTube è nato nel 2017 come progetto di un singolo sviluppatore di nome \textit{Chocobozzz} e successivamente poi supportato dall'organizzazione non profit francese Framasoft, con l'obiettivo di creare un'alternativa libera e decentralizzata a piattaforme come YouTube. Da allora, ha visto una crescita costante sia in termini di funzionalità che di adozione. PeerTube è nato nel 2017 come progetto di un singolo sviluppatore di nome \textit{Chocobozzz} e poi supportato dall'organizzazione non profit francese Framasoft, con l'obiettivo di creare un'alternativa libera e decentralizzata a piattaforme come YouTube. Da allora, ha visto una crescita costante sia in termini di funzionalità che di adozione.
Essendo una piattaforma di tipo ActivityPub, PeerTube fa parte del cosiddetto Fediverse, un network federato di piattaforme interconnesse. Questo significa che gli utenti di PeerTube possono interagire con utenti di altre piattaforme compatibili con ActivityPub, come Mastodon, Pleroma e Pixelfed.\cite{wiki:ActivityPub} Essendo una piattaforma di tipo ActivityPub, PeerTube fa parte del cosiddetto Fediverse, un network federato di piattaforme interconnesse. Questo significa che gli utenti di PeerTube possono interagire con utenti di altre piattaforme compatibili con ActivityPub, come Mastodon, Pleroma e Pixelfed\cite{wiki:ActivityPub}.
Ogni istanza di PeerTube fornisce un sito web, del tutto simile ad altre piattaforme come YouTube, per navigare e guardare video ed è, per impostazione predefinita, indipendente dalle altre in termini di aspetto, funzionalità e regole. Ogni istanza di PeerTube fornisce un sito web, del tutto simile ad altre piattaforme come YouTube, per navigare e guardare video ed è, per impostazione predefinita, indipendente dalle altre in termini di aspetto, funzionalità e regole.
Diverse istanze con regole comuni (ad esempio, consentire contenuti simili o richiedere la registrazione) possono formare federazioni, in cui seguono i video di altre istanze, pur mantenendo i contenuti archiviati solo sull'istanza che li ha pubblicati. Diverse istanze con regole comuni (per esempio, consentire contenuti simili o richiedere la registrazione) possono formare federazioni, in cui seguono i video di altre istanze, pur mantenendo i contenuti archiviati solo sull'istanza che li ha pubblicati.
Le federazioni sono indipendenti tra loro e asimmetriche: un'istanza può seguire un'altra per visualizzarne i video, senza reciprocità necessarie. Gli amministratori delle istanze possono scegliere di duplicare singoli video o intere istanze amiche, incentivando così la creazione di comunità con larghezza di banda condivisa. Le federazioni sono indipendenti tra loro e asimmetriche: un'istanza può seguire un'altra per visualizzarne i video, senza reciprocità necessarie. Gli amministratori delle istanze possono scegliere di duplicare singoli video o intere istanze amiche, incentivando così la creazione di comunità con larghezza di banda condivisa.
Alcune tappe importanti nella storia di PeerTube includono: Alcune tappe importanti nella storia di PeerTube includono \cite{wiki:PeerTube}:
\begin{itemize} \begin{itemize}
\item \textbf{2017}: Lancio del progetto da parte di \textit{Chocobozzz} \item \textbf{2017}: Lancio del progetto da parte di \textit{Chocobozzz}
\item \textbf{2018}: Supporto da parte di Framasoft e lancio della versione 1.0 \item \textbf{2018}: Supporto da parte di Framasoft e lancio della versione 1.0
\item \textbf{2021}: Lancio della versione 3.0 con introduzione del supporto per i livestream e miglioramenti all'interfaccia utente \item \textbf{2021}: Lancio della versione 3.0 con introduzione del supporto per i livestream e miglioramenti all'interfaccia utente
\item \textbf{2021}: Introduzione di funzionalità di moderazione avanzate e supporto per i sottotitoli \item \textbf{2021}: Introduzione di funzionalità di moderazione avanzate e supporto per i sottotitoli
\item \textbf{2022}: Il Garante Europeo della Protezione dei Dati (EDPS) lancia EU Video, una piattaforma video basata su PeerTube per le istituzioni, gli enti e le agenzie dell'Unione Europea, come progetto pilota su ActivityPub. Viene chiuso ufficialmente nel 2024. \item \textbf{2022}: Il Garante Europeo della Protezione dei Dati (EDPS) lancia EU Video, una piattaforma video basata su PeerTube per le istituzioni, gli enti e le agenzie dell'Unione Europea, come progetto pilota su ActivityPub. Viene chiuso ufficialmente nel 2024.
\end{itemize} \cite{wiki:PeerTube} \end{itemize}
\section{Stack tecnologico} \section{Stack tecnologico}
PeerTube è combina diverse tecnologie per fornire una piattaforma di streaming video decentralizzata e federata. La sua architettura si basa su un mix di tecnologie web moderne, tra cui Node.js, PostgreSQL, WebRTC etc. PeerTube combina diverse tecnologie per fornire una piattaforma di streaming video decentralizzata e federata. La sua architettura si basa su un mix di tecnologie web moderne, tra cui Node.js, PostgreSQL, WebRTC etc.
Interessante caratteristica è che PeerTube è progettato per essere estensibile consentendo agli sviluppatori e admin di aggiungere nuove funzionalità e miglioramenti senza dover modificare il codice sorgente principale. Questo approccio facilita la creazione di plugin e moduli personalizzati, che possono essere utilizzati per estendere le funzionalità della piattaforma. Interessante caratteristica è che PeerTube è progettato per essere estensibile: consente cioè agli sviluppatori e admin di aggiungere nuove funzionalità e miglioramenti senza dover modificare il codice sorgente principale. Questo approccio facilita la creazione di plugin e moduli personalizzati, che possono essere utilizzati per estendere le funzionalità della piattaforma.
Per esempio, di default, PeerTube non ha alcun supporto integrato per le chat room in diretta, ma è possibile installare un plugin molto popolare che consente di integrare un sistema di chat in tempo reale durante le dirette streaming. \cite{wiki:PeerTube} Per esempio, di default, PeerTube non ha alcun supporto integrato per le chat room in diretta, ma è possibile installare un plugin molto popolare che consente di integrare un sistema di chat in tempo reale durante le dirette streaming \cite{wiki:PeerTube}.
Riguardo invece la parte di distribuzione dei video, fino alla versione 6.0.0, PeerTube supportava sia HLS su WebRTC-P2P (noto anche come `HLS con P2P') sia WebTorrent. Riguardo invece la parte di distribuzione dei video, fino alla versione 6.0.0, PeerTube supportava sia HLS su WebRTC-P2P (noto anche come `HLS con P2P') sia WebTorrent.
@@ -695,11 +702,11 @@ WebTorrent è una re-implementazione del protocollo BitTorrent su WebRTC. Ogni s
HLS, normalmente implementato con hls.js, non include funzionalità P2P. PeerTube ha esteso questa tecnologia con un loader personalizzato, che scarica contemporaneamente i segmenti video sia dal server web sia da altri spettatori tramite WebRTC, riducendo così il carico sui server e distribuendo la banda attraverso il P2P. HLS, normalmente implementato con hls.js, non include funzionalità P2P. PeerTube ha esteso questa tecnologia con un loader personalizzato, che scarica contemporaneamente i segmenti video sia dal server web sia da altri spettatori tramite WebRTC, riducendo così il carico sui server e distribuendo la banda attraverso il P2P.
I video sono resi disponibili per il download tramite HTTP, ma la riproduzione privilegia un sistema peer-to-peer utilizzando HLS e WebRTC P2P. \cite{wiki:PeerTube} \cite{framablogPeerTubeOut} I video sono resi disponibili per il download tramite HTTP, ma la riproduzione privilegia un sistema peer-to-peer utilizzando HLS e WebRTC P2P \cite{wiki:PeerTube} \cite{framablogPeerTubeOut}.
\subsection{Architettura generale} \subsection{Architettura generale}
PeerTube utilizza un'architettura ibrida che combina: PeerTube utilizza un'architettura ibrida che combina \cite{githubGitHubChocobozzzPeerTube}:
\begin{itemize} \begin{itemize}
\item Un backend basato su Node.js e TypeScript \item Un backend basato su Node.js e TypeScript
\item Un frontend realizzato con Angular \item Un frontend realizzato con Angular
@@ -707,18 +714,19 @@ PeerTube utilizza un'architettura ibrida che combina:
\item Un database PostgreSQL per la persistenza dei dati \item Un database PostgreSQL per la persistenza dei dati
\item Un sistema di federazione basato su ActivityPub \item Un sistema di federazione basato su ActivityPub
\item Tecnologie P2P per la distribuzione dei contenuti (Novage P2P Media Loader) \item Tecnologie P2P per la distribuzione dei contenuti (Novage P2P Media Loader)
\end{itemize} \cite{githubGitHubChocobozzzPeerTube} \end{itemize}
\subsection{Streaming video con HLS} \subsection{Streaming video con HLS}
Per lo streaming video, PeerTube utilizza il protocollo HTTP Live Streaming (HLS), sviluppato da Apple. HLS è un protocollo di streaming adattativo che consente di trasmettere video in Per lo streaming video, PeerTube utilizza il protocollo HTTP Live Streaming (HLS), sviluppato da Apple. HLS è un protocollo di streaming adattativo che consente di trasmettere video in
diretta o on-demand su Internet. Il protocollo HLS funziona dividendo il flusso video in piccoli segmenti e trasmettendoli tramite HTTP. Questo approccio consente di adattare la qualità del video in base alla larghezza di banda disponibile, garantendo una riproduzione fluida e senza interruzioni. diretta o on-demand su Internet. Il protocollo HLS funziona dividendo il flusso video in piccoli segmenti e trasmettendoli tramite HTTP. Questo approccio consente di adattare la qualità del video in base alla larghezza di banda disponibile, garantendo una riproduzione fluida e senza interruzioni. Nello specifico il processo funziona come segue \cite{rfc8216}:
\begin{itemize} \begin{itemize}
\item Divide il video in piccoli segmenti (tipicamente di 2-10 secondi) \item Divide il video in piccoli segmenti (tipicamente di 2-10 secondi)
\item Crea un file manifest (.m3u8) che elenca i segmenti disponibili \item Crea un file manifest (.m3u8) che elenca i segmenti disponibili
\item Permette la selezione automatica della qualità in base alla connessione \item Permette la selezione automatica della qualità in base alla connessione
\item È compatibile con la maggior parte dei browser e dispositivi moderni \item È compatibile con la maggior parte dei browser e dispositivi moderni
\end{itemize} \cite{rfc8216} \end{itemize}
Per eseguire streaming video P2P, PeerTube utilizza un loader/player personalizzato. Questo loader consente di scaricare i segmenti video sia dal server web sia da altri spettatori tramite WebRTC, riducendo così il carico sui server e distribuendo la banda attraverso il P2P. Per eseguire streaming video P2P, PeerTube utilizza un loader/player personalizzato. Questo loader consente di scaricare i segmenti video sia dal server web sia da altri spettatori tramite WebRTC, riducendo così il carico sui server e distribuendo la banda attraverso il P2P.
@@ -729,14 +737,13 @@ Il cuore del sistema P2P di PeerTube è costituito da:
\begin{itemize} \begin{itemize}
\item \textbf{WebRTC}: Una tecnologia web standard per la comunicazione peer-to-peer diretta tra browser \item \textbf{WebRTC}: Una tecnologia web standard per la comunicazione peer-to-peer diretta tra browser
\item \textbf{P2P Media Loader}: Una libreria JavaScript che integra il P2P nel player video \item \textbf{P2P Media Loader}: Una libreria JavaScript che integra il P2P nel player video
\item \textbf{WebTorrent Tracker}: Un tracker\footnote{Un server che aiuta a trovare altri peer nella rete BitTorrent mantenendo un elenco dei peer che stanno scaricando un determinato file.} BitTorrent per la scoperta dei peer, utilizzato come sistema di signaling \item \textbf{WebTorrent Tracker}: Un tracker\footnote{Un server che aiuta a trovare altri peer nella rete BitTorrent mantenendo un elenco dei peer che stanno scaricando un determinato file \cite{githubGitHubWebtorrentbittorrenttracker}.} BitTorrent per la scoperta dei peer, utilizzato come sistema di signaling
\end{itemize} \end{itemize}
\subsubsection{WebRTC} \subsubsection{WebRTC}
WebRTC \footnote{Web Real-Time Communication} è un progetto gratuito e open-source che fornisce ai browser web e alle applicazioni mobile la possibilità di instaurare comunicazioni in tempo reale tramite API standard, tipicamente in JavaScript. WebRTC \footnote{Web Real-Time Communication} è un progetto gratuito e open-source che fornisce ai browser web e alle applicazioni mobili la possibilità di instaurare comunicazioni in tempo reale tramite API standard, tipicamente in JavaScript.
Consente inoltre la comunicazione e lo streaming audio-video direttamente all'interno delle pagine web, permettendo la connessione peer-to-peer senza la necessità di installare plugin o scaricare applicazioni native.
Consente la comunicazione e lo streaming audio-video direttamente all'interno delle pagine web, permettendo la connessione peer-to-peer senza la necessità di installare plugin o scaricare applicazioni native.
I maggiori componenti che costituiscono WebRTC sono: I maggiori componenti che costituiscono WebRTC sono:
\begin{itemize} \begin{itemize}
@@ -756,14 +763,14 @@ Affinché un'app WebRTC possa avviare una sessione, i suoi client devono scambia
Questo processo di signaling, ovvero la scoperta dei peer con cui connettersi e la determinazione delle modalità di stabilimento delle connessioni, richiede un meccanismo che permetta ai client di scambiarsi messaggi avanti e indietro. Questo processo di signaling, ovvero la scoperta dei peer con cui connettersi e la determinazione delle modalità di stabilimento delle connessioni, richiede un meccanismo che permetta ai client di scambiarsi messaggi avanti e indietro.
L' WebRTC non include meccanismo. Questo compito è lasciato all'applicazione, che può utilizzare qualsiasi mezzo di comunicazione per lo scambio di informazioni di segnalazione. WebRTC non include tale meccanismo. Questo compito è lasciato all'applicazione, che può utilizzare qualsiasi mezzo di comunicazione per lo scambio di informazioni di segnalazione.
I metodi e i protocolli di signaling da implementare sono invece definiti dal JavaScript Session Establishment Protocol (JSEP), per evitare ridondanze e massimizzare la compatibilità con le tecnologie esistenti. Le applicazioni per fare ciò devono implementare dei metodi e dei protocolli che sono definiti dal JavaScript Session Establishment Protocol (JSEP) (per evitare ridondanze di implementazione e massimizzare la compatibilità con le tecnologie esistenti).
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=300pt]{images/jsep-architecture-diagram_856.png} \includegraphics[width=300pt]{images/jsep-architecture-diagram_856.png}
\caption{Architettura JSEP.} \caption{Architettura JSEP \cite{webBuildBackend}.}
\end{figure} \end{figure}
JSEP richiede lo scambio tra peer di offerte e risposte, includendo i metadati dei media da voler condividere. JSEP richiede lo scambio tra peer di offerte e risposte, includendo i metadati dei media da voler condividere.
@@ -799,18 +806,18 @@ Di tanto in tanto, peer casuali della rete scaricano nuovi segmenti tramite HTTP
\section{Signaling e NAT Traversal} \section{Signaling e NAT Traversal}
Come menzionato prima, un aspetto critico del sistema P2P è il processo di signaling e di NAT traversal che permette ai peer di scoprirsi e connettersi tra loro. Come menzionato poco sopra, un aspetto critico del sistema P2P è il processo di signaling e di NAT traversal che permette ai peer di scoprirsi e connettersi tra loro.
\textbf{NAT} è un metodo per mappare uno spazio di indirizzi IP in un altro, modificando le informazioni sugli indirizzi di rete nell'header IP dei pacchetti mentre sono in transito attraverso un dispositivo di routing del traffico. \textbf{NAT} è un metodo per mappare uno spazio di indirizzi IP in un altro, modificando le informazioni sugli indirizzi di rete nell'header IP dei pacchetti mentre sono in transito attraverso un dispositivo di routing del traffico.
Questa tecnica è stata inizialmente utilizzata per evitare la necessità di assegnare un nuovo indirizzo a ogni host quando una rete veniva spostata o quando il provider di servizi Internet a monte veniva sostituito ma non poteva instradare lo spazio di indirizzi della rete. Con il tempo, è diventata uno strumento essenziale per la conservazione dello spazio globale degli indirizzi a causa dell'esaurimento degli indirizzi IPv4. Un singolo indirizzo IP instradabile su Internet di un gateway NAT può essere utilizzato per un'intera rete privata. Questa tecnica è stata inizialmente utilizzata per evitare la necessità di assegnare un nuovo indirizzo a ogni host quando una rete veniva spostata o quando il provider di servizi Internet a monte veniva sostituito ma non poteva instradare lo spazio di indirizzi della rete. Con il tempo, è diventata uno strumento essenziale per la conservazione dello spazio globale degli indirizzi a causa dell'esaurimento degli indirizzi IPv4. Un singolo indirizzo IP instradabile su Internet di un gateway NAT può essere utilizzato per un'intera rete privata.
Poiché la traduzione degli indirizzi di rete modifica le informazioni sugli indirizzi IP nei pacchetti, le implementazioni NAT possono variare nel loro comportamento specifico in diversi casi di indirizzamento e nel loro impatto sul traffico di rete. I produttori di dispositivi che implementano NAT non documentano comunemente i dettagli specifici del comportamento NAT. \cite{rfc2663} Poiché la traduzione degli indirizzi di rete modifica le informazioni sugli indirizzi IP nei pacchetti, le implementazioni NAT possono variare nel loro comportamento specifico in diversi casi di indirizzamento e nel loro impatto sul traffico di rete. I produttori di dispositivi che implementano NAT non documentano comunemente i dettagli specifici del comportamento NAT \cite{rfc2663}.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=300pt]{images/NAT_Concept-en.png} \includegraphics[width=300pt]{images/NAT_Concept-en.png}
\caption{Schema NAT.} \caption{Schema NAT \cite{wiki:Network_address_translation}.}
\end{figure} \end{figure}
I problemi di attraversamento del NAT (NAT traversal) si verificano quando peer situati dietro NAT diversi tentano di comunicare tra loro direttamente. I problemi di attraversamento del NAT (NAT traversal) si verificano quando peer situati dietro NAT diversi tentano di comunicare tra loro direttamente.
@@ -822,13 +829,13 @@ Un modo per risolvere questo problema è utilizzare il port forwarding. Un'altra
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=300pt]{images/nat-traversal.png} \includegraphics[width=300pt]{images/nat-traversal.png}
\caption{Schema NAT Traversal.} \caption{Schema NAT Traversal \cite{tailscaleTraversalWorks}.}
\end{figure} \end{figure}
Esistono diverse tecniche di attraversamento del NAT, tra cui: Esistono diverse tecniche di attraversamento del NAT, tra cui:
\begin{itemize} \begin{itemize}
\item \textbf{UPnP} (Universal Plug and Play): Un protocollo di rete di vecchia data, ampiamente implementato che consente ai dispositivi di comunicare tra loro senza la necessità di configurazioni manuali. \item \textbf{UPnP} (Universal Plug and Play): Un protocollo di rete di vecchia data, ampiamente implementato che consente ai dispositivi di comunicare tra loro senza la necessità di configurazioni manuali.
\item \textbf{NAT-PMP} (NAT Port Mapping Protocol): Un protocollo simile ad UPnP che consente ai dispositivi di comunicare tra loro attraverso un router NAT creato da Apple. \item \textbf{NAT-PMP} (NAT Port Mapping Protocol): Un protocollo simile a UPnP che consente ai dispositivi di comunicare tra loro attraverso un router NAT creato da Apple.
\item \textbf{PCP} (Port Control Protocol): Il protocollo successore di NAT-PMP. \item \textbf{PCP} (Port Control Protocol): Il protocollo successore di NAT-PMP.
\end{itemize} \end{itemize}
@@ -847,44 +854,42 @@ STUN è uno strumento utilizzato da altri protocolli, come Interactive Connectiv
Il protocollo richiede l'assistenza di un server di rete di terze parti (un server STUN) situato sul lato opposto (pubblico) del NAT, solitamente su Internet. Il protocollo richiede l'assistenza di un server di rete di terze parti (un server STUN) situato sul lato opposto (pubblico) del NAT, solitamente su Internet.
STUN quindi, è fondamentale per i client dietro un NAT, dato che li consente di scoprire il proprio indirizzo IP e le porte visibili esternamente, così come vengono viste da un server su Internet. STUN è quindi fondamentale per i client dietro un NAT, dato che consente loro di scoprire il proprio indirizzo IP e le porte visibili esternamente, così come vengono viste da un server su Internet.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=300pt]{images/stun-server.png} \includegraphics[width=300pt]{images/stun-server.png}
\caption{Schema STUN.} \caption{Schema STUN \cite{tailscaleTraversalWorks}.}
\end{figure} \end{figure}
Quando le connessioni peer-to-peer dirette non possono essere stabilite, dei server di inoltro (relay) fungono da intermediari: Quando le connessioni peer-to-peer dirette non possono essere stabilite, dei server di inoltro (relay) fungono da intermediari:
\begin{itemize} \begin{itemize}
\item \textbf{TURN} (Traversal Using Relays around NAT): un protocollo standard in cui i client si autenticano con un server TURN, che assegna loro un indirizzo IP pubblico e una porta, inoltrando il traffico tra i peer. \item \textbf{TURN} (Traversal Using Relays around NAT): un protocollo standard in cui i client si autenticano con un server TURN, che assegna loro un indirizzo IP pubblico e una porta, inoltrando il traffico tra i peer.
\end{itemize} \cite{tailscaleTraversalWorks} \end{itemize}
WebRTC utilizza il protocollo ICE (Interactive Connectivity Establishment) menzionato prima, per negoziare la connessione tra i peer, utilizzando server STUN e TURN per facilitare il processo. WebRTC utilizza il protocollo ICE (Interactive Connectivity Establishment) menzionato prima, per negoziare la connessione tra i peer, utilizzando server STUN e TURN per facilitare il processo \cite{tailscaleTraversalWorks}.
\section{Algoritmo di selezione dei peer} \section{Algoritmo di selezione dei peer}
L'efficienza del sistema P2P dipende in modo cruciale dall'algoritmo utilizzato per selezionare i peer da cui scaricare i dati. PeerTube, e di conseguenza Novage P2P Media loader utilizza come menzionato prima un WebTorrent Tracker some sistema di signaling che utilizza un algoritmo del tutto simile a quello di BitTorrent dato che il protocollo funziona esattamente come il protocollo BitTorrent, ma utilizza WebRTC invece di TCP/uTP come protocollo di trasporto. L'efficienza del sistema P2P dipende in modo cruciale dall'algoritmo utilizzato per selezionare i peer da cui scaricare i dati. PeerTube, e di conseguenza Novage P2P Media loader, utilizza come menzionato prima un WebTorrent Tracker come sistema di signaling che utilizza un algoritmo del tutto simile a quello di BitTorrent, dato che il protocollo funziona esattamente come il protocollo BitTorrent ma utilizza WebRTC invece di TCP/uTP come protocollo di trasporto.
La specifica BitTorrent, versione 1.0, definisce vari algoritmi per la selezione dei peer; i peer vengono selezionati attraverso una combinazione di azioni da parte del tracker e dei singoli client. La specifica BitTorrent, versione 1.0, definisce vari algoritmi per la selezione dei peer; i peer vengono selezionati attraverso una combinazione di azioni da parte del tracker e dei singoli client.
Dalla parte del tracker: Dalla parte del tracker:
\begin{itemize} \begin{itemize}
\item Quando un client invia una richiesta al tracker (announce), il tracker risponde con un elenco di peer che partecipano allo stesso torrent (o video su una pagina web nel nostro caso). \item Quando un client invia una richiesta al tracker (announce), il tracker risponde con un elenco di peer che partecipano allo stesso torrent (o video su una pagina web nel nostro caso).
\item Di default a, il tracker fornisce un elenco fino a 50 peer. Se sono disponibili meno peer, l'elenco sarà più piccolo. \item Di default il tracker fornisce un elenco fino a 50 peer. Se sono disponibili meno peer, l'elenco sarà più piccolo.
\item Il tracker generalmente seleziona i peer in modo casuale per la sua risposta. Tuttavia, può anche utilizzare un algoritmo di selezione dei peer personalizzato. \item Il tracker generalmente seleziona i peer in modo casuale per la sua risposta. Tuttavia, può anche utilizzare un algoritmo di selezione dei peer personalizzato.
\end{itemize} \end{itemize}
Una volta che un client riceve un elenco di peer dal tracker e stabilisce le connessioni, gestisce queste connessioni utilizzando un algoritmo di choking e optimistic unchoking. Una volta che un client riceve un elenco di peer dal tracker e stabilisce le connessioni, gestisce queste connessioni utilizzando un algoritmo di choking e optimistic unchoking. Questo processo determina quali peer il client utilizzerà attivamente per scaricare e caricare i dati \cite{theoryBitTorrentSpecificationTheoryOrg} \cite{rfc5389}.
Questo processo determina quali peer il client utilizzerà attivamente per scaricare e caricare i dati.
\begin{itemize} \begin{itemize}
\item \textbf{Choking}: Un peer può fare choking (rifiutarsi di caricare dati) verso altri peer per diversi motivi, tra cui: Controllo della congestione TCP, per evitare sovraccarichi di rete; Strategia tit-for-tat, per garantire un tasso di download costante, dando priorità ai peer che condividono attivamente. Quando un peer viene `strangolato', il client non deve inviare richieste per blocchi di dati a quel peer. \item \textbf{Choking}: Un peer può fare choking (rifiutarsi di caricare dati) verso altri peer per diversi motivi, tra cui: Controllo della congestione TCP, per evitare sovraccarichi di rete; Strategia tit-for-tat, per garantire un tasso di download costante, dando priorità ai peer che condividono attivamente. Quando un peer viene `strangolato', il client non deve inviare richieste per blocchi di dati a quel peer \cite{theoryBitTorrentSpecificationTheoryOrg}.
\item \textbf{Unchoking}: Per gestire i download e contraccambiare i peer utili, un client solitamente sblocca i quattro peer interessati che hanno il miglior tasso di upload. Questi vengono chiamati `downloaders'. Se un peer ha un tasso di upload migliore ma non è interessato, potrebbe comunque essere sbloccato, e se diventa interessato, il downloader con il tasso di upload peggiore viene bloccato. I client con un file completo utilizzano il loro tasso di upload per decidere quali peer sbloccare. \item \textbf{Unchoking}: Per gestire i download e contraccambiare i peer utili, un client solitamente sblocca i quattro peer interessati che hanno il miglior tasso di upload. Questi vengono chiamati `downloaders'. Se un peer ha un tasso di upload migliore ma non è interessato, potrebbe comunque essere sbloccato, e se diventa interessato, il downloader con il tasso di upload peggiore viene bloccato. I client con un file completo utilizzano il loro tasso di upload per decidere quali peer sbloccare \cite{theoryBitTorrentSpecificationTheoryOrg}.
\item \textbf{Optimistic unchoking}: Per scoprire potenziali peer migliori, il client sblocca in modo ottimistico un peer per un intervallo di 30 secondi, indipendentemente dal suo tasso di upload. Il peer sbloccato ottimisticamente ruota, il che significa che i peer appena connessi hanno una maggiore probabilità di essere scelti inizialmente. \item \textbf{Optimistic unchoking}: Per scoprire potenziali peer migliori, il client sblocca in modo ottimistico un peer per un intervallo di 30 secondi, indipendentemente dal suo tasso di upload. Il peer sbloccato ottimisticamente ruota, il che significa che i peer appena connessi hanno una maggiore probabilità di essere scelti inizialmente.
\item \textbf{Anti-snubbing}: Se un client smette di ricevere dati da un peer per più di un minuto, suppone di essere stato `snobbato' e potrebbe temporaneamente smettere di caricare dati verso quel peer. Questo può portare a più di un meccanismo di unchoking ottimistico concorrente per trovare dei peer migliori. \item \textbf{Anti-snubbing}: Se un client smette di ricevere dati da un peer per più di un minuto, suppone di essere stato `snobbato' e potrebbe temporaneamente smettere di caricare dati verso quel peer. Questo può portare a più di un meccanismo di unchoking ottimistico concorrente per trovare dei peer migliori \cite{theoryBitTorrentSpecificationTheoryOrg}.
\end{itemize} \cite{theoryBitTorrentSpecificationTheoryOrg} \cite{rfc5389} \end{itemize}
\section{Sistema di monitoraggio integrato con OpenTelemetry} \section{Sistema di monitoraggio integrato con OpenTelemetry}
@@ -894,22 +899,22 @@ Affronta la sfida delle pratiche di osservabilità frammentate tra diversi lingu
PeerTube integra OpenTelemetry, per il monitoraggio delle prestazioni complessive del server, raccogliendo metriche come: PeerTube integra OpenTelemetry, per il monitoraggio delle prestazioni complessive del server, raccogliendo metriche come:
\begin{itemize} \begin{itemize}
\item \textbf{Percentuale di dati condivisi via P2P e HTTP} \item Percentuale di dati condivisi via P2P e HTTP
\item \textbf{Numero di utenti connessi} \item Numero di utenti connessi
\item \textbf{Utilizzo della CPU, della memoria etc.} \item Utilizzo della CPU, della memoria etc
\item \textbf{Utilizzo della banda del server} \item Utilizzo della banda del server
\item \textbf{Errori e disconnessioni} \item Errori e disconnessioni
\end{itemize} \end{itemize}
Queste metriche possono essere poi visualizzate attraverso dashboard Grafana o altri sistemi di monitoraggio compatibili con OpenTelemetry. Queste metriche possono essere poi visualizzate attraverso dashboard Grafana o altri sistemi di monitoraggio compatibili con OpenTelemetry.
\chapter{Verifica empirica delle prestazioni P2P di PeerTube} \chapter{Verifica empirica delle prestazioni P2P di PeerTube}
A dicembre 2023, il team di PeerTube ha pubblicato un articolo in cui va ad analizzarne le prestazioni facendo degli \textit{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. A dicembre 2023, il team di PeerTube ha pubblicato un articolo \cite{joinpeertubePeerTubeStress} in cui va ad analizzarne le prestazioni di PeerTube facendo degli \textit{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 video in diretta della piattaforma.
\ \
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. Per realizzare test veritieri, il team ha simulato 1000 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. 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, stando quanto detto degli sviluppatori di PeerTube. 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, stando quanto detto degli sviluppatori di PeerTube.
@@ -939,7 +944,7 @@ I dati dei test sono stati raccolti tramite OpenTelemetry e Grafana, con metrich
\item Numero di spettatori \item Numero di spettatori
\end{itemize} \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 \textit{on-demand}. 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 \textit{on-demand}.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
@@ -987,37 +992,36 @@ La differenza tra docker e una macchina virtuale è che i container Docker condi
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=350pt]{images/docker-engine.png} \includegraphics[width=350pt]{images/docker-engine.png}
\caption{Docker Engine.} \caption{Docker Engine \cite{uclvDockerOverview}.}
\end{figure} \end{figure}
In se Docker è composto da 4 componenti principali: In sé Docker è composto da 4 componenti principali \cite{AzureFunctions} \cite{geeksforgeeksContainerizationUsing}:
\begin{itemize} \begin{itemize}
\item \textbf{Docker Engine}: Il core del sistema, responsabile della creazione e gestione dei container nonché il processo demone eseguito sulla macchina host. Fornisce l'accesso a tutte le funzionalità e i \item \textbf{Docker Engine}: Il core del sistema, responsabile della creazione e gestione dei container nonché il processo demone eseguito sulla macchina host. Fornisce l'accesso a tutte le funzionalità e i
servizi messi a disposizione da Docker. Mette a disposizione un insieme di comandi per la gestione dei container, delle immagini e dei volumi. servizi messi a disposizione da Docker. Fornisce un insieme di comandi per la gestione dei container, delle immagini e dei volumi.
\item \textbf{Docker Client}: Interfaccia da riga di comando e \footnote{API: sinonimo di Application Programming Interface.} \textit{API} per interagire con Docker Engine. \item \textbf{Docker Client}: Interfaccia da riga di comando e \textit{API} \footnote{API: sinonimo di Application Programming Interface.} per interagire con Docker Engine.
\item \textbf{Docker Image}: Un \textit{template} di sola lettura che contiene e definisce i parametri di una applicazione da eseguire in un container a runtime. Le immagini vengono create e organizzate per livelli \textit{stateless} e immutabili. \item \textbf{Docker Image}: Un \textit{template} di sola lettura che contiene e definisce i parametri di una applicazione da eseguire in un container a runtime. Le immagini vengono create e organizzate per livelli \textit{stateless} e immutabili.
\item \textbf{Docker Container}: Un'istanza in esecuzione di un'immagine Docker. Un container è un ambiente isolato che esegue un'applicazione specifica e include tutto il necessario per eseguire l'applicazione, come il codice, le librerie, le variabili d'ambiente e le dipendenze. Il \textit{filesystem} del container è l'ultimo livello che viene aggiunto al quale vi è possibile accedere sia in lettura che in scrittura. I contenitori, inoltre, possono essere associati a dei volumi per la persistenza dei dati, i quali forniscono un metodo semplice e immediato per condividere dati tra i container e l'host.\\La comunicazione tra container avviene tramite la creazione di \textit{network} o reti separate che vengono connesse ai singoli container, abilitando così una sorta di LAN interna tra un insieme di container. Per far, invece, comunicare i container con il mondo esterno bisogna invece utilizzare i `port mapping' tra una porta della macchina host e una porta del container. \item \textbf{Docker Container}: Un'istanza in esecuzione di un'immagine Docker. Un container è un ambiente isolato che esegue un'applicazione specifica e include tutto il necessario per eseguire l'applicazione, come il codice, le librerie, le variabili d'ambiente e le dipendenze. Il \textit{filesystem} del container è l'ultimo livello che viene aggiunto al quale vi è possibile accedere sia in lettura che in scrittura. I contenitori, inoltre, possono essere associati a dei volumi per la persistenza dei dati fornendo un metodo semplice e immediato per condividere dati tra i container e l'host.\\La comunicazione tra container avviene tramite la creazione di \textit{network} o reti separate che vengono connesse ai singoli container, abilitando così una sorta di LAN interna tra un insieme di container. Per fare comunicare i container con il mondo esterno bisogna invece utilizzare i `port mapping' tra una porta della macchina host e una porta del container.
\end{itemize} \end{itemize}
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=200pt]{images/0_ukWqRD74ltfb5Uaz.png} \includegraphics[width=200pt]{images/0_ukWqRD74ltfb5Uaz.png}
\caption{Docker Overview.} \caption{Docker Overview \cite{innovationyourselfDockerDocker}.}
\end{figure} \end{figure}
Approfondendo il discorso del networking, Docker mette a disposizione vari tipi di reti per la comunicazione tra container, i 3 principali sono: Approfondendo il discorso del networking, Docker mette a disposizione vari tipi di reti per la comunicazione tra container. I 3 principali sono \cite{geeksforgeeksDockerNetworking}:
\begin{itemize} \begin{itemize}
\item \textbf{Bridge}: È la rete di default che viene creata quando si installa Docker. I container connessi a questa rete possono comunicare tra loro e con il host, ma non possono comunicare con i container in altre reti. \item \textbf{Bridge}: È la rete di default che viene creata quando si installa Docker. I container connessi a questa rete possono comunicare tra loro e con l'host, ma non possono comunicare con i container in altre reti.
\item \textbf{Host}: I container connessi a questa rete, condividono la rete dell'host, quindi non hanno bisogno di fare \textit{port mapping} per comunicare con il mondo esterno. \item \textbf{Host}: I container connessi a questa rete condividono la rete dell'host, quindi non hanno bisogno di fare \textit{port mapping} per comunicare con il mondo esterno.
\item \textbf{None}: I container connessi a questa rete non hanno accesso ad alcuna rete, quindi non possono comunicare con altri container o con l'esterno. \item \textbf{None}: I container connessi a questa rete non hanno accesso ad alcuna rete, quindi non possono comunicare con altri container o con l'esterno.
\end{itemize} \end{itemize}
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=\textwidth]{images/Docker-network-1.png} \includegraphics[width=\textwidth]{images/Docker-network-1.png}
\caption{Docker Networking.} \caption{Docker Networking \cite{geeksforgeeksDockerNetworking}.}
\end{figure} \end{figure}
\cite{AzureFunctions} \cite{geeksforgeeksContainerizationUsing} \cite{geeksforgeeksDockerNetworking}
\subsection{Telegraf} \subsection{Telegraf}
@@ -1026,12 +1030,12 @@ Telegraf è un agente di raccolta di metriche open source sviluppato da InfluxDa
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=300pt]{images/telegraf-architecture-diagram.png} \includegraphics[width=300pt]{images/telegraf-architecture-diagram.png}
\caption{Architettura Telegraf.} \caption{Architettura Telegraf \cite{influxdataInfrastructureMonitoring}.}
\end{figure} \end{figure}
Scritto in \textit{Go}, Telegraf è dotato di oltre 300 plugin di input, trasformazione e output di dati, che consentono di raccogliere metriche da una vasta gamma di sorgenti. Per sua natura, funziona come un pipeline di dati che può essere instradata attraverso diversi plugin per elaborare e aggregare le informazioni prima di raggiungere l'output finale. Scritto in \textit{Go}, Telegraf è dotato di oltre 300 plugin di input, trasformazione e output di dati, che consentono di raccogliere metriche da una vasta gamma di sorgenti. Per sua natura, funziona come un pipeline di dati che può essere instradata attraverso diversi plugin per elaborare e aggregare le informazioni prima di raggiungere l'output finale \cite{noauthor_telegraf_nodate}.
Alcuni componenti principali di Telegraf includono: Alcuni componenti principali di Telegraf includono \cite{githubGitHubInfluxdatatelegraf}:
\begin{itemize} \begin{itemize}
\item \textbf{Agent}: Il core del sistema, responsabile della raccolta e dell'elaborazione delle metriche dai plugin di input definiti e le invia ai plugin di output specificati, in base alla configurazione fornita. \item \textbf{Agent}: Il core del sistema, responsabile della raccolta e dell'elaborazione delle metriche dai plugin di input definiti e le invia ai plugin di output specificati, in base alla configurazione fornita.
\item \textbf{Input Plugins}: Raccolgono metriche da sorgenti come sistemi operativi, database, applicazioni e dispositivi di rete. \item \textbf{Input Plugins}: Raccolgono metriche da sorgenti come sistemi operativi, database, applicazioni e dispositivi di rete.
@@ -1042,14 +1046,13 @@ Alcuni componenti principali di Telegraf includono:
La configurazione di Telegraf è definita da un file di configurazione \textit{TOML} che definisce i plugin di input, processore e output da utilizzare, insieme a eventuali parametri aggiuntivi necessari per la raccolta e l'elaborazione delle metriche. La configurazione di Telegraf è definita da un file di configurazione \textit{TOML} che definisce i plugin di input, processore e output da utilizzare, insieme a eventuali parametri aggiuntivi necessari per la raccolta e l'elaborazione delle metriche.
Viene spesso utilizzato affianco ad un database di tipo \textit{time-series} come InfluxDB per l'archiviazione e la visualizzazione delle metriche raccolte, ma può essere integrato con una vasta gamma di sistemi di monitoraggio e analisi dei dati.\\ Viene spesso utilizzato affianco a un database di tipo \textit{time-series} come InfluxDB per l'archiviazione e la visualizzazione delle metriche raccolte, ma può essere integrato con una vasta gamma di sistemi di monitoraggio e analisi dei dati.
Una metrica \textit{time-series} è una serie di dati indicizzati in sequenza rispetto al tempo. Un esempio è una sequenza di osservazioni o rilevazioni registrate allo scorrere del tempo. Vi sono due macrocategorie di \textit{time-series}: Una metrica \textit{time-series} è una serie di dati indicizzati in sequenza rispetto al tempo. Un esempio è una sequenza di osservazioni o rilevazioni registrate allo scorrere del tempo. Vi sono due macrocategorie di \textit{time-series} \cite{aiknowTimeSeries}:
\begin{itemize} \begin{itemize}
\item \textbf{univariate time series}: le osservazioni sono monodimensionali, ovvero: viene registrato un solo valore numerico allo scorrere del tempo. \item \textbf{univariate time series}: le osservazioni sono monodimensionali, ovvero: viene registrato un solo valore numerico allo scorrere del tempo.
\item \textbf{multivariate time series}: le osservazioni sono multidimensionali, ovvero, si registrano più valori numerici per un singolo istante di tempo. \item \textbf{multivariate time series}: le osservazioni sono multidimensionali, ovvero, si registrano più valori numerici per un singolo istante di tempo.
\end{itemize} \end{itemize}
Tipicamente, vengono viene rappresentate con una struttura dati che registri un timestamp, che può essere di qualche tipo specifico per date, oppure un intero, contenente uno \textit{Unix timestamp}; oltre a questo contiene dati addizionali, che nella versione più semplice possono essere un unico valore numerico, ovvero losservazione registrata allo scorrere del tempo. Tipicamente, vengono rappresentate con una struttura dati che registra un timestamp, che può essere di qualche tipo specifico per date, oppure un intero, contenente uno \textit{Unix timestamp}; oltre a questo contiene dati addizionali, che nella versione più semplice possono essere un unico valore numerico, ovvero losservazione registrata allo scorrere del tempo.
\cite{githubGitHubInfluxdatatelegraf} \cite{noauthor_telegraf_nodate} \cite{aiknowTimeSeries}
\subsection{MongoDB} \subsection{MongoDB}
@@ -1057,38 +1060,38 @@ MongoDB è un database \textit{NoSQL} open source, orientato ai documenti, svilu
Combina la capacità di scalare orizzontalmente con funzionalità come indici secondari, query per intervallo, ordinamento, aggregazioni e indici geospaziali. Combina la capacità di scalare orizzontalmente con funzionalità come indici secondari, query per intervallo, ordinamento, aggregazioni e indici geospaziali.
Un database orientato ai documenti sostituisce il concetto di `riga' con un modello più flessibile, il `documento'. Grazie alla possibilità di includere documenti incorporati e array, lapproccio orientato ai documenti permette di rappresentare relazioni gerarchiche complesse all'interno di un singolo record. Un database orientato ai documenti sostituisce il concetto di `riga' con un modello più flessibile, il `documento'. Grazie alla possibilità di includere documenti incorporati e array, lapproccio orientato ai documenti permette di rappresentare relazioni gerarchiche complesse all'interno di un singolo record.
Non ci sono schemi predefiniti: le chiavi e i valori di un documento non hanno tipi o dimensioni fisse. L'assenza di uno schema rigido rende più semplice aggiungere o rimuovere campi secondo necessità. In generale, questo accelera lo sviluppo, permettendo agli sviluppatori di iterare rapidamente e sperimentare con facilità rendendo possibile testare diversi modelli di dati e scegliere quello più adatto alle proprie esigenze. Non ci sono schemi predefiniti: le chiavi e i valori di un documento non hanno tipi o dimensioni fisse. L'assenza di uno schema rigido rende più semplice aggiungere o rimuovere campi secondo necessità. In generale, questo accelera lo sviluppo di nuovi database, permettendo agli sviluppatori di iterare rapidamente e sperimentare con facilità, rendendo possibile testare diversi modelli di dati e scegliere quello più adatto alle proprie esigenze.
MongoDB è progettato per essere un database generi co, quindi, oltre alle operazioni di inserimento, lettura, aggiornamento e eliminazione dei dati (\textit{CRUD}), offre alcune funzionalità uniche in più, tra cui: MongoDB è progettato per essere un database generico, quindi, oltre alle operazioni di inserimento, lettura, aggiornamento ed eliminazione dei dati (\textit{CRUD}), offre alcune funzionalità uniche in più, tra cui \cite{10.5555/2544030}:
\begin{itemize} \begin{itemize}
\item \textbf{Indicizzazioni}: Indici di diversi tipi, tra cui indici singoli, composti, geospaziali e testuali. Gli indici possono essere creati per qualsiasi campo all'interno di un documento, consentendo di ottimizzare le query per le prestazioni. \item \textbf{Indicizzazioni}: Indici di diversi tipi, tra cui indici singoli, composti, geospaziali e testuali. Gli indici possono essere creati per qualsiasi campo all'interno di un documento, consentendo di ottimizzare le query per le prestazioni.
\item \textbf{Aggregazioni}: Un'ampia gamma di operazioni di aggregazione, come \textit{group}, \textit{match}, \textit{project} e \textit{sort}, che consentono di eseguire query complesse e analisi dei dati direttamente nel database. \item \textbf{Aggregazioni}: Un'ampia gamma di operazioni di aggregazione, come \textit{group}, \textit{match}, \textit{project} e \textit{sort}, che consentono di eseguire query complesse e analisi dei dati direttamente nel database.
\item \textbf{Collezioni speciali}: Collezioni speciali come le collezioni\textit{time-series} e le collezioni \textit{time-to-live}, che semplificano la gestione di dati temporali e di dati che devono essere eliminati dopo un certo periodo di tempo come ad esempio le sessioni utente. \item \textbf{Collezioni speciali}: Collezioni speciali come le collezioni\textit{time-series} e le collezioni \textit{time-to-live}, che semplificano la gestione di dati temporali e di dati che devono essere eliminati dopo un certo periodo di tempo come ad esempio le sessioni utente.
\end{itemize} \end{itemize}
MongoDB memorizza i record di dati come documenti (nello specifico documenti \textit{BSON}, ovvero una rappresentazione binaria di documenti in formato \textit{JSON}), che sono raggruppati in collezioni. Un database contiene una o più collezioni di documenti. MongoDB memorizza i record di dati come documenti (nello specifico documenti \textit{BSON}, ovvero una rappresentazione binaria di documenti in formato \textit{JSON}), che sono raggruppati in collezioni. Un database contiene una o più collezioni di documenti \cite{mongodbDocumentsMongoDB}.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=300pt]{images/crud-annotated-document.png} \includegraphics[width=300pt]{images/crud-annotated-document.png}
\caption{Documento JSON.} \caption{Documento JSON \cite{mongodbDocumentsMongoDB}.}
\end{figure} \end{figure}
\textit{JSON}, o JavaScript Object Notation, è un formato di scambio dati testuale, basato su una sintassi di oggetti JavaScript. È comunemente utilizzato per trasmettere dati strutturati su una rete, come ad esempio tra un server e un client web. Un \textit{documento JSON}, invece, è una collezione di campi e valori organizzata in un formato strutturato. \textit{JSON}, o JavaScript Object Notation, è un formato di scambio dati testuale, basato su una sintassi di oggetti JavaScript. È comunemente utilizzato per trasmettere dati strutturati su una rete, come ad esempio tra un server e un client web. Un \textit{documento JSON}, invece, è una collezione di campi e valori organizzata in un formato strutturato.
MongoDB Query Language, o \textit{MQL}, è il linguaggio di query utilizzato per interagire con un database MongoDB. MQL è simile a SQL, ma è progettato per lavorare con documenti JSON e collezioni di documenti, piuttosto che con tabelle e righe. Consente agli utenti di recuperare documenti che corrispondono a criteri specifici, eseguire aggregazioni, apportare aggiornamenti ai documenti ed effettuare cancellazioni di documenti. La sintassi di MQL è progettata per essere semplice e intuitiva. Permette agli utenti di specificare condizioni utilizzando operatori come \$eq (uguale), \$ne (diverso), \$gt (maggiore di), \$lt (minore di) e molti altri. È possibile anche utilizzare operatori `bitwise' come \$and, \$or e \$not per creare query complesse. MongoDB Query Language, o \textit{MQL}, è il linguaggio di query utilizzato per interagire con un database MongoDB. MQL è simile a SQL, ma è progettato per lavorare con documenti JSON e collezioni di documenti, piuttosto che con tabelle e righe. Consente agli utenti di recuperare documenti che corrispondono a criteri specifici, eseguire aggregazioni, apportare aggiornamenti ai documenti ed effettuare cancellazioni di documenti. La sintassi di MQL è progettata per essere semplice e intuitiva. Permette agli utenti di specificare condizioni utilizzando operatori come \$eq (uguale), \$ne (diverso), \$gt (maggiore di), \$lt (minore di) e molti altri. È possibile anche utilizzare operatori `bitwise' come \$and, \$or e \$not per creare query complesse \cite{knowiBestIntroduction}.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=280pt]{images/mongodb-pipelines.png} \includegraphics[width=280pt]{images/mongodb-pipelines.png}
\caption{MongoDB Aggregation Pipeline.} \caption{MongoDB Aggregation Pipeline \cite{geeksforgeeksAggregationMongoDB}.}
\end{figure} \end{figure}
Infine, il MongoDB Query Language Aggregation Framework, è un set di processi che trasforma i dati in strutture che possono essere utilizzate per l'analisi. L'aggregazione si basa su un concetto di \textit{pipeline}, in cui i documenti vengono passati attraverso una serie di fasi di trasformazione. Ogni fase della pipeline esegue un'operazione specifica sui documenti, come filtering, proiezione, ordinamento, raggruppamento e altro ancora. Le fasi della pipeline, possono essere quindi concatenate per creare query più complesse.\cite{10.5555/2544030} \cite{mongodbDocumentsMongoDB} \cite{knowiBestIntroduction} Infine, il MongoDB Query Language Aggregation Framework è un set di processi che trasforma i dati in strutture che possono essere utilizzate per l'analisi. L'aggregazione si basa su un concetto di \textit{pipeline}, in cui i documenti vengono passati attraverso una serie di fasi di trasformazione. Ogni fase della pipeline esegue un'operazione specifica sui documenti, come filtering, proiezione, ordinamento, raggruppamento e altro ancora. Le fasi della pipeline, possono essere quindi concatenate per creare query più complesse \cite{10.5555/2544030}.
\subsection{Python} \subsection{Python}
Python è un linguaggio di programmazione ad alto livello, interpretato, orientato agli oggetti e con semantica dinamica. È progettato per essere facile da leggere e scrivere, con una sintassi pulita e chiara che favorisce la leggibilità del codice. Python è noto per la sua facilità d'uso e la sua versatilità, che lo rendono adatto a una vasta gamma di applicazioni, dallo sviluppo web alla data science, all'automazione dei processi. Python è un linguaggio di programmazione ad alto livello, interpretato, orientato agli oggetti e con semantica dinamica. È progettato per essere facile da leggere e scrivere, con una sintassi pulita e chiara che favorisce la leggibilità del codice. È noto per la sua facilità d'uso e la sua versatilità, che lo rendono adatto a una vasta gamma di applicazioni, dallo sviluppo web alla data science, all'automazione dei processi.
Essendo un linguaggio interpretato, Python non richiede una fase di compilazione, ma viene eseguito direttamente da un \textit{interpreter}. Questo lo rende particolarmente adatto per lo sviluppo rapido di applicazioni e per l'iterazione veloce durante lo sviluppo. Python è anche noto per la sua vasta libreria standard, che fornisce un'ampia gamma di moduli e pacchetti pronti all'uso per svolgere una varietà di compiti comuni e per questo viene utilizzato spesso per fare `data science'.\cite{10.5555/1593511} Essendo un linguaggio interpretato, Python non richiede una fase di compilazione, ma viene eseguito direttamente da un \textit{interpreter}. Questo lo rende particolarmente adatto per lo sviluppo rapido di applicazioni e per l'iterazione veloce durante lo sviluppo. Python è anche noto per la sua vasta libreria standard, che fornisce un'ampia gamma di moduli e pacchetti pronti all'uso per svolgere una varietà di compiti comuni e per questo viene utilizzato spesso per fare `data science'.\cite{10.5555/1593511}
@@ -1140,10 +1143,10 @@ Supporta diversi browser popolari, tra cui Google Chrome, Mozilla Firefox, Micro
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=350pt]{images/which-browser-supports-selenium-1.png} \includegraphics[width=350pt]{images/which-browser-supports-selenium-1.png}
\caption{Browser supportati da Selenium.} \caption{Browser supportati da Selenium \cite{scalerWhichBrowser}.}
\end{figure} \end{figure}
Utilizzando i WebDriver, sviluppatori e tester possono scrivere script di automazione nel loro linguaggio di programmazione preferito ed eseguirli su diversi browser. Selenium WebDriver offre un'API unificata che astrae le differenze tra i vari browser, consentendo un'automazione fluida e risultati di test coerenti. Utilizzando i WebDriver, sviluppatori e tester possono scrivere script di automazione nel loro linguaggio di programmazione preferito ed eseguirli su diversi browser. Selenium WebDriver offre un'API unificata che astrae le differenze tra i vari browser, consentendo un'automazione fluida e risultati di test coerenti \cite{scalerWhichBrowser}.
Una volta costruiti i casi di test, i dati devono essere comunicati al driver del browser in qualche modo. In Selenium, questo avviene utilizzando il `JSON Wire Protocol' con HTTP come gestore della comunicazione. Una volta costruiti i casi di test, i dati devono essere comunicati al driver del browser in qualche modo. In Selenium, questo avviene utilizzando il `JSON Wire Protocol' con HTTP come gestore della comunicazione.
@@ -1152,10 +1155,10 @@ Poiché la comunicazione avviene in un'infrastruttura client-server, nel mondo d
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=300pt]{images/JSON-Wire-Protocol-over-HTTP-Client.png} \includegraphics[width=300pt]{images/JSON-Wire-Protocol-over-HTTP-Client.png}
\caption{JSON Wire Protocol.} \caption{JSON Wire Protocol \cite{TestGrid_2024}.}
\end{figure} \end{figure}
Il funzionamento dei WebDriver può essere riassunto in alcuni passaggi chiave: Il funzionamento dei WebDriver può essere riassunto in alcuni passaggi chiave \cite{TestGrid_2024}:
\begin{itemize} \begin{itemize}
\item Un tester scrive uno script di test automatizzato destinato a un driver di browser specifico. \item Un tester scrive uno script di test automatizzato destinato a un driver di browser specifico.
@@ -1168,41 +1171,41 @@ Il funzionamento dei WebDriver può essere riassunto in alcuni passaggi chiave:
\item Dopo l'esecuzione di tutte le azioni, il browser si chiude e il driver comunica i risultati al client. \item Dopo l'esecuzione di tutte le azioni, il browser si chiude e il driver comunica i risultati al client.
\end{itemize} \end{itemize}
Affinché il driver possa comunicare correttamente con il browser, è fondamentale che il browser stesso sia installato sul sistema, e che il sistema e il suo ambiente sia configurato correttamente, con tutti i prerequisiti necessari per l'esecuzione dei test. Affinché il driver possa comunicare correttamente con il browser, è fondamentale che il browser stesso sia installato sul sistema e che il sistema e il suo ambiente sia configurato correttamente, con tutti i prerequisiti necessari per l'esecuzione dei test.
Un altro componente messo a disposizione da Selenium è, \textit{Selenium Grid}, che permette di eseguire test su più macchine e browser remoti contemporaneamente, riducendo i tempi di esecuzione e migliorando l'efficienza dei test, instradando i comandi inviati dal client alle istanze remote dei browser ed è composto da 2 componenti principali: Un altro componente messo a disposizione da Selenium è \textit{Selenium Grid}, che permette di eseguire test su più macchine e browser remoti contemporaneamente, riducendo i tempi di esecuzione e migliorando l'efficienza dei test, instradando i comandi inviati dal client alle istanze remote dei browser. È composto da 2 componenti principali \cite{seleniumSeleniumBrowser}:
\begin{itemize} \begin{itemize}
\item \textbf{Hub}: Il server principale che funge da punto di ingresso per i test. Riceve i comandi dai client e li instrada alle istanze dei browser remote. \item \textbf{Hub}: Il server principale che funge da punto di ingresso per i test. Riceve i comandi dai client e li instrada alle istanze dei browser remote.
\item \textbf{Node}: Le macchine remote che eseguono i test. Si connettono al \textit{Hub} e ricevono i comandi per eseguire i test sui browser installati. \item \textbf{Node}: Le macchine remote che eseguono i test. Si connettono all'\textit{Hub} e ricevono i comandi per eseguire i test sui browser installati.
\end{itemize} \end{itemize}
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=300pt]{images/selenium-grid.jpg} \includegraphics[width=300pt]{images/selenium-grid.jpg}
\caption{Architettura Selenium Grid.} \caption{Architettura Selenium Grid \cite{qabrainsSeleniumGrid}.}
\end{figure} \end{figure}
Per fare tutto questo, Selenium mette a disposizione varie immagini Docker preconfigurate con tutto il necessario per eseguire i test, come il browser, il driver, l'hub, e le dipendenze necessarie, con anche diverse versioni legacy per testare la compatibilità con versioni obsolete. Per fare tutto questo, Selenium mette a disposizione varie immagini Docker preconfigurate con tutto il necessario per eseguire i test, come il browser, il driver, l'hub, e le dipendenze necessarie, con anche diverse versioni legacy per testare la compatibilità con versioni obsolete.
In particolare, a noi interessa l'immagine \textit{selenium/standalone-chrome}, che contiene tutto il necessario per eseguire test su Chromium, incluso il browser stesso, il driver e il server Selenium, ed è stata usata come base per \textbf{creare una immagine Docker monolitica} per i nostri test, che include tutte le ulteriori dipendenze necessarie come: In particolare, a noi interessa l'immagine \textit{selenium/standalone-chrome}, che contiene tutto il necessario per eseguire test su Chromium, incluso il browser stesso, il driver e il server Selenium, ed è stata usata come base per \textbf{creare una immagine Docker monolitica} per i nostri test, con tutte le ulteriori dipendenze necessarie come:
\begin{itemize} \begin{itemize}
\item \textbf{Python}: Per l'automazione. \item \textbf{Python}: Per l'automazione.
\item \textbf{Telegraf}: Per la raccolta ed invidio di tutte le metriche. \item \textbf{Telegraf}: Per la raccolta ed invidio di tutte le metriche.
\item \textbf{WebRTC Internals Exporter}: Per la raccolta delle metriche WebRTC. \item \textbf{WebRTC Internals Exporter}: Per la raccolta delle metriche WebRTC.
\item \textbf{Webpack}: Per la sostituzione delle variabili d'ambiente nel codice JavaScript. \item \textbf{Webpack}: Per la sostituzione delle variabili d'ambiente nel codice JavaScript.
\end{itemize} \cite{TestGrid_2024} \cite{scalerWhichBrowser} \cite{seleniumSeleniumBrowser} \end{itemize}
\subsection{WebRTC Internals Exporter} \subsection{WebRTC Internals Exporter}
WebRTC Internals Exporter è un'estensione per Chromium che consente di esportare le metriche WebRTC da un browser in un formato leggibile e analizzabile. Creato da un ricercatore Italiano, è stato progettato per semplificare il processo di raccolta e analisi delle metriche WebRTC, che altrimenti sarebbero difficili da ottenere in quanto Chromium mette a disposizione uno strumento chiamato WebRTC-internals, che consente di visualizzare le statistiche WebRTC in tempo reale, ma non offre un modo semplice per esportarle dato che di base offre solo la creazione di file `dumps' non automatizzabile. WebRTC Internals Exporter è un'estensione per Chromium che consente di esportare le metriche WebRTC da un browser in un formato leggibile e analizzabile. Creato da un ricercatore Italiano, è stato progettato per semplificare il processo di raccolta e analisi delle metriche WebRTC, che altrimenti sarebbero difficili da ottenere in quanto Chromium mette a disposizione uno strumento chiamato WebRTC-internals, che consente di visualizzare le statistiche WebRTC in tempo reale, ma non offre un modo semplice per esportarle, dato che di base offre solo la creazione di file `dumps' non automatizzabile.
L'uso di webrtc-internals con il processo di creazione/caricamento dei dump presenta alcune grosse limitazioni: L'uso di webrtc-internals con il processo di creazione/caricamento dei dump presenta alcune grosse limitazioni:
\begin{itemize} \begin{itemize}
\item È necessario aprire la pagina \textit{chrome://webrtc-internals} prima di avviare una sessione. Se la sessione è già in corso e si verificano problemi, non è possibile raccogliere metriche retroattivamente. \item È necessario aprire la pagina \textit{chrome://webrtc-internals} prima di avviare una sessione. Se la sessione è già in corso e si verificano problemi, non è possibile raccogliere metriche retroattivamente.
\item La visualizzazione delle metriche è limitata nel tempo e non è possibile personalizzarle, filtrarle o creare query aggiuntive sui dati raccolti. \item La visualizzazione delle metriche è limitata nel tempo e non è possibile personalizzarle, filtrarle o creare query aggiuntive sui dati raccolti.
\item L'uso di file dump può rendere difficile l'archiviazione e l'organizzazione dei dati dei test, oltre alla condivisione dei risultati. Inoltre, il caricamento di file dump di grandi dimensioni in altri strumenti di analisi, potrebbe richiedere molto tempo e memoria. \item L'uso di file dump può rendere difficile l'archiviazione e l'organizzazione dei dati dei test, oltre alla condivisione dei risultati. Inoltre, il caricamento di file dump di grandi dimensioni in altri strumenti di analisi p richiedere molto tempo e memoria.
\end{itemize} \end{itemize}
\begin{figure}[H] \begin{figure}[H]
@@ -1212,7 +1215,7 @@ L'uso di webrtc-internals con il processo di creazione/caricamento dei dump pres
\end{figure} \end{figure}
WebRTC Internals Exporter risolve questi problemi abilitando l'esportazione delle metriche verso un servizio chiamato \textit{Prometheus PushGateway}. WebRTC Internals Exporter risolve questi problemi abilitando l'esportazione delle metriche verso un servizio chiamato \textit{Prometheus PushGateway}.
Prometheus PushGateway è un servizio progettato per permettere a lavori effimeri e batch di esporre le proprie metriche a Prometheus. Poiché questi processi potrebbero non esistere abbastanza a lungo da essere interrogati direttamente, possono invece inviare le loro metriche al PushGateway, garantendo così la raccolta dei dati. Prometheus PushGateway è un servizio progettato per permettere a lavori effimeri e batch di esporre le proprie metriche a Prometheus. Poiché questi processi potrebbero non esistere abbastanza a lungo da essere interrogati direttamente, possono inviare le loro metriche al PushGateway, garantendo così la raccolta dei dati.
Tecnicamente l'estensione funziona in questo modo: viene pre-caricato un codice JavaScript che sovrascrive la classe globale \textit{RTCPeerConnection}. Tecnicamente l'estensione funziona in questo modo: viene pre-caricato un codice JavaScript che sovrascrive la classe globale \textit{RTCPeerConnection}.
@@ -1224,7 +1227,7 @@ Il metodo \textit{getStats} è un metodo standardizzato definito nell'API WebRTC
\ \
Questo progetto fa uso di una \footnote{Disponibile qui: \url{https://gitlab.di.unimi.it/mirko.milovanovic/peertube-collector/-/tree/main/webrtc-internals-exporter}} \textbf{versione altamente modificata} di WebRTC Internals Exporter, per adattarsi alle nostre esigenze di test e automazione. In particolare, abbiamo modificato le funzionalità: Questo progetto fa uso di una \textbf{versione altamente modificata}\footnote{Disponibile qui: \url{https://gitlab.di.unimi.it/mirko.milovanovic/peertube-collector/-/tree/main/webrtc-internals-exporter}} di WebRTC Internals Exporter, per adattarsi alle nostre esigenze di test e automazione. In particolare, abbiamo modificato le funzionalità:
\begin{itemize} \begin{itemize}
\item Abilitare l'esportazione delle metriche WebRTC verso un \textit{endpoint HTTP RESTful} al posto di Prometheus PushGateway, con una formattazione dei dati personalizzata, ma sempre basata su JSON. \item Abilitare l'esportazione delle metriche WebRTC verso un \textit{endpoint HTTP RESTful} al posto di Prometheus PushGateway, con una formattazione dei dati personalizzata, ma sempre basata su JSON.
@@ -1339,7 +1342,7 @@ Quando Webpack elabora un'applicazione, costruisce internamente un grafo delle d
Di default, Webpack `comprende' solo file JavaScript e JSON. Di default, Webpack `comprende' solo file JavaScript e JSON.
Per gestire altri tipi di file, utilizza i \textit{Loaders}, che permettono di elaborare e convertire vari formati (come CSS, immagini o TypeScript) in altro moduli validi. Questi moduli possono essere quindi usati dall'applicazione ed aggiunti al grafo delle dipendenze. Per gestire altri tipi di file, utilizza i \textit{Loaders}, che permettono di elaborare e convertire vari formati (come CSS, immagini o TypeScript) in altro moduli validi. Questi moduli possono essere quindi usati dall'applicazione e aggiunti al grafo delle dipendenze.
Altro componente essenziale sono i \textit{Plugin}. Mentre i \textit{Loaders} trasformano i file in moduli validi, i \textit{Plugin} servono per eseguire operazioni più avanzate, come ottimizzazione, gestione degli asset, variabili dambiente e molto altro.\cite{webpackConceptsWebpack} Altro componente essenziale sono i \textit{Plugin}. Mentre i \textit{Loaders} trasformano i file in moduli validi, i \textit{Plugin} servono per eseguire operazioni più avanzate, come ottimizzazione, gestione degli asset, variabili dambiente e molto altro.\cite{webpackConceptsWebpack}
@@ -1347,18 +1350,18 @@ Altro componente essenziale sono i \textit{Plugin}. Mentre i \textit{Loaders} tr
Hetzner Cloud è un servizio di cloud computing offerto da Hetzner Online GmbH, un provider di servizi di hosting e data center con sede in Germania. Hetzner Cloud offre una vasta gamma di servizi di cloud computing, tra cui server virtuali, storage, reti e servizi di sicurezza. Hetzner Cloud è un servizio di cloud computing offerto da Hetzner Online GmbH, un provider di servizi di hosting e data center con sede in Germania. Hetzner Cloud offre una vasta gamma di servizi di cloud computing, tra cui server virtuali, storage, reti e servizi di sicurezza.
Sulla base di quello che è stato fatto da PeerTube, abbiamo deciso di utilizzare Hetzner Cloud per distribuire i nostri test su macchine virtuali in diverse regioni geografiche, in quanto, gli script per l'automazione dei test sono l'unica parte fornitaci da PeerTube nell'articolo originale. Anche qua abbiamo utilizzato delle versioni altamente modificate per adattarle alle nostre esigenze. Sulla base di quello che è stato fatto da PeerTube, abbiamo deciso di utilizzare Hetzner Cloud per distribuire i nostri test su macchine virtuali in diverse regioni geografiche, in quanto, gli script per l'automazione dei test sono l'unica parte fornitaci da PeerTube nell'articolo originale. Anche qui abbiamo utilizzato delle versioni altamente modificate per adattarle alle nostre esigenze.
Gli script fanno utilizzo della \footnote{CLI: sinonimo di Command-line interface} \textit{CLI}, di Hetzner Cloud, che consente di gestire le risorse cloud direttamente dalla riga di comando, e sono formati da 2 parti principali: uno script per la creazione delle macchine virtuali e uno script per l'avvio dei test. Gli script fanno utilizzo della \textit{CLI}\footnote{CLI: sinonimo di Command-line interface}, di Hetzner Cloud, che consente di gestire le risorse cloud direttamente dalla riga di comando, e sono formati da 2 parti principali: uno script per la creazione delle macchine virtuali e uno script per l'avvio dei test \cite{githubGitHubHetznercloudcli} \cite{framagitFramasoftPeerTube}.
Rispetto a quelli originali, li abbiamo modificati per far utilizzo delle variabili d'ambiente per la configurazione del nostro sistema di test, e per sostituire Selenium Grid, con l'immagine Docker monolitica standalone che abbiamo creato.\cite{githubGitHubHetznercloudcli} \cite{framagitFramasoftPeerTube} Rispetto a quelli originali, li abbiamo modificati per far utilizzo delle variabili d'ambiente per la configurazione del nostro sistema di test e per sostituire Selenium Grid, con l'immagine Docker monolitica standalone che abbiamo creato.
\vfill \break \vfill \break
\section{Architettura del sistema di test} \section{Architettura del sistema di test}
Finora abbiamo descritto le tecnologie utilizzate alla base per creare il nostro sistema di test, senza però piegare effettivamente come queste vengono integrate e utilizzate insieme per creare un sistema di test automatizzato. Finora abbiamo descritto le tecnologie utilizzate alla base per creare il nostro sistema di test, senza però spiegare effettivamente come queste vengono integrate e utilizzate insieme per creare un sistema di test automatizzato.
Introduciamo quindi l'ultimo pezzo necessario per far funzionare il tutto, ovvero il \textbf{\textit{collector}}, un'applicazione Python che si occupa di fare \footnote{Il data scraping è una tecnica in cui un programma informatico estrae dati da un output leggibile dall'uomo generato da un altro programma.} scraping delle metriche di PeerTube, di raccogliere le metriche WebRTC tramite l'estensione Chromium, e di inviare il tutto a Telegraf per l'elaborazione e l'invio al database. Introduciamo quindi l'ultimo pezzo necessario per far funzionare il tutto, ovvero il \textbf{\textit{collector}}, un'applicazione Python che si occupa di fare scraping\footnote{Il data scraping è una tecnica in cui un programma informatico estrae dati da un output leggibile dall'uomo generato da un altro programma.} delle metriche di PeerTube, di raccogliere le metriche WebRTC tramite l'estensione Chromium e di inviare il tutto a Telegraf per l'elaborazione e l'invio al database.
\vfill \vfill
@@ -1380,7 +1383,7 @@ Nello specifico il \textit{collector} è composto da 3 parti principali:
\item WebRTC Internals Exporter \item WebRTC Internals Exporter
\end{itemize} \end{itemize}
Selenium e WebRTC Internals Exporter li abbiamo già descritti in precedenza, mentre il Python script è il cuore del sistema, che si occupa di coordinare le altre componenti, di avviare e fermare i test, di raccogliere i dati, aggregarli e di inviarli a Telegraf per l'invio al database. Lo script Python è il cuore del sistema, che si occupa di coordinare le altre componenti, di avviare e fermare i test, di raccogliere i dati, aggregarli e di inviarli a Telegraf per l'invio al database.
L'intero progetto è disponibile qui: L'intero progetto è disponibile qui:
\begin{itemize} \begin{itemize}
@@ -1389,22 +1392,22 @@ L'intero progetto è disponibile qui:
\subsection{Difficoltà incontrate e soluzioni} \subsection{Difficoltà incontrate e soluzioni}
Durante la creazione del sistema, abbiamo incontrato diverse difficoltà, per lo più sistemistiche, che hanno richiesto soluzioni creative per superarle. Alcune delle principali sfide sono state: Durante la creazione del sistema, abbiamo incontrato alcune difficoltà, per lo più sistemistiche, che hanno richiesto soluzioni creative per superarle. Alcune delle principali sfide sono state:
\begin{itemize} \begin{itemize}
\item \textbf{Accesso agli indirizzi IP forniti da WebRTC}: WebRTC dalle ultime versioni come misura di sicurezza e privacy, non permette più l'accesso e la visualizzazione degli indirizzi IP locali delle macchine coinvolte nella connessione grazie a tecniche di offuscazione, rendendo difficile la raccolta di queste informazioni. Per ovviare a questo problema ci siamo avvalsi di 2 soluzioni: la prima consiste nell'utilizzare una versione vecchia di Chromium, nello specifico una versione anteriore o uguale alla 129.0, in quanto in queste versioni l'offuscazione è presente ma è possibile disabilitarla tramite un flag da interfaccia grafica; la seconda soluzione invece consiste proprio nel disabilitare questa funzionalità ma da riga di comando tramite un altro flag, all'avvio del browser. \item \textbf{Accesso agli indirizzi IP forniti da WebRTC}: Dalle ultime versioni, come misura di sicurezza e privacy, non permette più l'accesso e la visualizzazione degli indirizzi IP locali delle macchine coinvolte nella connessione grazie a tecniche di offuscazione, rendendo difficile la raccolta di queste informazioni. Per ovviare a questo problema ci siamo avvalsi di 2 soluzioni: la prima consiste nell'utilizzare una versione vecchia di Chromium, nello specifico una versione anteriore o uguale alla 129.0, in quanto in queste versioni l'offuscazione è presente ma è possibile disabilitarla tramite un flag da interfaccia grafica; la seconda soluzione invece consiste proprio nel disabilitare questa funzionalità ma da riga di comando tramite un altro flag, all'avvio del browser.
\item \textbf{Limitazioni delle API di PeerTube}: PeerTube fornisce delle API per la gestione della piattaforma, moderazione dei video, e altro ancora, ma non fornisce API per la raccolta delle metriche dei video. Alcune metriche generiche sono esposte via OpenTelemetry ma non sono specifiche per un singolo utente o video. Per ovviare a questo problema, abbiamo utilizzato il data scraping per estrarre le metriche direttamente dalla pagina web. \item \textbf{Limitazioni delle API di PeerTube}: PeerTube fornisce delle API per la gestione della piattaforma, moderazione dei video, e altro ancora, ma non fornisce API per la raccolta delle metriche dei video. Alcune metriche generiche sono esposte via OpenTelemetry ma non sono specifiche per un singolo utente o video. Per ovviare a questo problema, abbiamo utilizzato il data scraping per estrarre le metriche direttamente dalla pagina web.
\item \textbf{Gestione delle variabili d'ambiente nell'estensione Chrome}: WebRTC Internals Exporter è un'estensione per Chromium che consente di esportare le metriche WebRTC da un browser in un formato leggibile e analizzabile. Tuttavia, l'estensione non supporta la sostituzione delle variabili d'ambiente nel codice JavaScript, in quanto viene caricata ed eseguita runtime in un ambiente isolato, rendendo difficile la configurazione dinamica dell'estensione. L'utilizzo di WebPack ci consente di configurare l'estensione in fase di compilazione, sostituendo le variabili d'ambiente con i valori corretti prima di caricarla nel browser. \item \textbf{Gestione delle variabili d'ambiente nell'estensione Chrome}: WebRTC Internals Exporter è un'estensione per Chromium che consente di esportare le metriche WebRTC da un browser in un formato leggibile e analizzabile. Tuttavia, l'estensione non supporta la sostituzione delle variabili d'ambiente nel codice JavaScript, in quanto viene caricata ed eseguita runtime in un ambiente isolato, rendendo difficile la configurazione dinamica dell'estensione. L'utilizzo di WebPack ci consente di configurare l'estensione in fase di compilazione, sostituendo le variabili d'ambiente con i valori corretti prima di caricarla nel browser.
\item \textbf{Raccolta dei dati dei test su macchine virtuali distribuite}: Data la distribuzione geografica delle nostre macchine virtuali di test, abbiamo dovuto affrontare la sfida di raccogliere ed aggregare i dati in modo efficiente e coordinato. Questa sfida l'abbiamo risolta utilizzando Telegraf come agente di raccolta dati su ogni VM, configurandolo per inviare le metriche ad un'istanza centrale di MongoDB. MongoDB è stato scelto per il suo supporto nativo a documenti JSON e per la capacità di gestire grandi volumi di dati time-series provenienti da fonti eterogenee.Le API di Hetzner Cloud ci hanno permesso di automatizzare il deployment e la configurazione di tutte queste componenti su macchine distribuite in diverse regioni geografiche. \item \textbf{Raccolta dei dati dei test su macchine virtuali distribuite}: Data la distribuzione geografica delle nostre macchine virtuali di test, abbiamo dovuto affrontare la sfida di raccogliere e aggregare i dati in modo efficiente e coordinato. Questa sfida l'abbiamo risolta utilizzando Telegraf come agente di raccolta dati su ogni VM, configurandolo per inviare le metriche a un'istanza centrale di MongoDB. MongoDB è stato scelto per il suo supporto nativo a documenti JSON e per la capacità di gestire grandi volumi di dati time-series provenienti da fonti eterogenee.Le API di Hetzner Cloud ci hanno permesso di automatizzare il deployment e la configurazione di tutte queste componenti su macchine distribuite in diverse regioni geografiche.
\end{itemize} \end{itemize}
\subsection{Python script} \subsection{Python script}
Il funzionamento dello script è relativamente semplice; vengono eseguiti dei passaggi in successione per arrivare in una situazione in cui i dati sono costantemente raccolti e inviati al database creando quindi un ciclo infinito che si ripete ogni 2 secondi circa, fin quando il test non viene fermato. Il funzionamento dello script è relativamente semplice; vengono eseguiti dei passaggi in successione per arrivare in una situazione in cui i dati sono costantemente raccolti e inviati al database, creando quindi un ciclo infinito che si ripete ogni 2 secondi circa, fin quando il test non viene fermato.
\ \
Importante particolarità dello script è la possibilità di creare e caricare plugin personalizzati che permettono di estrarre metriche di vario tipo da potenzialmente qualsiasi pagina web e non solo da PeerTube. Questo potenzialmente permette di estendere il sistema di test a qualsiasi altra piattaforma di video streaming, o di qualsiasi altro tipo, semplicemente creando un plugin personalizzato. Importante particolarità dello script è la possibilità di creare e caricare plugin personalizzati che permettono di estrarre metriche di vario tipo da potenzialmente qualsiasi pagina web e non solo da PeerTube. Ciò potenzialmente permette di estendere il sistema di test a qualsiasi altra piattaforma di video streaming, o di qualsiasi altro tipo, semplicemente creando un plugin personalizzato.
Questa funzionalità è stata implementata utilizzando le \textit{Abstract Base Classes} di Python, che permettono di definire delle classi base che devono essere implementate dalle classi derivate, e che permettono di definire delle interfacce comuni. Questa funzionalità è stata implementata utilizzando le \textit{Abstract Base Classes} di Python, che permettono di definire delle classi base che devono essere implementate dalle classi derivate, e che permettono di definire delle interfacce comuni.
\break \break
@@ -1447,7 +1450,9 @@ class StatsDownloadPlugin(abc.ABC):
Per tutto questo, alla creazione, abbiamo fatto uso di alcune librerie Python tra cui: \textit{selenium} e \textit{beautifulsoup4}. Per tutto questo, alla creazione, abbiamo fatto uso di alcune librerie Python tra cui: \textit{selenium} e \textit{beautifulsoup4}.
\\ \textit{BeautifulSoup} è una libreria Python che permette di estrarre dati da file HTML e XML. È in grado di navigare nella struttura del documento, estrarre i dati, modificarli e salvare le modifiche. È spesso utilizzata per fare \textit{web scraping}. Assieme, quste due librerie, ci permettono di interagire con il browser e di estrarre i dati necessari dalla pagina web di PeerTube.\cite{10617017} \\
\textit{BeautifulSoup} è una libreria Python che permette di estrarre dati da file HTML e XML. È in grado di navigare nella struttura del documento, estrarre i dati, modificarli e salvare le modifiche. È spesso utilizzata per fare \textit{web scraping}. Assieme, quste due librerie ci permettono di interagire con il browser e di estrarre i dati necessari dalla pagina web di PeerTube \cite{10617017}.
I passaggi presenti in figura \ref{fig:architettura-collector} possono essere riassunti come: I passaggi presenti in figura \ref{fig:architettura-collector} possono essere riassunti come:
@@ -1456,14 +1461,14 @@ I passaggi presenti in figura \ref{fig:architettura-collector} possono essere ri
\begin{description} \begin{description}
\item Queste possono includere: I plugin personalizzati BeautifulSoup, l'URL del video da analizzare, l'URL del server Telegraf, l'URL dell'hub di Selenium Grid, il percorso dell'estensione di WebRTC Internals Exporter, e altro ancora. \item Queste possono includere: I plugin personalizzati BeautifulSoup, l'URL del video da analizzare, l'URL del server Telegraf, l'URL dell'hub di Selenium Grid, il percorso dell'estensione di WebRTC Internals Exporter, e altro ancora.
\end{description} \end{description}
\item \textbf{Avvio del browser}: Viene avviato il browser ed aperta la pagina del video specificato tramite Selenium, con l'estensione di WebRTC Internals Exporter installata ed abilitata. Viene anche avviato in ascolto un server HTTP in background per ricevere le metriche WebRTC tramite un endpoint locale POST dedicato. \item \textbf{Avvio del browser}: Viene avviato il browser e aperta la pagina del video specificato tramite Selenium, con l'estensione di WebRTC Internals Exporter installata ed abilitata. Viene anche avviato in ascolto un server HTTP in background per ricevere le metriche WebRTC tramite un endpoint locale POST dedicato.
\item \textbf{Avvio del test}: Viene caricata la pagina del video e tramite Selenium viene controllato che il video sia in riproduzione tramite il controllo dell'esistenza del bottone play. \item \textbf{Avvio del test}: Viene caricata la pagina del video e tramite Selenium viene controllato che il video sia in riproduzione tramite il controllo dell'esistenza del bottone play.
\item \textbf{Raccolta delle metriche WebRTC}: L'estensione per WebRTC inizia a raccogliere le metriche e ogni 2 secondi circa le invia allo script principale. Viene quindi di fatto instaurato un ciclo che viene usato dallo script come sorgente di clock per la raccolta delle altre metriche. \item \textbf{Raccolta delle metriche WebRTC}: L'estensione per WebRTC inizia a raccogliere le metriche e ogni 2 secondi circa le invia allo script principale. Viene quindi di fatto instaurato un ciclo che viene usato dallo script come sorgente di clock per la raccolta delle altre metriche.
\item \textbf{Raccolta delle metriche video di PeerTube}: Utilizzando BeautifulSoup, vengono trasformate e raccolte le metriche del player video di PeerTube, come la qualità del video, il buffering, quantità di dati trasferiti, la latenza, e altro ancora. Il tutto viene convertito in un formato JSON. \item \textbf{Raccolta delle metriche video di PeerTube}: Utilizzando BeautifulSoup, vengono trasformate e raccolte le metriche del player video di PeerTube, come la qualità del video, il buffering, quantità di dati trasferiti, la latenza e altro ancora. Il tutto viene convertito in un formato JSON.
\item \textbf{Invio delle metriche a Telegraf}: Le metriche raccolte, vengono inviate a Telegraf tramite una socket di sistema, per l'elaborazione e l'invio al database finale, nel nostro caso MongoDB. C'è un passaggio fondamentale però che Telegraf esegue, ed è quello di fare \textit{string-join} dei dati JSON, ovvero di `appiattire' e trasformare i dati in una stringa, per poi inviarli al database. Questo viene fatto in quanto Telegraf, utilizzando il plugin di input per il formato JSON, converte gli array \textbf{in singole metriche separate}, e non come un unico documento, perdendo quindi la struttura originale dei dati. In se questo non è un problema, ma per la nostra analisi, è fondamentale mantenere la struttura originale dei dati per facilitarci il lavoro. Infine per ricavare i documenti interi, un ulteriore passaggio finale va effettuato nel database, in differita, per convertirli da stringhe ad oggetti JSON validi. \item \textbf{Invio delle metriche a Telegraf}: Le metriche raccolte, vengono inviate a Telegraf tramite una socket di sistema, per l'elaborazione e l'invio al database finale, nel nostro caso MongoDB. C'è un passaggio fondamentale però che Telegraf esegue, ed è quello di fare \textit{string-join} dei dati JSON, ovvero di `appiattire' e trasformare i dati in una stringa per poi inviarli al database. Questo viene fatto in quanto Telegraf, utilizzando il plugin di input per il formato JSON, converte gli array \textbf{in singole metriche separate}, e non come un unico documento, perdendo quindi la struttura originale dei dati. In sé questo non è un problema, ma per la nostra analisi è fondamentale mantenere la struttura originale dei dati per facilitarci il lavoro. Infine, per ricavare i documenti interi, un ulteriore passaggio finale va effettuato nel database, in differita, per convertirli da stringhe a oggetti JSON validi.
\end{itemize} \end{itemize}
Va inoltre evidenziata la scelta di utilizzare un solo script Python per coordinare il tutto, sia l'inizializzazione che raccolta delle metriche dalle pagine web e dalla estensione esterna, in quanto questo ha semplificato la gestione e soprattutto la creazione del sistema e permette come bonus di avere un unico punto di controllo per l'intero processo. Va inoltre evidenziata la scelta di utilizzare un solo script Python per coordinare il tutto, sia l'inizializzazione sia raccolta delle metriche dalle pagine web e dalla estensione esterna, in quanto questo ha semplificato la gestione e soprattutto la creazione del sistema e permette come bonus di avere un unico punto di controllo per l'intero processo.
\newpage \newpage
@@ -1786,7 +1791,7 @@ In un'epoca in cui la centralizzazione dei servizi di streaming solleva preoccup
Ma soprattutto la metodologia e gli strumenti sviluppati per questo studio potranno essere utilizzati per valutare future implementazioni di tecnologie di streaming decentralizzato basate su WebRTC, contribuendo all'evoluzione di Internet verso un ecosistema più equo e distribuito. Ma soprattutto la metodologia e gli strumenti sviluppati per questo studio potranno essere utilizzati per valutare future implementazioni di tecnologie di streaming decentralizzato basate su WebRTC, contribuendo all'evoluzione di Internet verso un ecosistema più equo e distribuito.
\nocite{*} %\nocite{*}
\chapter*{Bibliografia} \chapter*{Bibliografia}
\addcontentsline{toc}{chapter}{Bibliografia} \addcontentsline{toc}{chapter}{Bibliografia}