%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\documentclass[12pt,a4paper]{book} % o article, book, ...

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% packages...
\usepackage[utf8]{inputenc}
\usepackage[english, italian]{babel}
\usepackage[hyphens]{url}
%\usepackage{showframe}

% Per generare il file PDF aderente alle specifiche PDF/A-1b. Verificarne poi la validità.
\usepackage[a-1b,mathxmp]{pdfx}

\usepackage{biblatex}
\addbibresource{Biblio.bib}

\usepackage{hyperref}
\hypersetup{
    colorlinks,
    linkcolor={black!100!black},
    citecolor={blue!100!black},
    urlcolor={blue!100!black}
}

\usepackage{graphicx}

\usepackage{geometry}

\usepackage{tabularx}

\usepackage{booktabs}

\usepackage{float}

\usepackage{caption}
\captionsetup[figure]{labelsep=period}

\usepackage{lipsum} % Per inserire testo a caso in attesa di realizzare i capitoli

\usepackage{listings} % Per inserire codice formattato
%\lstset{
	%lstset va usato dopo l'inizio del document e ogni volta che si vuole cambiare/impostare il linguaggio da formattare
	% language=bash
	%frame=single,
	%breaklines=true,
	%postbreak=\raisebox{0ex}[0ex][0ex]{\ensuremath{\color{red}\hookrightarrow\space}},
	%basicstyle=\ttfamily\footnotesize
%}

\usepackage{csquotes}

\usepackage{epigraph} % per le frasi inizio capitolo

\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhead[LEO]{\slshape \leftmark} %section
\fancyhead[REO]{\thepage}
\setlength{\headheight}{14.5pt}
\setlength{\marginparwidth}{2cm}

%\usepackage{etoolbox}

\usepackage[textsize=tiny]{todonotes}

\usepackage{refcheck}

\usepackage{tikz}
\usetikzlibrary{arrows}

\usepackage{titlesec}
\setcounter{secnumdepth}{3}
\setcounter{tocdepth}{3}

\newenvironment{usecaseenv}{
    \def\arraystretch{2}
    \begin{tabular}{p{3cm}p{10cm}}\hline
}{
    \hline\end{tabular}
    \def\arraystretch{1}
}

\newenvironment{characteristicsEnv}{
    \def\arraystretch{2}
    \begin{tabular}{lp{8cm}}\hline
}{
    \hline\end{tabular}
    \def\arraystretch{1}
}

