From 600d9a86fa335e9f5fbc27dd49cc93793bb6bc0a Mon Sep 17 00:00:00 2001 From: Leopold Clement Date: Tue, 17 Aug 2021 16:49:44 +0200 Subject: [PATCH] Etat de l'art --- .gitignore | 5 + makefile | 23 +- png_img/comp_tcp_Xiao.png | Bin 0 -> 112757 bytes png_img/gen_fig_g.py | 12 + puml/call_stack_envoie.puml | 67 +++++ puml/cas_utilisation_coap.puml | 24 ++ puml/struc_centrale.puml | 64 +++++ puml/structure_1.puml | 35 +++ puml/structure_2.puml | 62 +++++ puml/temporal_transaction_invalide.puml | 32 +++ puml/temporal_transaction_valide.puml | 27 ++ puml/utilisation_classique_apprentissage.puml | 47 ++++ puml/utilisation_classique_transmition.puml | 39 +++ rapport.bib | 22 +- rapport.tex | 247 +++++++++++++++++- 15 files changed, 683 insertions(+), 23 deletions(-) create mode 100644 png_img/comp_tcp_Xiao.png create mode 100644 png_img/gen_fig_g.py create mode 100644 puml/call_stack_envoie.puml create mode 100644 puml/cas_utilisation_coap.puml create mode 100644 puml/struc_centrale.puml create mode 100644 puml/structure_1.puml create mode 100644 puml/structure_2.puml create mode 100644 puml/temporal_transaction_invalide.puml create mode 100644 puml/temporal_transaction_valide.puml create mode 100644 puml/utilisation_classique_apprentissage.puml create mode 100644 puml/utilisation_classique_transmition.puml diff --git a/.gitignore b/.gitignore index 5bd5993..3a4f519 100644 --- a/.gitignore +++ b/.gitignore @@ -284,3 +284,8 @@ TSWLatexianTemp* # Uncomment the next line to have this generated file ignored. #*Notes.bib +*.ist +*.glo +puml/*.png +puml/*.svg +pdf_img/* diff --git a/makefile b/makefile index e42d90d..6c9ba4c 100644 --- a/makefile +++ b/makefile @@ -1,24 +1,21 @@ FIGURES_SVG=$(wildcard raw_img/*.svg) FIGURES_PDF=$(subst raw_img/,pdf_img/,$(FIGURES_SVG:.svg=.pdf_tex)) -all : rapport.tex rapport.bib $(FIGURES_PDF) +all : rapport.tex rapport.bib $(FIGURES_PDF) $(UML_PNG) png_img/gain_action.png + plantuml -checkmetadata puml lualatex -shell-escape rapport.tex bibtex rapport makeglossaries rapport lualatex -shell-escape rapport.tex lualatex -shell-escape rapport.tex -clean : - rm -f rapport.aux - rm -f rapport.bbl - rm -f rapport.blg - rm -f rapport.out - rm -f rapport.log - rm -f rapport.pdf - rm -f rapport.toc - rm -f rapport.lof - rm -f rapport.lot +png_img/gain_action.png : + python3 png_img/gen_fig_g.py + +clean : clean-latex rm -f -r pdf_img/ + rm -f -r puml/*.svg + rm -f -r puml/*.png clean-latex : rm -f rapport.aux @@ -30,6 +27,10 @@ clean-latex : rm -f rapport.toc rm -f rapport.lof rm -f rapport.lot + rm -f rapport.ist + rm -f rapport.glg + rm -f rapport.gls + rm -f rapport.glo pdf_img/%.pdf : raw_img/%.svg pdf_img/%.pdf_tex inkscape -D -z --file=$< --export-pdf=$@ --export-latex diff --git a/png_img/comp_tcp_Xiao.png b/png_img/comp_tcp_Xiao.png new file mode 100644 index 0000000000000000000000000000000000000000..c6e15739e3f2dd2bc6f6c399880864325572465e GIT binary patch literal 112757 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

