\documentclass[a4paper,10pt,oneside]{report} 


%\usepackage{concmath}
\usepackage[utf8]{inputenc} % codage latin1
\usepackage[T1]{fontenc} % codage des fonts
\usepackage[francais]{babel} % typographie et césures francaises

\usepackage{lastpage}

\usepackage{amsthm} %pour qed
\usepackage{amsmath} %pour \dfrac
\usepackage{amssymb,mathrsfs} % amsfonts

\usepackage{graphicx}

% \usepackage[colorlinks]{hyperref}


\usepackage{tikz} % L A TEX

\usepackage[margin=1.0cm,top=2.5cm]{geometry}

\usepackage{fancyhdr} % pour les en-têtes et les pieds de page : APRES LA GEOMETRIE DE LA PAGE
\pagestyle{fancy} % 6 par défaut 3 en tête et 3 pied
% \pagestyle{empty} % supprime les num\'eros de page qui sont automatiques

% \usepackage{xcolor}
% \definecolor{gris}{gray}{0.9}



\setlength{\parskip}{0.15cm} % hauteur entre chaque paragraphe
\setlength{\parindent}{0.0cm} % indentation de paragraphe


%*********************************************************************************
%********************************************************************************
% Macros 
%********************************************************************************
%*********************************************************************************

\newcommand{\R}{{\mathbb R}}
\newcommand{\Q}{{\mathbb Q}}
\newcommand{\C}{{\mathbb C}}
\newcommand{\Z}{\mathbb Z}
\newcommand{\dd}{\displaystyle}
\newcommand{\Id}{\mathrm{[}\! \mathrm{[}}
\newcommand{\If}{\mathrm{]}\! \mathrm{]}}
\newcommand{\N}{{\mathbb N}}
\newcommand{\E}{{\mathbf E}}
\newcommand{\Hx}{{\mathbf H(X)}}
\newcommand{\Prob}{{\mathbb P}}
\newcommand{\V}{{\mathbf V}}
\newcommand{\X}{{\mathcal X}}

\newcommand{\be}{\begin{enumerate}}
\newcommand{\ee}{\end{enumerate}}
\newcommand{\bi}{\begin{itemize}}
\newcommand{\ei}{\end{itemize}}
\newcommand{\ba}{\begin{array}}
\newcommand{\ea}{\end{array}}
\newcommand{\ite}{\item[$\bullet$]}
\newcommand{\ssi}{\Longleftrightarrow}
\newcommand{\Card}{\mathop{ \mathrm{Card}}}


\everymath{\displaystyle} %comme son nom l'indique

%*********************************************************************************
%*********************************************************************************
%                        Document 
%*********************************************************************************
%*********************************************************************************
% changement de la numerotation
\setcounter{secnumdepth}{5}
%      \renewcommand{\thechapter}{\Alph{chapter}}
\renewcommand{\thechapter}{\arabic{chapter}}
%     \renewcommand{\thesection}{\Roman{section})}
\renewcommand{\thesection}{ }
\renewcommand{\thesubsection}{\alph{subsection})}
\renewcommand{\thesubsubsection}{$\bullet$ }
% \renewcommand{\thesubsubsection}{\thesubsection\arabic{subsubsection}.}
\renewcommand{\theparagraph}{\roman{paragraph})}


\begin{document}


\setlength{\headheight}{13.0pt}