\newcommand\addheading[1]{
    \multicolumn{2}{c}{\textbf{\textit{#1}}}\\ \hline
}

\newcommand\addrow[2]{
    \textbf{#1}
    &\begin{minipage}[t][][t]{10cm}
       #2
    \end{minipage}\\
}

\newcommand\addrowservice[2]{
    \textbf{#1}
    &\begin{minipage}[t][][t]{8cm}
       #2
    \end{minipage}\\
}

% The actual command definition
\let\oldFigureName\figurename %save the old definition of the caption's figure name
\newcommand{\usecase}[5]{
    \vspace*{0.5cm} % adds a bit of padding to make it look nicer
    \renewcommand{\figurename}{Use case} %call figure name "Use case" instead
    \begin{figure}[htbp]
        \begin{center}
            \begin{usecaseenv}
                \addheading{#1} 
                \addrow{Use case:}{#2}
                \addrow{Soggetti:}{#3}
                \addrow{Obiettivi:}{#4}
            \end{usecaseenv}
        \end{center}
        \caption{#5}
    \end{figure}
    \renewcommand{\figurename}{\oldFigureName} %reset caption figure name
}

\let\oldFigureName\figurename %save the old definition of the caption's figure name
\newcommand{\serviceCharacteristics}[6]{
    \vspace*{0.5cm} % adds a bit of padding to make it look nicer
    \renewcommand{\figurename}{} %call figure name "Use case" instead
    \begin{figure}[H]
        \begin{center}
            \begin{characteristicsEnv}
                \addheading{Caratteristiche}
                \addrowservice{Partecipanti:}{#1}
                \addrowservice{Architettura software:}{#2}
                \addrowservice{Architettura hardware:}{#3}
                \addrowservice{Tipo di dato condiviso:}{#4}
                \addrowservice{Licenza:}{#5}
            \end{characteristicsEnv}
        \end{center}
        %\caption{}
    \end{figure}
    \renewcommand{\figurename}{\oldFigureName} %reset caption figure name
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\newgeometry{centering}
% Frontespizio
\pagenumbering{Roman}
\begin{titlepage}
    \begin{center}
        \includegraphics[width=\textwidth]{images/Logo.jpg}\\
        {\large{\em Corso di Laurea in Informatica per la comunicazione digitale}}
    \end{center}
    \vspace{12mm}
    \begin{center}
        {\huge{\bf Streaming decentralizzato di}}\\
        \vspace{4mm}
        {\huge{\bf contenuti audiovisivi}}\\
    \end{center}
    \vspace{12mm}
    \begin{flushleft}
        {\large{\bf Relatore:}}
        {\large{Trentini Andrea}}\\
        %{\large{\bf Correlatore:}}
        %{\large{...}}\\
    \end{flushleft}
    \vfill
    \begin{flushright}
        \parbox{1.7in}{
        {\large{\bf Tesi di Laurea di:}}\\
        {\large{Mirko Milovanovic}}\\
        {\large{\bf Matricola: \normalfont 870671}}
        }
    \end{flushright}
    \vfill
    \begin{center}
        {\large{\bf Anno Accademico 2021-2022}}
    \end{center}
\end{titlepage}

\tableofcontents
\thispagestyle{empty}

%\chapter o \sections (dipende dal documentclass e cosa vogliamo fare)
%\makeatletter
%\patchcmd{\@makechapterhead}{50\p@}{0pt}{}{}
%\patchcmd{\@makeschapterhead}{50\p@}{0pt}{}{}
%\makeatother

\chapter{Introduzione}
\pagenumbering{arabic}
\setcounter{page}{1}
Fin dai\todo{atrent: attenzione all'italiano, ho corretto} 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''.
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.

Quello più diffuso oramai è certamente il modello Client/Server, reso famoso dall'imponente World Wide Web il me più diffuso e oseremo azzardare a dire più intuitivo di utilizzare Internet ma certamente non l'unico.\cite[]{w3c}

Questa necessità di avere grandi computer con elevata potenza di calcolo in un unico posto ha creato negli anni una situazione di forte centralizzazione da parte di poche "Big Tech", dovuto principalmente al grande costo necessario per allestire il software e tenere in funzione server indipendenti rispetto soluzioni di tipo \textit{Infrastructure as a Service (IaaS)} o \textit{Platform as a service (PaaS)}.

Questo metodo di \textit{deployment} dei servizi ha creato una situazione in cui pochi gestori hanno un grosso controllo e potere rispetto a un enorme userbase creando una situazione ``di troppo potere nelle mani di pochi''\cite[]{ai4businessDataTroppo} che sfocia in un elevato controllo di tutte le comunicazioni effettuate attraverso queste piattaforme con tutti i vari problemi morali e legali annessi come la raccolta eccessiva di metadati sugli utenti, licenze di utilizzo super restrittive, controllo dei contenuti in base a pregiudizi Individuali, crittografia illusoria e rottura della reciproca fiducia, meccanismo alla base di Internet stessa.\cite{trentini2020cittadinanza}
\todo{mirko: sarebbe da rivedere questa parte per rendere ben chiara la situazione attuale della rete coi suoi problemi di forte centralizzazione
    atrent: concordo, prendi pure anche da altri testi, scartabella la biblio del nostro}

Lo scopo di questo elaborato è quello di analizzare lo stato attuale della rete e del software riguardo la fruizione e trasmissione di contenuti audiovisivi online in modo decentralizzato. Nello specifico ci interessa testare sul campo e valutare quali siano le soluzioni esistenti disponibili oggi, quali quelle più utilizzate, quale letteratura sia disponibile a riguardo, eventuale definizione e realizzazione di una piattaforma ideale soggettiva se nessuna di quelle trovate ci soddisfi e infine concludere con la presentazione dei del lavoro svolto.

\todo{atrent: così com'è l'intro non spiega bene il problema che ti vuoi porre}


\todo{atrent: magari prima di continuare a scrivere testo dettaglia meglio l'outline inserendo sezioni e sottosezioni}

\section{TCP/IP, Internet e  World Wide Web}
\todo{mirko: il capitolo 2 non so come farlo così come impostato ora dato che questa parte viene già menzionata nella introduzione quando si menziona client/server
    atrent: potrebbe diventare una sezione del precedente}
\begin{center}
    \includegraphics[scale=0.3]{images/client-server.png}
\end{center}

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.

\newpage
\section{Il difetto del Web}
\subsection{Web 2.0}
\subsection{Controllo delle comunicazioni tra individui}
\subsection{Riappropriazione dei dati}
\subsection{Forte dipendenza da software proprietario e perdita di privacy}
\subsection{Single point of failure}
\section{Live streaming e interaction}

\newpage
\subsection{Use cases}
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 ``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 ``one to many''}{Un’azienda 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 l’elevato 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}{Studneti}{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}{}

\pagebreak
In tutti i casi elencati sopra (ma anche in molti altri) emerge dalla nostra intuizione la necessità per un attore di eseguire uno streaming uno a molti o molti a molti senza utilizzare un servizio “cloud” già esistente proprietario ma utilizzando un software con licenza libera, senza dover fare il deploy di un intera infrastruttura HW globale, soddisfare le elevate richieste di banda richieste dalla natura dei contenuti video.

Azienda:
\begin{itemize}
    \item Live stream di un evento/riunione interna

    \item Assistenza remota

    \item Conference calls

    \item come utente o come provider (distributore)

    \item Riduzione dei costi/banda necessaria
\end{itemize}

Education:
\begin{itemize}
    \item Live courses
\end{itemize}


Common Joe:
\begin{itemize}
    \item Lan party

    \item Gaming/Streamer

    \item Conference calls

    \item Security cameras

    \item Content moderation

    \item Small friends group live sharing
\end{itemize}

Governo:

\begin{itemize}
    \item Comunicazioni video di emergenza

    \item Click day like overload avoidance
\end{itemize}

Common Lizard:

Metaverso, qualsiasi cosa sarà


\chapter{Stato attuale del software}
\epigraph{In questo capitolo andremo ad esplorare ed analizzare tutte le situazioni e le tecnologie attualmente esistenti che possono essere applicate}{}
\section{Nomenclatura}
Prima di iniziare con il ``dive-in'' vorremmo spendere qualche riga per fare un inquadratura generale di tutti i termini, non strettamente di uso comune, che andremo ad utilizzare nei capitoli successivi per cercare di essere il più possibile comprensibili anche ai meno avvezzi del settore

\begin{itemize}
    \item Livelli di decentralizzazione
          \begin{description}
              \item Descrtizione livelli di decentralizzazione
          \end{description}
    \item Licenza
          \begin{description}
              \item Per licenza si intende un tipo di contratto con il quale il titolare dei diritti di sfruttamento economico sul software (programma informatico) definisce il regime giuridico di circolazione e le limitazioni nell'utilizzo e nella cessione dell'opera (che sia un'opera creativa, o un software, inteso come programma) \cite{wikipediaLicenzainformatica} che l'utente di un servizio deve accettare per utilizzare il suddetto.
          \end{description}
    \item Network Address Translation (NAT)
          \begin{description}
              \item Il `Network Address Translation' o anche detto NAT è un meccanismo usato tipicamente nelle reti locali che permette di a molteplici host/client di condividere uno solo indirizzo IP pubblico accessibile dall'esterno. Un dispositivo sulla rete si occupa di modificare e instradare i pacchetti IP da una rete all'altra facendo un `mapping' delle porte pubbliche a quelle private e di instrdare i pacchetti IP sia in entrata che in uscita attraerso queste porte temporanee. \cite{pjsipIntroductionNetwork}
          \end{description}
    \item NAT Traversal
          \begin{description}
              \item Il problema del NAT Traversal sorge quando vari peer dietro NAT diversi cercano di comunicare. Siccome gli indirizzi IP reali vengono mascherati quando una applicazione, che non è stata pensata per il NAT traversal, prova a chiamare dei servizi esterni potrebbe inviare erroneamente il proprio indirizzo IP privato come indirizzo di risposta, cosa che impedirebbe il server esterno di rispondere e inviare dati verso il client. \\Un modo per risolvere questo problema è utilizzare il port forwarding. La tecnica più utilizzata per risolvere il problema del NAT traversal è il TCP hole punching. \cite{pjsipIntroductionNetwork} \cite{wikipediaTraversalWikipedia} \cite{rfc5128}
          \end{description}
    \item Content delivery Network (CDN)
          \begin{description}
              \item Una Content Delivery Network (CDN) è un sistema distribuito di server composto da un grande numero di nodi che consente agli utenti di richiedere oggetti da nodi vicini. Le CDN vengono usate di solito per ridurre la latenza e i tempi di caricamento end-to-end dal lato utente e sono tipicamente forniti da servizi esterni di terze parti. Vengono usate tipicamente per alleggerire il carico dai server dei provider di contenuti e fornire resistenza contro gli attacchi di `denial' of service distribuiti (DDoS). Tuttavia, però, memorizzando i dati dei provider e elaborando richieste degli utenti finali, i fornitori di CDN possono applicare tecniche di deuzione e tracking delle preferenze degli utenti che possono essere usate per scopi malevoli. Tale diulgazione di informazioni potrebbe comportare una perdita di privacy degli utenti e rivelare informazioni private specifiche del business o degli utenti a fornitori di CDN non affidabili o compromessi. \cite{Multi-CDN:TowardsPrivacyinContentDeliveryNetworks}
          \end{description}
    \item Distributed Hash Table (DHT)
          \begin{description}
              \item Una DHT \cite{ASurveyAndComparisonOfPeer-to-peerOverlayNetworkSchemes}
          \end{description}
\end{itemize}

\newpage

\section{Stato dell'arte}

Per identificare i punti cardine di quello che vorremmo realizzare, abbiamo bisogno di studiare alcune soluzioni già esistenti sul mercato, con lo scopo di trarne vantaggi e difetti da cui partire per poter proporre una possibile soluzione alternativa a quelle già esistenti.

Per semplicità, abbiamo deciso di prendere in considerazione al massimo tre soluzioni software, già esistenti per ogni macro-categoria.

Questa lista include sia protocolli essenziali che software completi `full-stack' e servizi web, per comparare la fattibilità di realizzazione di un software partendo dalle basi o utilizzando qualcosa che c'è già e, sono stati generalmente scelti, in base alla loro popolarità loro diffusione, licenza di utlizzo e utilità per il nostro caso d'uso.

\subsection{Twitch}

Twitch è una piattaforma di live streaming di proprietà di Amazon lanciata nel 2011, originariamente specializzata nella trasmissione in diretta di videogiochi, eSports ed eventi riguardanti il mondo videoludico.

\begin{figure}[H]
    \centering
    \includegraphics[width=\textwidth]{images/twitchHome.png}
    \caption{Home page di Twitch.}
\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.

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.

Twitch offre molti servizi sotto un unico sito web accessibile con un semplice browser:

\serviceCharacteristics{Chiunque con un account può condividere e guardare}
{Centralizzata}
{Servizio accessibile via browser o applicazione mobile}
{Stream video e testo per funzionalità di live chat}
{Proprietaria con contratto di utilizzo `EULA'}

\pagebreak
\newpage

\subsection{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.

\begin{figure}[H]
    \centering
    \includegraphics[width=\textwidth]{images/youtubeHome.png}
    \caption{Home page di Youtube.}
\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.

\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'}

\pagebreak
\newpage

\subsection{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. 

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.

\begin{figure}[H]
    \centering
    \includegraphics[width=\textwidth]{images/tahoe-LAFS.logo.png}
    \caption{Tahoe-LAFS logo.}
\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.
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.


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.

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}

\begin{figure}[H]
    \centering
    \includegraphics[width=\textwidth]{images/tahoe-simple-data-flow.png}
    \caption{Tahoe-LAFS simple data flow.}
\end{figure}

\serviceCharacteristics{Utenti e server di terze parti}{Software client lato utente}{Decentralizzata e `provider-indipendent'}{Qualsiasi tipo di file binario}{GPL}

\pagebreak
\newpage

\subsection{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 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.

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}

\begin{figure}[H]
    \centering
    \includegraphics[width=\textwidth]{images/Data-sharing-on-IPFS-by-owner.png}
    \caption{IPFS data flow. \cite{ResearchBasedDataRightsManagementUsingBlockchainOverEthereumNetwork}}
\end{figure}

\serviceCharacteristics{Nodi della rete}{Protocolli e software lato client}{Decentralizzata simil Blockchain}{Qualsiasi tipo di file binario}{MIT}

\pagebreak
\newpage

\subsection{PeerTube}
PeerTube è un servizio di video sharing open source, federalizzato e decentralizzato (lato client), basato su protocolli peer-to-peer come `WebTorrent', `WebRTC' e altre tecnologie web standard.
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.

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.
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]
    \centering
    \includegraphics[width=\textwidth]{images/peerTubeHome.png}
    \caption{PeerTube.}
\end{figure}

\serviceCharacteristics{Utenti registrati e non delle singole istanze}{Browser web e server indipendenti}{Federalizzata e decentralizzata P2P}{Video statici e livestream}{AGPLv3+}

\begin{figure}[H]
    \centering
    \includegraphics[width=\textwidth]{images/peerTubeItalia.png}
    \caption{Una istanza di PeerTube Italiana.}
\end{figure}

\pagebreak
\newpage

\subsection{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.

\begin{figure}[htb]
    \centering
    \includegraphics[width=\textwidth]{images/Ace_Stream_logo.png}
    \caption{PeerTube.}
\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à.

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.

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.

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+}

\pagebreak
\newpage

\section{}

\section{Decentralizzazione e federazione}

\chapter{La piattaforma ideale}

\section{Soluzione ideale}
\todo{Iniziare a spiegare come creare questa piattaforma ideale vs sistemi centralizzati esistenti}
In base a quello che abbiamo esposto fin'ora sorge spontanea la domanda e di conseguenza la ricerca di una piattaforma decentralizzata che soddisfi alcuni requisiti essenziali o meno.
\\Possiamo azzardare a stilare l'elenco di requisiti e features che vorremmo fossero presenti in questa piattaforma decentralizzata:
\begin{enumerate}
    \item Decentralizzazione totale della infrastruttura
          %\begin{description}
          %\item Quindi eliminazione del rischio di controllo da parte di un singolo provider
          %\item[Note:] I would like to describe something here
          %\end{description}
    \item Facilità nell'utilizzo
    \item Basso costo di entrata
    \item Interazione tra utenti in real time
    \item Moderazione
    \item Bassa latenza
    \item Possibilità di monetizzazione del contenuto da parte dei singoli utenti
    \item Altro? Si accettano proposte
\end{enumerate}

Andiamo ad analizzare meglio la nostra proposta:

\newpage
\todo{mirko: Sarebbe magari utile usare uno spettro come viene fatto nel libro di Cittadinanza digitale?
    atrent: per ora non ne vedo utilità, vediamo come si sviluppa prima l'outline}
Punto 1: Quindi eliminazione del rischio di controllo da parte di un singolo, Resistenza agli attacchi DDOS, no single point of failure

Punto 2: Se la piattaforma è accessibile via Web o standalone app, o mobile app, se ci sono situazioni di relatività della rete con blocco di porte non standard e/o protocolli

Punto 3: È relazionato al punto 2 con la questione di facilità di accesso e utilizzo rispetto a piattaforme già esistenti PERO' nello specifico sarebbe più la parte di facilità di passaggio da una piattaforma all'altra da parte degli streamer e nella compatibilità dei software/strumenti

Punto 4: Banalmente come fa twitch e youtube live una chat pubblica tra utenti (quindi con autenticazione), in caso di conference audio/video condiviso tra più utenti in real time

Punto 5: moderazione degli utenti/streamer se ha senso farla

Punto 6: relazionato al punto 1, abbastanza ovvia come cosa

Punto 7: io la penso come incentivo da parte di una rete/piattaforma di attrarre nuove utenze
\section{Realizzazioni e implementazioni possibili ad oggi}
\subsection{Possibili problemi nella realizzazione}
\subsubsection{Brevetti, copyright, DRM, moderazione dei contenuti e degli utenti}
\subsubsection{Necessità di competizione}
\section{Varie sottosezioni per tutti i modi in cui si potrebbe realizzare ora}
\subsection{Protocolli/Software Stack: P2P, Matrix, Jitsi, Crowd CDN, standalone apps, etc \dots}

\section{Uno sguardo al futuro}

\chapter{Conclusioni}

\nocite{*}
\printbibliography
\addcontentsline{toc}{chapter}{Bibliografia}

\end{document}