\documentclass{article}
%\usepackage{times}


%\usepackage{amsthm}
\usepackage{algorithm} % for pseudo-codes
%\usepackage{enumerate}
\usepackage{algpseudocode}
%\usepackage{DotArrow}
%\usepackage{subfig}
%\usepackage{amsmath, environ}
%\usepackage{amssymb}
%\usepackage{amsthm}
%%\usepackage{bm}
%%\usepackage{mathtools}
\usepackage{graphicx} 
%\usepackage{wrapfig}
%\usepackage{minibox}
%\usepackage{multirow}
%\usepackage{pifont} % \ding{}
%\usepackage[percent]{overpic}
%\usepackage{scrextend} % labeling environment
%
%\newtheorem{theorem}{Theorem}
%\newtheorem{definition}{Definition}
%\newtheorem{example}{Example}
%
%\renewcommand{\textfraction}{0.05}
%\renewcommand{\floatpagefraction}{0.75}

\newcommand{\centerimage}[5][-7pt]{ % [vskip] | graphics-opt | imgname | label | caption
\begin{figure}[!htb]%
\centering%
\vspace{#1}%
\includegraphics[#2]{#3}%
\caption{#5}\label{#4}\vspace{2mm}%
%\vspace{-3pt}\caption{#5}\label{#4}\vspace{-2pt}%
\end{figure}}
\date{}
%\includegraphics[trim=1cm 2cm 3cm 4cm, clip=true]{example.pdf}



\begin{document}



\title{Relazione Esercizio Timed Automata}


\author{Francesco Galla`, francesco.galla@edu.unito.it}

\maketitle


%========================================================================= 
%%%%%%%                       INTRODUCTION                         %%%%%%%
%========================================================================= 

\section{Modello A}  \label{sec:modA}
MODELLO A. Si assume che il canale sia perfetto, e quindi n\`e il messaggio, n\`e l’ack
possono essere persi. Il tempo di trasmissione sul link \`e variabile all’interno di un 
intervallo limitato, con poca variabilit\`a (quindi upper e lower bound del tempo di
trasmissione sul link sono molto vicini, diciamo non sopra un decimo del tempo di
trasmissione).
%=========================================================================================================
\subsection{Il modello Uppaal}  \label{ssec:Uppaal}

Il modello \`e composto da 3 template, rappresentanti un sender, un receiver e un link.

\subsubsection{Sender}

Tra gli stati del processo $Sender$, si nota lo stato iniziale di \textit{wait} \textbf{waitPacket}
in cui il processo attende un evento per cominciare la preparazione di un pacchetto. Una
volta che il pacchetto \`e pronto per essere mandato (con un tempo compreso nell'intervallo
$[1,4]$ del clock $sc$) allora si passa allo stato \textbf{canSend}. Da qui, il pacchetto
viene mandato sul canale di sincronizzazione $ML$ (urgente) e il $Sender$ passa a
\textbf{waitACK}. La ricezione dell'ACK avviene sul canale di sincronizzazione $LM$
(urgente) e il clock $sc$ viene resettato.
Ricevuto l'ACK, il $Sender$ rimane nello stato di \textbf{receivedACK} in cui occupa un tempo
nell'intevallo $[2,4]$ del clock $sc$ per processarlo, per poi resettare nuovamente il clock
e ritornare allo stato iniziale.


\subsubsection{Receiver}

Il processo $Receiver$ segue una dinamica simile a quella del $Sender$: anche questo ha $4$
stati, di cui l'iniziale \textbf{waitPacket} \`e l'attesa di un pacchetto (mandato dal
$Sender$ e trasportato dal $Link$ al $Receiver$ sul canale di sincronizzazione $LR$ (urgente).
Ricevuto il pacchetto, il receiver utilizza un tempo compreso nell'intevallo $[2,4]$ per
processarlo in \textbf{receivedPacket} e passare nello \textbf{donePacket} resettando il
clock $rc$. Qui impiega tra $2$ e $3$ secondi per costruire un ACK e passare nello stato
\textbf{canACK}, da cui pu\`o mandare l'acknowledgement sul canale di sincronizzazione $RL$
(urgente).

\subsubsection{Link}

Il processo $Link$ \`e modellato senza perdite (canale perfetto) e utilizza $5$ stati, di cui
quello iniziale \`e considerato uno stato interno e modella le situazioni in cui i processi
$Sender, Receiver$ stanno eseguendo operazioni locali (per cui non c'\`e comunicazione sul
canale). Gli altri stati si comportano in maniera simile agli stati gi\`a visti negli altri
due processi, utilizzando il clock $lc$.

%\centerimage{trim=1cm 10cm 3cm 4cm, clip=true}
	\centerimage{width=\columnwidth}
{modAsend.jpg}{img:sendA}
	{Sender A}

%\centerimage{trim=1cm 10cm 3cm 4cm, clip=true}
	\centerimage{width=\columnwidth}
{modArecv}{img:recvA}
	{Receiver A}

%\centerimage{trim=1cm 10cm 3cm 4cm, clip=true}
	\centerimage{width=\columnwidth}
{modAlink.jpg}{img:linkA}
	{Link A}


\subsection{Analisi TCTL delle propriet\`a}

Sono state controllate 4 propriet\`a sul modello A. Essendo un modello \textit{perfetto},
senza perdite n\`e rumore, si nota come rispetti tutte le propriet\`a verificate.

\begin{description}
    \item{\textbf{1.} } $AG (not deadlock)$ \`e vera, quindi la traccia del sistema di
        processi \`e infinita.
    \item{\textbf{2.} } $sender.waitACK --> (sender.receivedACK)$ \`e vera, in quanto senza
        perdite il sender sar\`a sempre in grado di ricevere l'ACK entro un tempo finito.
    \item{\textbf{3.} } $AF receiver.receivedPacket$ \`e vera, in quanto non ci sono
        constraint sul tempo di attesa di $receiver.waitPacket$, pertanto un pacchetto
        verr\`a sempre ricevuto.
    \item{\textbf{4.} } Il tempo minimo e massimo tra l'invio del messaggio e la ricezione dell'ACK
        corrispondente da parte del $Sender$ sono ottenibili grazie a un clock aggiuntivo
        $fc$ che viene resettato ogni volta che un pacchetto viene mandato sul canale $ML$.
        Per questo nello stato $sender.canSend$ contiene il tempo minimo e massimo espressi
        come \textit{bound} dell'intervallo, in questo caso $[19,31]$.
\end{description}
\newpage

\section{Modello B}  \label{sec:modB}
MODELLO B. Si modifichi il modello in modo da prevedere la possibilità che il link 
perda un messaggio o un ack (la perdita equivale sia alla perdita effettiva che al 
caso di messaggio corrotto, perchè l’algoritmo si comporta in modo analogo). Non 
cambiate il protocollo, modellate semplicemente un link con perdita o 
corruzione del messaggio.
%=======================================================================================================
\subsection{Il modello Uppaal}  \label{ssec:Uppaal}

Il modello \`e composto da 3 template, rappresentanti un sender, un receiver e un link.
Il sender e il receiver mantengono la struttura del modello A, mentre nel $Link$ vengono
introdotte due perdite possibili: una per il pacchetto e una per l'ACK.

\subsubsection{Link}

Il $Link$ in questo caso ha possibilit\`a di perdere i pacchetti (scelta non deterministica)
in due stati: $receivedPacket$ e $receivedACK$, ovvero quelli in cui \`e stato mandato un
messaggio dal sender al link o dal receiver al link. Si nota come l'invariante degli due
stati sia $lc < 8$, dove con $lc == 8$ si sa con certezza che il pacchetto \`e stato perso
oppure ricevuto correttamente.
Per implementare la perdita \`e stato utilizzato un posto aggiuntivo rispetto al modello A,
chiamato $lostPacket$, che riporta allo stato fantasma del link senza per\`o mandare il
pacchetto o l'ACK.

%\centerimage{trim=1cm 10cm 3cm 4cm, clip=true}
	\centerimage{width=\columnwidth}
{modBlink.jpg}{img:linkB}
	{Link B}


\subsection{Analisi TCTL delle propriet\`a}

\begin{description}
    \item{\textbf{1.} } $AG (not deadlock)$ \`e falsa, infatti la traccia del simulatore
        mostra come un pacchetto perso causi deadlock perch\`e $Sender$ e $Receiver$ sono
        rimasti in attesa di risposta e il canale non ha pi\`u comunicazioni al suo interno.
    \item{\textbf{2.} } $sender.waitACK --> (sender.receivedACK)$ \`e falsa, per lo stesso
        motivo per cui la $1.$ lo \`e.
    \item{\textbf{3.} } $EF receiver.receivedPacket$ \`e vera, perch\`e nonostante la
        possibilit\`a di deadlock, c'\`e almeno una traccia in cui il pacchetto viene
        consegnato correttamente. Questo significa che i pacchetti non sono persi con
        sicurezza ma tramite una scelta non deterministica.
    \item{\textbf{4.} } Il tempo minimo e massimo tra l'invio del messaggio e la ricezione dell'ACK
        corrispondente da parte del $Sender$ sono ottenibili grazie a un clock aggiuntivo
        $fc$ che viene resettato ogni volta che un pacchetto viene mandato sul canale $ML$.
        Dato che abbiamo una probabilit\`a di perdita all'interno del canale, possiamo
        stabilire con sicurezza solo il tempo \textbf{minimo}, che risulta equivalente a
        quello del modello A.
\end{description}
\newpage

\section{Modello C}  \label{sec:modC}
MODELLO C. Mantenendo il comportamento del canale previsto per il modello B, si
modelli il mittente e il ricevente descritti dall’algoritmo 3.
%=========================================================================================================
\subsection{Il modello Uppaal}  \label{ssec:Uppaal}

Il modello \`e composto da 3 template, rappresentanti un sender, un receiver e un link.
Il sender \`e stato implementato in due versioni, una che utilizza un timer singolo e una che
utilizza due timer. Il link non cambia rispetto al modello B.

Si utilizzano inoltre $3$ variabili globali booleane aggiuntive: $next, ack, frame$. La
scelta di utilizzare variabili booleane \`e data dal fatto che in STOP\&WAIT i messaggi sono
mandati singolarmente, per cui basta differenziare due messaggi successivi per riconoscere i
duplicati, come effettuato nel $Receiver$.

\subsubsection{Sender (timer singolo)}

Si estende il template $Sender$ del Modello A con la possibilit\`a di inviare nuovamente i
messaggi nel caso questi venissero persi, nel caso non fosse ricevuto un ACK e nel caso l'ACK
ricevuto non corrispondesse a quello atteso. Per fare ci\`o sono state utilizzate le
variabili globali di cui sopra e uno stato $lostPacket$ il cui accesso viene controllato da
una guardia sul timer $x0$ (singolo). Se il timer "scatta", ovvero se trascorre il tempo
stabilito nello stato $waitACK$, allora \`e forzato lo stato $lostPacket$ che riportando a
$canSend$ senza cambiare i valori di $frame$ e $next$ permette la ritrasmissione.
Inoltre, per il controllo della correttezza del'ACK, si utilizza una transizione con guardia
che porta dallo stato $receivedACK$ allo stato $lostPacket$, per ritrasmettere nel caso l'ACK
ricevuto non fosse corretto.

\subsection{Sender (timer doppio)}

Per il sender a timer doppio, \`e stata duplicata la struttura del primo sender di modo da
permettere una scelta tra $next == 1$ e $next == 0$. In questo modo si pu\`o discriminare tra
i due tipi di frame possibili.

\subsubsection{Receiver}

Al receiver del Modello A viene aggiunta la capacit\`a di riconoscere pacchetti duplicati
tramite una variabile locale $correctFrame$ e uno stato $dupPacket$. La transizione a questo
stato viene controllata da una guardia che discrimina se il frame ricevuto \`e corrispondente
a quello atteso. Nel caso il frame non corrispondesse, viene aggiornata la variabile $ack$ e
viene mandato l'ACK per il pacchetto ricevuto, seppur duplicato, per permettere il
proseguimento del sender.


%\centerimage{trim=1cm 10cm 3cm 4cm, clip=true}
	\centerimage{width=\columnwidth}
{modCsend1.jpg}{img:sendC}
    {Sender C (1 timer)}

	\centerimage{width=\columnwidth}
{modCsend2.jpg}{img:sendC2}
    {Sender C (2 timer)}

%\centerimage{trim=1cm 10cm 3cm 4cm, clip=true}
	\centerimage{width=\columnwidth}
{modCrecv}{img:recvC}
	{Receiver C}


\subsection{Analisi TCTL delle propriet\`a}

Il sistema rispetta le propriet\`a seguenti sia con un timer sia con due, dimostrando che non
c'\`e necessit\`a per questo modello di due timer. Inoltre, il valore dei timer (settato a
$50$ in entrambi i casi) deve essere maggiore del tempo impiegato da un ACK a tornare al
sender, ossia due volte il tempo impiegato dal canale per spedire un pacchetto pi\`u
l'eventuale tempo di elaborazione nel receiver. Altrimenti si ha $deadlock$, perch\`e il
sender non riesce a spedire nuovamente il pacchetto se canale \`e occupato dall'ACK del receiver.
Il valore minimo del timer per questo modello \`e $42$.

\begin{description}
    \item{\textbf{1.} } $AG (not deadlock)$ \`e vera, quindi la traccia del sistema di
        processi \`e infinita.
    \item{\textbf{2.} } $sender.waitACK0 || sender.waitACK1 --> (sender.receivedACK0 ||
        sender.receivedACK1)$ \`e falsa, in quanto il canale pu\`o subire perdite.
    \item{\textbf{3.} } $E<> (sender.receivedACK0 \&\& ack == next )$ \`e vera, infatti esiste
        almeno un caso in cui l'ACK ricevuto dal sender \`e corretto (e quindi il modello \`e
        in grado di passare messaggi correttamente).
    \item{\textbf{4.} } $link.lostPacket --> (sender.canSend0 || sender.canSend1 ||
        receiver.canACK)$ \`e vera, in quanto in caso di pacchetto perso il sistema non si
        blocca ma permette al sender di mandare di nuovo il messaggio o al receiver di
        trasmettere l'ACK.
    \item{\textbf{4.} } Il tempo minimo e massimo tra l'invio del messaggio e la ricezione dell'ACK
        corrispondente da parte del $Sender$ sono ottenibili grazie a un clock aggiuntivo
        $fc$ che viene resettato ogni volta che un pacchetto viene mandato sul canale $ML$.
        Per questo nello stato $sender.canSend$ contiene il tempo minimo e massimo espressi
        come \textit{bound} dell'intervallo, in questo caso $[21,32]$.
\end{description}
\end{document} 