35oxBKLorLlI@=)DBGio8~*rFK4uDG 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 o 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 + 1/(1-a)*(a<0) +ax.plot(a, np.log(g)) +ax.set_xlabel('$a _ t ^ {\\left( i \\right)}}$') +ax.set_ylabel('$ln \\left( \\frac{c _ {t+1} ^ {\\left( i \\right) } }{c _ t ^ {\\left( i \\right)}} \\right)$') +ax.grid() +fig.tight_layout() +fig.savefig('png_img/gain_action.png') \ No newline at end of file diff --git a/puml/call_stack_envoie.puml b/puml/call_stack_envoie.puml new file mode 100644 index 0000000..4588a4d --- /dev/null +++ b/puml/call_stack_envoie.puml @@ -0,0 +1,67 @@ +@startuml +skinparam roundcorner 20 +skinparam sequenceMessageAlign direction +hide footbox + +actor User as usr order 1 + +box "CoAPthon" +queue HelperClient.queue <> order 19 +participant HelperClient.get <> order 10 +participant HelperClient.send_request <> order 11 + +participant CoapClient.send_message <> order 21 +participant CoapClient.send_datagram <> order 22 +participant CoapClient._start_retransmission <> order 31 +participant CoapClient._receiver_thread <> order 32 +participant CoapClient._retransmit <> order 33 + +end box + +box "Module IA" +participant SuperviseurLocal.RTO <> order 41 +participant SuperviseurLocal.envoie_token <> order 42 +participant SuperviseurLocal.reception_token <> order 43 +end box +boundary reseau order 51 + +usr -> HelperClient.get ++: .get(path) +HelperClient.get -> HelperClient.get : generate_random_token(2) +HelperClient.get -> HelperClient.send_request ++: send_request(request) +HelperClient.send_request -> CoapClient.send_message ++: send_message(request) +CoapClient.send_message -> CoapClient.send_datagram ++: send_datagram(request) + +CoapClient.send_datagram -> reseau : datagram +CoapClient.send_datagram -> SuperviseurLocal.envoie_token : envoie(token) +CoapClient.send_datagram -> CoapClient._receiver_thread ++#red: Thread.start() + +CoapClient.send_datagram --> CoapClient.send_message --: None +CoapClient.send_message -> CoapClient._start_retransmission ++#Blue: Thread.start() +CoapClient.send_message --> HelperClient.send_request --: None +HelperClient.send_request -> HelperClient.queue : wait for + +CoapClient._start_retransmission -> SuperviseurLocal.RTO ++#Blue: RTO ? +return RTO + +CoapClient._start_retransmission -> CoapClient._retransmit --++#Green: Thread.start() + +loop Pas de réponse sur le socket UDP avant l'expiration du RTO +...Attente... +CoapClient._retransmit -> CoapClient._retransmit : retransmit_count += 1 +CoapClient._retransmit -> CoapClient._retransmit : RTO *= 2 +CoapClient._retransmit -> CoapClient.send_datagram ++#Green: send_datagram(request) +CoapClient.send_datagram -> reseau : datagram +CoapClient.send_datagram -> SuperviseurLocal.envoie_token : envoie(token) +return None +end + +reseau --> CoapClient._receiver_thread : datagram +CoapClient._receiver_thread -> SuperviseurLocal.reception_token : reception(token) +CoapClient._receiver_thread -> CoapClient._retransmit !!: wait for the thread end +CoapClient._receiver_thread -> HelperClient.queue --: response + +HelperClient.queue --> HelperClient.send_request : response +HelperClient.send_request --> HelperClient.get --: response +HelperClient.get --> usr --: response + +@enduml \ No newline at end of file diff --git a/puml/cas_utilisation_coap.puml b/puml/cas_utilisation_coap.puml new file mode 100644 index 0000000..a25ab9e --- /dev/null +++ b/puml/cas_utilisation_coap.puml @@ -0,0 +1,24 @@ +@startuml + +hide footbox +participant Capteur as capt +database Cloud as cld + +[-> capt ++: activation exterieur\ntimer, interuption... +capt -> cld : CON[0x77]\nPUT/url?val +cld --> capt !!: ACK[0x77] + +newpage + +cld -> capt ++: CON[0x45]\nGET/URL +capt --> cld --: ACK[0x45]\nval + +newpage + +cld -> capt ++: CON[0x45]\nGET/URL +{start} capt --> cld : ACK[0x45] +{end} capt -> cld : CON[0xdc]\nval +{start} <-> {end} : determination de val +cld --> capt !!: ACK[0xdc] + +@enduml \ No newline at end of file diff --git a/puml/struc_centrale.puml b/puml/struc_centrale.puml new file mode 100644 index 0000000..8ca2aaf --- /dev/null +++ b/puml/struc_centrale.puml @@ -0,0 +1,64 @@ +@startuml +:Utilisateur: as usr +database "Base de\ndonnée" as db +file "UDP" <> as udp +file "TensorFlow" <> as tf +file "Keras" <> as keras + +package "Client CoAP" as global { + component "Superviseur" as super <>{ + () "Interface CoAP" as h_coap + () "Collecteur donnée" as h_stat + + component "Gestionaire\nglobal" <