\fancyhead[L]{DEPRES Mathilde-D'ANELLO Yohann}
% \renewcommand{\headrulewidth}{0pt}

\fancyhead[C]{{\sf Projet réseau}}


\fancyhead[R]{page {\thepage} / \pageref{LastPage} }
% \pagestyle{empty} % 6 par défaut 3 en tête et 3 pied
\fancyfoot{}



\vspace{0.0cm}

\section{Introduction}

Notre projet est rédigé en Python, et fonctionne dans les versions plus récentes que Python 3.7. Il comprend une interface graphique, implémentée pour nous amuser et rendre les tests plus aisés. L'interface graphique utilise le module curses de Python. Le module curses (et donc le projet en entier) ne fonctionne que si le projet est exécuté dans un terminal. Le projet supporte les encodages markdown (gras, italique, souligné ...) et l'utilisation d'emojis à partir du moment où le terminal les supporte.

\subsection{Lancer une instance du projet}

Pour lancer une instance du projet, il faut se placer dans le répertoire racine du projet, et exécuter 

> python3 main.py <adresse IPv6 ou IPv4 de l'hôte ou localhost pour lancer en local> <numéro du port à utiliser pour la connexion> [ options].

Les options sont: 
\begin{itemize}
 \item[$\bullet$] \textbf{- -client\_address <addresse IPv6 ou IPv4>} : pour spécifier l'adresse d'un premier voisin nécessaire à l'insertion du nouveau pair dans le réseau.
 \item[$\bullet$] \textbf{- -client\_port <numéro de port>} : pour spécifier le port sur lequel écouter le premier voisin.
 \item[$\bullet$] \textbf{-h} : pour obtenir l'aide
 \item[$\bullet$] \textbf{- -debug} : pour activer l'affichage des messages systèmes, par exemple lorsqu'on reconnait un nouveau voisin, ou qu'on reçoit certains TLVs.
 \item[$\bullet$] \textbf{- -no-emoji} : une option graphique si on ne veut pas afficher d'emoji.
 \item[$\bullet$] \textbf{- -no-markdown} : une option graphique si on ne veut pas utiliser les encodages markdown.
\end{itemize}


\subsection{Architecture du projet}

Le projet consiste en 4 fichiers de code, et un fichier main.py, qui permet de lancer une instance du projet.

Le fichier term\_manager.py permet d'initialiser l'utilisation du terminal par curses, il est sans grand intérêt pour la partie réseau du projet.

Le fichier squinnondation.py contient le parseur d'arguments qu'on utilise pour récupérer les adresses de l'hôte et du premier voisin donnés par l'utilisateur. Il se conclut par le lancement de plusieurs threads qui constituent le client MIRC en lui-même, et dont les classes sont définis dans les deux derniers fichiers.

Le fichier messages.py contient les définitions de tout les TLVs, qui sont définis comme des classes python.

Le fichier hazel.py contient les définitions de la classe voisin, la classe de l'hôte ainsi que les classes du listener, du manager des voisins et de l'inondateur. Ils contient aussi l'actualisation de l'affichage.

\section{Choix techniques}
\subsection{Gestion des TLVs}

La classe \textbf{TLV} représente l'abstraction d'un TLV. Elle est sous-classée en chacun des types individuels de TLV (Pad1TLV, PadNTLV, ...). Chaque classe de TLV est équipée d'une fonction marshall qui transforme un objet de la classe en un tableau d'octets prêt à être envoyé, et d'une fonction unmarshall, qui transforme des octets en un objet de la classe.

Chaque classe de TLV possède également une fonction construct, qui permet au programme de construire un objet de la classe, et d'une fonction handle, qui indiquee ce qui doit être fait quand ce type de TLV est reçu. Pour des raisons de sécurité, certaines classes sont équipées d'une fonction validate\_data, qui s'assure que certaines propriétés du TLV concordent, par exemple sa longueur annoncée et sa longueur réelle, et qui lancent une erreur si ça n'est pas le cas. Cela pourrait permettre en particulier d'indentifier des pairs malicieux qui envoient des TLVs malformés.

\subsection{Inondation}

Les messages récents sont placés dans un dictionnaire indexé par les paires (Id de l'émetteur, nonce).
L'inondation est effectuée dans un thread dédié.

-> compteur séquentiel.

\subsection{Gestion des voisins}

Comme demandé par l'énoncé, les voisins sont placés dans une table des voisins actifs, qui est un dictionnaire de liste [objet voisin, date du dernier Hello reçu, date du dernier Hello long reçu, ce voisin est-il symétrique], indexé par les couples (addresse IP, port). Chaque pair possède aussi un dictionnaire des voisins potentiels.

La gestion des voisins est effectuée dans un thread dédié, qui vérifie régulièrement si les voisins sont symétriques, envoie des HelloTLV longs aux voisins actifs et des hello TLVs court à des voisins potentiels si c'est néxcessaire.

\end{document}