> as main_super + component "Statisticien" as stat + + stack "buffer\nd'experience" as buff + [NN] + [optimiseur] + [horloge] <> + + h_coap -- main_super + + buff --> optimiseur : expérience + optimiseur --> NN : met à jour + horloge --> optimiseur : déclanche + + h_stat - stat + stat -> buff : remplis + } + component "Session" as client <> { + () "Socket UDP" as s_udp + () "Session handle" as h_session_message + () "RTO" as h_session_rto + queue "Buffer" as file_attente + [Gestionaire\nde la session] <
> as main_sess + [timer] <> as timer + h_session_message -- main_sess + h_session_rto -- main_sess + main_sess --> s_udp : packet\nudp + main_sess ..> file_attente : use + main_sess <-- s_udp : aquitement\n&\nréponse + main_sess ..> timer : use + } + + main_super --( h_session_message + NN --( h_session_rto + main_sess --( h_stat + + note top of client + Un par capteur + end note +} + +usr --( h_coap +db --( h_coap + + +buff ..> tf : use +optimiseur ..> tf : use +NN ..> keras : use +s_udp ..> udp : use + + +@enduml diff --git a/puml/structure_1.puml b/puml/structure_1.puml new file mode 100644 index 0000000..6e89a62 --- /dev/null +++ b/puml/structure_1.puml @@ -0,0 +1,35 @@ +@startuml +:utilisateur: as usr +[UDP] <> as udp +[Controleur global] as chef +package "Client COAP" <> as coap{ + [parseur] as parseur + [lexeur] as lexeur + () "socket udp" as s_udp + () "handle coap" as h_coap + package "Gestion des retransmisions" as retransmition{ + [gestionaire] as gestionaire + [timer] as timer + database "Liste des\nmessages" as db_msg + } +} + +lexeur --> s_udp : message NCON +lexeur --> gestionaire : message CON +s_udp --> parseur : message reçu + +gestionaire ..> timer : use +gestionaire ..> db_msg : use +gestionaire -> s_udp : émition et\nretransmition + +parseur --> gestionaire : Tokken + +s_udp ..> udp : use + +usr --( h_coap +h_coap -> lexeur : requette +h_coap <- parseur : reponse +gestionaire --> chef : info local +chef --> gestionaire : info global + +@enduml \ No newline at end of file diff --git a/puml/structure_2.puml b/puml/structure_2.puml new file mode 100644 index 0000000..3de11ec --- /dev/null +++ b/puml/structure_2.puml @@ -0,0 +1,62 @@ +@startuml +file "Client Coap" as global{ + component "Superviseur" as super + + [Parseur] <> as par + [Lexeur] <> as lex + + component "Session" <> as session { + () "Socket UDP" as s_udp + () "Session handle" as h_session + queue "Buffer" as file_attente + [Gestionaire\nde la session] <
> as main_sess + h_session - main_sess + + file_attente <. main_sess : use + + component "Communication" <> as th_com{ + [timer] + [Gestionaire\ndu message] <
> as main_msg + main_msg ..> timer : use + main_msg --> s_udp : packet udp + main_msg <-- s_udp : aquitement\n&\nréponse + } + + component "Apprentissage" <> as th_appr{ + stack "buffer\nd'experience" as buff + [NN] + [optimiseur] + [horloge] <> + + buff -down-> optimiseur : expérience + optimiseur -down-> NN : met à jour + horloge -> optimiseur : déclanche + } + + main_sess ..> th_com : Instancie + main_sess --> main_msg : Requette\n&\nRTO + main_msg --> main_sess : Réponse\n&\ninfo liaison + + main_sess --> buff : transition + main_sess ..> NN : use + + note left of th_com + Une instance par message + end note + } + note left of session + Une instance par capteur + end note + +} + +file "UDP" <> as lib_udp +file "Tensorflow\nKeras" <> as lib_ia +main_msg ..> par : use +main_msg ..> lex : use +s_udp .down.> lib_udp : use +th_appr .down.> lib_ia : use + +:acteur: +acteur --( h_session +@enduml \ No newline at end of file diff --git a/puml/temporal_transaction_invalide.puml b/puml/temporal_transaction_invalide.puml new file mode 100644 index 0000000..237a3fd --- /dev/null +++ b/puml/temporal_transaction_invalide.puml @@ -0,0 +1,32 @@ +@startuml +concise "Cloud" as cld +concise "Capteur" as capt + +cld is "idle" +capt is "idle" + +@0 as :emition_req +cld -> capt@+15 : "GET" +cld is "waiting\nRTO 1" + +@+15 as :reception_req +capt is "traitement" + +@+5 as :emition_rep +capt -> cld@+15 : "200" +capt is "idle" + +@+10 +cld is "waiting\nRTO 2" +cld -> capt@+15 : "GET" + +@+5 as :reception_rep +cld is "traitement" + +@capt +@30 <-> @35 : rtt +@cld +@0 <-> @30 : rto + + +@enduml \ No newline at end of file diff --git a/puml/temporal_transaction_valide.puml b/puml/temporal_transaction_valide.puml new file mode 100644 index 0000000..2d702b9 --- /dev/null +++ b/puml/temporal_transaction_valide.puml @@ -0,0 +1,27 @@ +@startuml +concise "Cloud" as cld +concise "Capteur" as capt + +cld is "idle" +capt is "idle" + +@0 as :emition_req +cld -> capt@+10 : "GET" +cld is "waiting RTO 1" + +@+10 as :reception_req +capt is "traitement" + +@+5 as :emition_rep +capt -> cld@+10 : "200" +capt is "idle" + +@+10 as :reception_rep +cld is "traitement" + +@capt +@0 <-> @25 : rtt +@cld +@0 <-> @30 : rto + +@enduml \ No newline at end of file diff --git a/puml/utilisation_classique_apprentissage.puml b/puml/utilisation_classique_apprentissage.puml new file mode 100644 index 0000000..6b9008f --- /dev/null +++ b/puml/utilisation_classique_apprentissage.puml @@ -0,0 +1,47 @@ +@startuml +database DB as db + +box "Superviseur COAP" +participant "Optimiseur" as opti +participant "Réseau de\nneurrones" as NN +participant "Buffer\nd'expérience" as buffer +participant "Statisticien" as stat +end box + +box "Client COAP" +boundary "Handle CoAP" as h_coap +queue "File d'attente" as file +participant "Gestionaire des\nretransmitions" as gest +boundary "UDP socket" as udp +end box + +boundary "reseau de\ncapteurs" as capt + +-> db ++: déclanchement + +db -> h_coap ++: requète : URI +h_coap -> file : requète : URI +hnote over file +On attend qu'il n'y ais plus +de message non-aquitée pour +ce capteur +endnote +file -> gest ++: requète : URI +group while [non réussite] + gest -> udp ++: CON[akc_token]\nGET/URI(req_token) + udp -> capt ++: CON[akc_token]\nGET/URI(req_token) + alt réussite + return AKC[akc_token]\nval(req_token+1) + return AKC[akc_token]\nval(req_token+1) + + else timeout + gest-> gest : doublement RTO + end +end +gest -> stat : n_retransmition, RTT +gest -> h_coap --: réponse : val +return réponse : val +deactivate db + + +@enduml \ No newline at end of file diff --git a/puml/utilisation_classique_transmition.puml b/puml/utilisation_classique_transmition.puml new file mode 100644 index 0000000..5b2a7c3 --- /dev/null +++ b/puml/utilisation_classique_transmition.puml @@ -0,0 +1,39 @@ +@startuml +database DB as db + +box "Superviseur COAP" +participant "Optimiseur" as opti +participant "Réseau de\nneurrones" as NN +participant "Buffer\nd'expérience" as buffer +participant "Statisticien" as stat +end box + +box "Client COAP" +boundary "Handle CoAP" as h_coap +queue "File d'attente" as file +participant "Gestionaire des\nretransmitions" as gest +boundary "UDP socket" as udp +end box + +boundary "reseau de\ncapteurs" as capt + + + +group while [true] +-> opti ++: déclanchement périodique +buffer -> opti : expérience +NN -> opti : état du NN +opti -> opti : optimisation du NN +opti -> NN --: nouveaux poids + +loop (i=0; i<1000; i++) +-> stat ++: déclanchement périodique +stat -> buffer : nouvelle transition +stat -> NN --: nouvel état +NN -> gest --: nouveau RTO + +end +end + + +@enduml \ No newline at end of file diff --git a/rapport.bib b/rapport.bib index b4b0fda..def2b7a 100644 --- a/rapport.bib +++ b/rapport.bib @@ -8,7 +8,7 @@ issn = {1913-3715, 1913-3723}, doi = {10.4236/ijcns.2011.48060}, file = {/home/leopold/snap/zotero-snap/common/Zotero/storage/H8M4DAE6/Ahmed et Mohamed - 2011 - Fairness Aware Group Proportional Frequency Domain.pdf}, - journal = {International Journal of Communications, Network and System Sciences}, + journal = {IJCNS}, number = {08} } @@ -215,7 +215,7 @@ doi = {10.1109/TNSE.2018.2835758}, abstract = {Next generation network access technologies and Internet applications have increased the challenge of providing satisfactory quality of experience for users with traditional congestion control protocols. Efforts on optimizing the performance of TCP by modifying the core congestion control method depending on specific network architectures or apps do not generalize well under a wide range of network scenarios. This limitation arises from the rule-based design principle, where the performance is linked to a pre-decided mapping between the observed state of the network to the corresponding actions. Therefore, these protocols are unable to adapt their behavior in new environments or learn from experience for better performance. We address this problem by integrating a reinforcement-based Q-learning framework with TCP design in our approach called QTCP. QTCP enables senders to gradually learn the optimal congestion control policy in an on-line manner. QTCP does not need hard-coded rules, and can therefore generalize to a variety of different networking scenarios. Moreover, we develop a generalized Kanerva coding function approximation algorithm, which reduces the computation complexity of value functions and the searchable size of the state space. We show that QTCP outperforms the traditional rule-based TCP by providing 59.5\% higher throughput while maintaining low transmission latency.}, file = {/home/leopold/snap/zotero-snap/common/Zotero/storage/DBTMF6SI/Li et al. - 2019 - QTCP Adaptive Congestion Control with Reinforceme.pdf}, - journal = {IEEE Transactions on Network Science and Engineering}, + journal = {IEEE Trans. Netw. Sci. Eng.}, language = {en}, number = {3} } @@ -280,6 +280,18 @@ journal = {International Journal of Big Data Intelligence} } +@techreport{rheeCUBICFastLongDistance2018, + title = {{{CUBIC}} for {{Fast Long}}-{{Distance Networks}}}, + author = {Rhee, I. and Xu, L. and Ha, S. and Zimmermann, A. and Eggert, L. and Scheffenegger, R.}, + year = {2018}, + month = feb, + pages = {RFC8312}, + institution = {{RFC Editor}}, + doi = {10.17487/RFC8312}, + language = {en}, + number = {RFC8312} +} + @techreport{shelbyConstrainedApplicationProtocol2014, title = {The {{Constrained Application Protocol}} ({{CoAP}})}, author = {Shelby, Z. and Hartke, K. and Bormann, C.}, @@ -315,7 +327,7 @@ issn = {2151-1950, 2151-1969}, doi = {10.4236/jgis.2014.65036}, file = {/home/leopold/snap/zotero-snap/common/Zotero/storage/39HVB5X5/Spivak et al. - 2014 - Comparison of Digital Maps Recognition and Quanti.pdf}, - journal = {Journal of Geographic Information System}, + journal = {JGIS}, number = {05} } @@ -363,7 +375,7 @@ issn = {1949-2421, 1947-3826}, doi = {10.4236/cn.2013.53B2056}, file = {/home/leopold/snap/zotero-snap/common/Zotero/storage/SHNR6SNE/Zhao et al. - 2013 - Resource Allocation for OFDMA-MIMO Relay Systems w.pdf}, - journal = {Communications and Network}, + journal = {CN}, number = {03} } @@ -376,7 +388,7 @@ issn = {2329-3284, 2329-3292}, doi = {10.4236/ojbm.2020.82046}, file = {/home/leopold/snap/zotero-snap/common/Zotero/storage/KHZSTVS8/Zheng - 2020 - Research on Airport Taxi Resource Allocation Based.pdf}, - journal = {Open Journal of Business and Management}, + journal = {OJBM}, number = {02} } diff --git a/rapport.tex b/rapport.tex index 184e151..95f2d29 100644 --- a/rapport.tex +++ b/rapport.tex @@ -1,7 +1,7 @@ % !TEX encoding = UTF-8 Unicode % -*- coding: UTF-8; -*- % vim: set fenc=utf-8 -\documentclass[a4paper,11pt,french]{article} +\documentclass[a4paper,12pt,french]{article} \usepackage{ensps} @@ -54,6 +54,14 @@ \newcommand{\coap}{\gls{coap}} +\newglossaryentry{cocoa} +{ + name=Cocoa+, + description={Evolution de \coap{}, protocol de la couche \osi{} 7} +} + +\newcommand{\cocoa}{\gls{cocoa}} + \newglossaryentry{keras} { name=keras, @@ -102,6 +110,14 @@ \newcommand{\CC}{\gls{cc}} +\newglossaryentry{cca} +{ + name=CCA, + description={Algoritme de controle de congestion} +} + +\newcommand{\CCA}{\gls{cca}} + \newglossaryentry{mac} { name=MAC, @@ -128,6 +144,8 @@ \newcommand{\qlearn}{Q-learning} \newcommand{\dqlearn}{Deep-Q-learning} +\newcommand{\cubic}{TCP-Cubic} +\newcommand{\newreno}{TCP-NewReno} \newglossaryentry{rtt} { @@ -298,6 +316,8 @@ L'interface en question est une interface \emph{RestFull} :\begin{itemize} \end{itemize} En plus de ses méthodes qui ont leurs equivalents chez \http{}, il y a la methode OBSERVE. Si un client demande à observé une ressource sur un serveur, le serveur lui enveré automatiquement la ressource à chaque fois que elle est modifiée. +Les ressources utilisé avec \coap{} ne sont pas les même que en \http{}, on ne cherche pas à transféré une suite de centaine voir millier de paquet, mais un seul. +Mais à la congestion classique se rajoute le risque de perte de paquet à cause des liaisons physique, car les infratructures sans fils sont soumise à de la perte aléatoire. D'un point de vu technique, \coap{} a la particularité de reposé sur l'\udp{} et non le \tcp{}. Ainsi le \CC{} est réalisé par la couche applicative et non la couche transport. @@ -308,6 +328,8 @@ Lorsque l'on envoie un message, il peut etre de deux type : \begin{itemize} \end{itemize} Les messages NCON ne sont donc pas réenvoyé si ils sont perdu à cause de la congestion, car il n'y a pas de moyen de la détecter. Cela peut ne pas etre un problème pour certaine application. +Il y a aussi les messages de type ACK, qui aquite les message CON. +L'association entre le message CON et ACK se fait grace à un token (ACK[0xe4] aquite le message CON[oxe4]). Ses derniers temps, des nouvelles solutions bassé sur l'apprentissage machine se sont développé pour le \CC{} en \tcp{}. Notre problèmatique est donc de savoir si de tel solutions sont applicable à \coap{}. @@ -330,7 +352,7 @@ La methode de base pour construire cette fonction est le \qlearn{}. C'est un possecus itératif où l'ont va construire un tableau (la Q-table), noté $\mathbb{Q} : \mathbb{S} \times \mathbb{A} \rightarrow \R$ associant à chaque couple observation/action une valeur. On parcours l'environement et à chaque pas de temps, on met à jour la valeur de $\mathbb{Q}(s_t, a_t)$ grace à la formule suivante : \begin{equation} \mathbb{Q}\left(s_t, a_t \right) := \left(1 - \alpha\right) \cdot \mathbb{Q}\left(s_t, a_t \right) + \alpha \cdot \left( r_t + \gamma \cdot max _ {a \in \mathbb{A}} \mathbb{Q} \left((s_{t+1}, a \right) \right) - \label{qlearn_update} + \label{eq:qlearn_update} \end{equation} Les deux paramètre sont : \begin{itemize} \item $\alpha$ le taux d'apprentissage, c'est à dire à quelle point les nouvelles informations écrasent les anciennes, @@ -341,28 +363,239 @@ En réalité, on fait des actions aléatoire avec une probabilité faible pour e Deux des limites de cette solution sont la taille en mémoire d'un tel tableau quand les ensembles $mathbb{S}$ et $\mathbb{A}$ sont grands, et le temps qu'il faut pour que la convergence des valeur du tableau ais lieu. Pour palié à cela, on peut approximé la fonction par un réseau de neurrone, c'est le principe du \dqlearn{}. -\section{État de l'art} +\section{État de l'art\label{part_cc}} +Le \CC{} est un problème qui date du début des réseaux. +La première version de \tcp{} date de 1983, mais de nouveau \CCA{} sont régulièrement publiés et mis en production. +Comme ordre d'idée, le \CCA{} le plus utilisé de nos jour, \cubic{}, a été inclue dans Linux en 2006, dans MacOS en 2014 et dans Windows en 2017. +Chaque \CCA{} a des avantage et inconvénient, et ne fait pas le même compromis entre delai et débit. + +\begin{figure}[htp] + \centering + \includegraphics[width = 0.8\textwidth]{png_img/comp_tcp_xiao.png} + \caption[Comparaison des \CCA{} en \tcp{}]{Comparaison de différents \CCA{} en \tcp{}. Figure issu de \cite{xiaoTCPDrincSmartCongestion2019}.} + \label{fig:comp_cca_tcp} +\end{figure} \subsection{Comment gère-t-on la congestion en \tcp{} ?} -\subsection{Influences de l'apprentissage machine dans le contrôle de congestion ?} +Le \tcp{} suppose que il y a un grand nombre de paquet à transmettre. +Ainsi on décide d'une fenetre de congestion, c'est à dire le nombre de paquet en attente d'aquitement. +Si un paquet n'est pas aquité avant la fin d'un \rto{} fixe, on le réenvoie. +Les \CCA{} on pour rôle de gérer la taille de la fenetre, et le \rto{} pour optimisé la connexion. -\subsection{Comment gère-t-on la congestion avec l’implémentation classique de \coap ?} +Les \CCA{} de \tcp{} sont nombreux (une classification partiel est lsible dans \cite{haileEndtoendCongestionControl2021}), je ne vais donc pas tous les décrire. +Le principe de base de la plupart des algoritmes est l'AIMD (additive-increase-multiplicative-decrease). +Par exemple \newreno{}, le prédececeure de \cubic{}, augmente la taille de la fenetre par pas de $1$ tout les \rtt{}, et multiplie la taille par $\frac{1}{2}$ en cas de détéction de congestion. +L'évolution proposé par \cubic{} est de ne pas venir croitre linéairement, mais de suivre une courbe cubique pour revenir en douceur à la taille de fenetre qui avait causé la congestion. +Dans les deux cas, à chaque retransmission d'un message, le \rto qui lui est accordé double. +D'autre \CCA{} utilise les variations du \rtt{} pour estimer l'état de congestion du réseau. +Le \rtt{} est le temps qui sépparre l'émittion d'un paquet de la reception de l'aquitement. +Le \rtt{} est composé de deux parties : \begin{itemize} + \item le temps de propagation, qui correspont au temps que met le signal à faire le trajet, il est incompressible (sauf changement de route), + \item le temps d'attente dans les queues, qui est le temps passé dans les queues des différents routeurs et qui dépend dirrectement de la congestion du réseau. +\end{itemize} +Ainsi l'augmentation du \rtt{} est souvent signe que le réseau se congestionne. +Mais interpréter ces varriation de \rtt{} et prendre la décision adécoite est trop complexe pour un algoritme classique, et certain on déjà proposé des solutions utilisant de l'IA \cite{xiaoTCPDrincSmartCongestion2019,liQTCPAdaptiveCongestion2019} . + +\subsection{Comment gère-t-on la congestion avec l’implémentation classique de \coap{} ?} + +Pour le \coap{}, la gestion de la congestion est différente, car on utilise une fenetre unitaire, c'est sur le \rto que se fait le travail. +Dans la version de base, le \rto{} de base est tiré aléatoirement entre $2 s$ et $3 s$, et est doublé à chaque retransmission. +C'est un protocole simple mais peu performant, car si le delai de transition est déjà de l'ordre du \rto, alors il risque d'avoir des retransmission systèmatique. + +Une des évolution du \coap{} est \cocoa{}, qui ne change que le \CCA{}\cite{ancillottiRTTBasedCongestionControl2018}. +C'est une algorithme inspiré de FAST-\tcp{} et Compound-\tcp{}. +Ici on met en place une estimation du \rtt{} à partir de la mesures du \rtt{} de chaque message. +A chaque reception d'un nouveau \rtt{} $r$, on met à jour l'estimation grace aux formules suivantes : +\begin{equation} + \begin{aligned} + RTT_S &:= \alpha_S r + \left( 1 - \alpha_S \right) \cdot RTT_S\\ + RTT_L &:= \alpha_L r + \left( 1 - \alpha_L \right) \cdot RTT_S\\ + RTTVAR_L &:= \beta_L \left\| RTT_L - r \right\| + \left( 1 - \beta_L \right) \cdot RTTVAR_L + \end{aligned} + \label{eq:cocoa:estimateur} +\end{equation} +Ensuite, on crée une fonction $T$ permetant de prendre une decision : +\begin{equation} + T\left( \gamma \right) = RTT_L + \gamma RTTVAR_L + \label{eq:cocoa:decision} +\end{equation} +On a donc $4$ cas pour prendre un décision : \begin{itemize} + \item $RTT_S < T\left( -1 \right)$ : pas de congestion, on peut etre beaucoup plus agressif, + \item $T\left( -1 \right) \le RTT_S < T\left( +1 \right)$ : congestion faible, on se trouve à un point de fonctionement correct, on ne change rien, mais on peut aussi etre un peu plus agressif si besoin, + \item $T\left( +1 \right) \le RTT_S < T\left( +2 \right)$ : congestion normal, la congestion augmente, il faut etre moins agressif pour ne pas congestioner le réseau, + \item $T\left( +2 \right) \le RTT_S$ : congestion importante, le réseau est totalement congestioner, il faut etre beaucoup moins agressif. +\end{itemize} +La seule contrainte est que $\alpha_S \gg \alpha_L$. +Le choix des autres valeurs, les seuils est les actions prisent sont choisit empiriquement, on ne sais pas si elles sont optimale. + +\subsection{Comment l'apprentissage machine prend place dans les \CCA{}?} +Pour palier à ces problèmes, plusieurs \CCA{} utilisant de l'apprentissage machines sont apparut : Q-\tcp{}\cite{liQTCPAdaptiveCongestion2019}, \tcp{}-Drinc\cite{xiaoTCPDrincSmartCongestion2019}\dots +L'idée derriere ses algorithme est de délégé la prise de decision à une IA qui serais capable de reconnaitre les signe de la congestion bien plus efficassement que une algorithme "fait-main" classique. +Plusieurs problèmatique se présentent : \begin{itemize} + \item La modélisation de l'environement : \begin{itemize} + \item quel est $\mathbb{S}$, c'est à dire comment représenter l'environement pour l'acteur, + \item quel est $\mathbb{A}$, c'est à dire qu'es ce que l'acteur doit donner comme consigne, + \item quel est $r_t$, c'est à dire qu'es ce qu'une bonne action + \end{itemize} + \item mais aussi des problèmes de compétition multi-agents: \begin{itemize} + \item comment etre sûr que les ressource réseau sont équitablement répartie entre les agents, + \item comment etre sûur que les agent IA ne vont pas perturber les agents non-IA, + \end{itemize} + \item ainsi que des problèmes d'implémentation, car tout cela toi tourner sur une machine très peu puissante et incapable de faire des calcul complexe. +\end{itemize} +Les intégration de l'IA dans le \CC{} n'est encore qu'a l'état de test, de balbutiment, et pourtant des résultats notables et encouragant sont déjà disponible, voir figure \ref{fig:comp_cca_tcp}, ce qui nous motive à tenter de développer des solutions similaire pour \coap{}. \section{Modélisation choisit} +La première étape est de modélisé le système. +Pour la modélisation, je m'appuis sur la modélisation de \cite{xiaoTCPDrincSmartCongestion2019}. \subsection{Quels cas d'utilisations nous est le plus favorable ?} +Pour notre travail, on se positionne dans une situation où un serveur centrale puissant voudrait récupérer des données sur un ensemble de capteur. +Les contraites pour les codes s'éxécutant sur le serveur centrale (un serveur cloud généralement) et sur les capteur sont radicalement différentes. +Le cloud peut exécuter le code qu'il veux avec beaucoup de puissance, alors que les capteur doivent se limité au maximum. +Le could à acces au données de toutes les connexion, alors que les capteurs n'ont à priori que les données de leur connexion. +On choisit de se placer dans le cas où on intéragie avec un nombre fixe de capteur, $N$. + +\begin{figure}[htp] + \centering + \includegraphics[width=0.5\textwidth]{puml/cas_utilisation_coap.png} + \caption[Diagramme de séquance de transaction \coap{}, cas 1]{Diagramme de séquance entre le capteur et le serveur \coap{} avec déclanchement de la transaction par le capteur.} + \label{fig:seq_coap:1} +\end{figure} +\begin{figure}[htp] + \centering + \includegraphics[width=0.5\textwidth]{puml/cas_utilisation_coap_001.png} + \caption[Diagramme de séquance de transaction \coap{}, cas 2]{Diagramme de séquance entre le capteur et le serveur \coap{} avec déclanchement de la transaction par le cloud, et réponse dans l'aquitement.} + \label{fig:seq_coap:2} +\end{figure} +\begin{figure}[htp] + \centering + \includegraphics[width=0.5\textwidth]{puml/cas_utilisation_coap_002.png} + \caption[Diagramme de séquance de transaction \coap{}, cas 3]{Diagramme de séquance entre le capteur et le serveur \coap{} avec déclanchement de la transaction par le could, et réponse dans un message sépparré.} + \label{fig:seq_coap:3} +\end{figure} + +Lorsque on veux établir une connexion avec un capteur, il y a trois cas de figure, il nous faut donc choisir celui qui nous avantage le plus. Le cas 1 (figure \ref{fig:seq_coap:1}) permet de réagir à un evenement, mais ne demande au capteur de prendre le rôle de gestionaire du \CC{}, ce qui n'est pas le plus simple. +Le cas 2 (figure \ref{fig:seq_coap:2}) et 3 (figure \ref{fig:seq_coap:3}) permet tout deux au cloud de prendre en charge le \CC{}, mais le cas 3 demande l'échange de bien plus message, il sature plus vite le réseau. +On choisit dans de travailler dans le cas 2, qui permet d'avoir à la fois toutes les informations au niveau de l'acteur, et de la puissance de calcul. +Pour ce qui est de la gestion des evenement, on peu imaginé que le could envoie régulièrement au capteur des consigne siple pour le \CC{}, même si nous n'allons pas taiter cette problèmatique. \subsection{Quelle sont les variables que nous pouvons observer ?} +La grandeur la plus simple à se représenter est le \rtt{}. +Chaque envoie de message permet de récupérer un echantillion de \rtt{}. +Mais un problème se pose lorsque le \rto{} de base est plus faible que le \rtt{} à cause des retransmissions : on ne sais pas si l'aquitement vient de l'original ou de la rentransmition, car ils ont le même token. +Par exemple, dans la figure \ref{fig:temp_coap:valide}, on à sans ambiguité un \rto{} de $25$, mais dans la figure \ref{fig:temp_coap:invalide}, le \rto{} semble etre $5$ alors que il est de $30$. +Ce problème peut etre contourné en changeant le token dans les retransmissions, mais nous ne metterons pas en place cette solution pour l'instant. + +\begin{figure}[htp] + \centering + \includegraphics[scale = 0.7]{puml/temporal_transaction_valide.png} + \caption{Diagramme temporelle d'un transaction sans ambiguité du \rtt{}.} + \label{fig:temp_coap:valide} +\end{figure} + +\begin{figure}[htp] + \centering + \includegraphics[scale = 0.7]{puml/temporal_transaction_invalide.png} + \caption{Diagramme temporelle d'un transaction avec ambiguité du \rtt{}.} + \label{fig:temp_coap:invalide} +\end{figure} + +L'autre grandeur que l'ont peur facilement mesuré est le nombre de retransmission de chaque message. +C'est retransmission peuvent etre dû à la congestion, mais aussi à des erreures de routage ou des couches réseau physique. + \subsection{Comment représenter un état du système ?} -\cite{jainQuantitativeMeasureFairness1998} + +Une fois que l'on a mesurer une grandeur, il faut la transmetre à l'acteur. +Le premier problème est que l'acteur vois un temps discontinu, alors que les nouvelles mesures arrive à des instants irréguliers. +On choisit donc de couper le temps en une série d'interval de longueur fixe. +Dans ces intervals, on supose que l'état du réseau est constant, et les valeur utilisé par le \coap{} le sont aussi. +Il faut prendre une durée de l'interval qui soit plus longue que le \rtt{}, car ainsi on ne se retrouve pas dans un cas limite où un message part pendant l'intervale $t$, avec les consignes de l'instant $t$, mais arrive dans l'instant $t+1$ et influe $s_{t+1}$ ou lieu de $s_t$. +Mais il faut aussi que cette durée ne soit pas trop importante, car on ne change les consignes que à la fin de ces intervales. +On nomme cet interval "interval de controle". + +De plus, on travail sur un réseau de capteur qui renvoie leurs informations à un serveur cloud unique. +Puisque le serveur cloud centralise toutes les connexions, on choisit d'avoir un seul agent, qui donne des consignes pour toutes les connexions. + +Pour la suite, on appel "serveur \coap{}" la partie de programme s'executant sur les capteurs, et "clients \coap{}" les programmes s'éxecutant sur le serveur cloud afin de récupérer les données des capteurs. +On remarque aussi que on ne fait pas la différence entre l'état du réseau et l'observation que l'on en fait. + \subsubsection{État d'un client seul.} +Pour commencer, il faut que chaque client \coap{} soit capable de représenter sa connexion. +Pour cela, on dispose de : \begin{itemize} + \item le nombre de messages envoyer penant l'interval de control, + \item et pour chaque message : \begin{itemize} + \item le nombre de retransmission, + \item le \rtt{} mesurer. + \end{itemize} +\end{itemize} +On construit ensuite les valeurs suivantes : \begin{itemize} + \item $RTT_{min}$, le minimum du \rtt{} pendant les $n_m$ derniers interval de control, + \item $\overline{RTT}$, la moyenne du \rtt{} sur l'interval de control, + \item $\eta = \frac{RTT_{min}}{\overline{RTT}}$ + \item $\nu = \frac{n_{retransmission}}{n_{message}}$ + \item $VARRTT = \frac{RTT_S}{RTT_L}$ à partir des deux valeurs suivantes, que on met à jour à chaque nouvel mesure du \rtt{} $r$ :\begin{align*} + RTT_S &:= \alpha_S \cdot r + \left( 1 - \alpha_S \right) \cdot RTT_S \\ + RTT_L &:= \alpha_L \cdot r + \left( 1 - \alpha_L \right) \cdot RTT_L \\ + \alpha_S &\gg \alpha_L +\end{align*} +\end{itemize} + +Ces valeurs sont plus représentative que les mesures brutes. +$RTT_{min}$ permet d'estimé le temps de propagation des messages (on rappel que $RTT = \tau_{propagation} + \tau_{queue}$). +Ainsi, $\eta$ permet d'estimer le pourcentage du temps passer dans les queues par les messages au cours de leur voyage. +Lorsque $\eta$ est proche de $1$, c'est que les queues sont presque vide, et losque il est proche de $0$, c'est qu'elle represente la majorité de temps de trajet, ce qui est signe de congestion. +$\nu$ represente le taux de redondane des messages, il doit etre le plus faible possible. +$\nu$ élevé signifi que on revoie des messages et donc que les consignes ne sont pas adapté. +Mais $\nu$ est aussi influancé par les défauts du réseau, donc ce n'est pas un indicateur parfait. +$VARRTT$ permet d'estimer l'évolution du \rtt{} en comparant deux filtrages des \rtt{} sur des echelles différentes. +$VARRTT > 1$ indique que la tendance est à la hausse des \rtt{}, et donc que la longueur des queues augmente, et $VARRTT < 1$ que la tendance est à la baisse. +Il faut tout de même que le filtrage $RTT_S$ se fasse sûr plusieurs echantillions du \rtt{} (donc $\alpha_S \sim 0.1$) car la mesure du \rtt{} est très bruité. + +Une fois ces valeur calculer, on construit le vecteur suivant, qui represente l'état du client $i$ : \begin{equation} + s ^ {\left( i \right)}= \begin{bmatrix} \nu\\ \eta \\ VARRTT \end{bmatrix} +\label{eq:modele:vec} +\end{equation} \subsubsection{État de l'ensemble des clients.} +Une fois que chaque client a generé sont vecteur, il suffit de les concaténés pour crée une matrice où chaque ligne représente une des trois valeurs, et chaque colonne un client. +\begin{equation} + S = \begin{bmatrix} s ^ {(0)} & \cdots & s^{(N)} \end{bmatrix} + \label{eq:modele:mat} +\end{equation} +L'avantage d'une tel matrice est que on pourra utiliser une convolution dans le réseau de nerrone. +Une autre possibilité, que je n'ais pas pu tester est de concaténer les matrices de plusieur echantillion de temps successif pour crée un tenseur à trois dimension, qui permetrait d'avoir plus d'informations sur l'évolution temporelle des valeurs. + +\subsection{Comment l'acteur influance le client \coap{} ?} +La principales valeur permetant de controler le comportement du client est le \rto{}. +On choisit une solution où $\mathbb{A} = \R ^ N$. +Si on note $c_t$ le vecteur des $N$ \rto{} à l'instant $t$, et $a_t$ le vecteur d'action généré par l'acteur, alors : +\begin{equation} + c_{t+1} ^ {\left( i \right) }= c_t ^{\left( i \right)}\cdot \begin{cases} + 1 + a _ t ^ {\left( i \right)} & \text{si } a _ t ^{\left( i \right)} \ge 0 \\ + \frac{1}{1 - a _ t ^ {\left( i \right)}} & \text{si } a _ t ^{\left( i \right)} < 0 + \end{cases} +\end{equation} +L'effet de cette action est visible dans la figure \ref{fig:modele:action}. +Cette action permet d'avoir la capacité de réagir rapidement avec des grandes actions, mais aussi d'avoir de la précision pour s'ajuster autour du point de fonctionement. + +\begin{figure}[htp] + \centering + \includegraphics[width = 0.7\textwidth]{png_img/gain_action.png} + \caption[Modification du \rto{} par l'action.]{Modification du \rto{} par l'action, pour un seul client, en échelle logaritmique.} + \label{fig:modele:action} +\end{figure} + +D'autre choix sont possibles, par exemple $\mathbb{A} = \left\lbrace 0.1, 0.5, 0.8, 1, 1.25, 2, 10 \right\rbrace ^ N$, et $c ^ {\left( i \right))} _{t+1} c_t ^ {\left( i \right))} \cdot a _ t ^ {\left( i \right))} $ \subsection{Comment quantifier la réussite de l'agent ?} +Une fois que l'on sais représenter l'état du réseau, il faut déterminer si cette état est favorable ou non. +Pour cela, il faut se demander ce que l'on veux comme caractéristique + +\subsection{Quel type d'agent utilisé ?} \subsection{Comment récolté de l'expérience ?} @@ -392,7 +625,7 @@ Pour palié à cela, on peut approximé la fonction par un réseau de neurrone, \subsection{Multiplication des clients} -\subsection{Multiplication des \rasp} +\subsection{Multiplication des \rasp{}} \clearpage