Compare commits
3 commits
51a9d99d78
...
6d608a1f27
Author | SHA1 | Date | |
---|---|---|---|
6d608a1f27 | |||
cde393c033 | |||
04b13df5dc |
3 changed files with 680 additions and 0 deletions
185
content/projet_programmation/9_principes_SOLID/index.md
Normal file
185
content/projet_programmation/9_principes_SOLID/index.md
Normal file
|
@ -0,0 +1,185 @@
|
|||
---
|
||||
title: "PdP: principes SOLID"
|
||||
date: 2024-03-28
|
||||
tags: ["besoins", "UML", "developpement logiciel"]
|
||||
categories: ["Projet de programmation", "Cours"]
|
||||
---
|
||||
|
||||
C'est un ensemble de principe souvent associés à la programmation objet. Ils
|
||||
s'appliquent cependant à toute forme d'architecture. Il sont au nombre de 5 :
|
||||
|
||||
* principe d'inversion des dépendances que nousa vons déjà vu précédement;
|
||||
* principe de responsablité unique;
|
||||
* principe de ségrégation d'interfaces;
|
||||
* principe ouvert/fermé
|
||||
* principe de substitution (de *Liskov*)
|
||||
|
||||
## Inversion des dépendances
|
||||
|
||||
Utiliser des interfaces comme intermédiaire afin d'inverser les dépendances. LEs
|
||||
interfaces utilisées comme intermédiaires permettent de faire écran (masquer
|
||||
l'implementation). Elles permettent aussi de proteger les composants de la
|
||||
diffusion.
|
||||
|
||||
Dans sa **version stricte**, les interfaces ne portent que ce qui est
|
||||
nécessaire, mais ça peut être lourd (multiplication des interfaces). Il est donc
|
||||
plus courant (et désirable) de généraliser les interfaces.
|
||||
|
||||
## Responsablité
|
||||
|
||||
Il est question de décomposer pour maîtriser, mais aussi pour limiter les
|
||||
responsabilité des composants.
|
||||
|
||||
La **responsabilité d'un composant** est un rôle, un objectif, un comportement,
|
||||
un ensemble de services qu'il fournit et dont il est le garant. Il faut alors
|
||||
favoriser la contruction de composants avec un nombre réduit de responsabilité.
|
||||
|
||||
Dans sa version radicalisé (Martin, 2003), il est même question de favoriser les
|
||||
composant avec **une seule responsabilité**. Mais attention, il ne faut pas
|
||||
appliquer ce principe jusqu'à emietter complètement une architecture (code
|
||||
*ravioli*).
|
||||
|
||||
Une responsabilité ne se résume pas à une seule fonction (ou une seule action)
|
||||
mais plutôt à un ensemble cohérent de fonctions / actions. Voici les critères
|
||||
permettant de la caractériser une responsabilité unique:
|
||||
|
||||
* être décrite simplement en lien avec le domaine du programme (et en langage
|
||||
naturel);
|
||||
* être associé à un haut niveau de cohésion dans le composant (ce qui signifie
|
||||
plus de dépendance entre ses éléments);
|
||||
* être identifiée par rapport à la manière récurrente dont le composant est
|
||||
utilisé par les autres composants (féquement utilisé pour **tout** ce qu'il
|
||||
propose);
|
||||
* être associé à sa raison principale la plus probable d'être modifiée (une
|
||||
seule raison principale d'évoluer).
|
||||
|
||||
### Son anti-pattern juré: le **blob**
|
||||
|
||||
C'est l'inverse de la responsabilité unique : un composant fourre-tout qui
|
||||
centralise beaucoup de responsabilité différentes et entourré de composants qui
|
||||
ne contiennent que des données ou des processus simples.
|
||||
|
||||
|
||||
## Ségrégation d'interfaces
|
||||
|
||||
Nous avons vu que la taille d'une dépendance entre deux composants est
|
||||
caractérisée par la quantité d'information qui transite entre eux. nous avonx vu
|
||||
que nous devons avant tout les minimiser.
|
||||
|
||||
Le principe de ségrégation des interfaces est le principe selon lequel il faut
|
||||
favoriser la construction de composants dont les dépendances correspondent à
|
||||
ce qu'ils utilisent réellement (ni plus, ni mois). Nous parlons ici d'interfaces
|
||||
au sens large, mais au sens d'interfaces de classes.
|
||||
|
||||
Il est donc parfois nécessaire de décomposer pour l'appliquer, quitte à
|
||||
recomposer ensuite.
|
||||
|
||||
## Ouvert / Fermer
|
||||
|
||||
Pour tout logiciel, des transformations et des évolutions seront nécessaire et
|
||||
appliquées. Il sont dit *ouverts*
|
||||
|
||||
Il est aussi préférable de ne pas toucher à ce qui fonctionne bien et est
|
||||
utilisé. Ceci pourrait pertuber un écosystème fragile. C'est la partie *fermée*.
|
||||
Nous préservons ainsi son fonctionnement, les liens entre les composants, les
|
||||
interfaces, les tests etc.
|
||||
|
||||
Pour faire évoluer notre logiciel snas pour autant toucher aux composants
|
||||
fonctionnels, nous avons alors plusieurs pistes:
|
||||
|
||||
* utiliser l'héritage et ainsi ne pas toucher au composant de base fonctionnel;
|
||||
* utiliser les interfaces pour, par exemple, de nouvelles implémentations
|
||||
(réalisations multiples)
|
||||
* utiliser la généricité, l'usage de composants paramétrés permettant de les
|
||||
adaptés selon l'instanciation de ces partamètres tout en les préservant;
|
||||
* utiliser les plugins.
|
||||
|
||||
Il faut donc favoriser la construction de composants ouverts-fermés par rapport
|
||||
aux changements les plus probables, ouverts à l'extension et fermé à la
|
||||
modification. Toute la difficulté ici est d'obtenir des composants
|
||||
ouverts-fermés facile à faire évoluer.
|
||||
|
||||
## Substitution de Liskov
|
||||
|
||||
Dans une architecture logicielle, il doit être possible d'effectuer des
|
||||
remplacement localiser de composants de manière à préserver son fonctionnement.
|
||||
La **substitution** est le remplacement d'un élément par un autre similaire
|
||||
indépendement du contexte (*context-free*) et sans induire d'autres changements.
|
||||
Il faut alors passer par une spécfication, ainsi la variation se fait sur la
|
||||
manière de l'implémenter.
|
||||
|
||||
Il faut alors favoriser la **construction de composants spécifiés** de manière à
|
||||
pouvoir les substituer. Il faut alors faireparticulièrement attention à la
|
||||
**précision de la spécification** en fonction du contexte.
|
||||
|
||||
### substitution par sous-typage
|
||||
|
||||
Un composant substituant sous une spécification \\(S\\) peuvent implémenter plus
|
||||
de propriété que requis par \\(S\\) sans pour autant metter à mal les propriétés
|
||||
de substitution. En clair *Qui peut le plus peut le moins*.
|
||||
|
||||
Une spécification \\(S'\\) est compatible avec une autre \\(S\\) (noté
|
||||
\\(S' <: S\\)) si on peut déduire toutes les propriété de \\(S\\) à partir de
|
||||
\\(S'\\) et donc si \\(S' \implies S\\).
|
||||
|
||||
De manière générale, lorsque \\(S' <: S\\) tout composants qui implémente
|
||||
\\(S'\\) implémente aussi \\(S\\). Ainsi si on considère les spécifications
|
||||
comme des types, la compatibilité définis ce qu'est le **sous-typage**.
|
||||
|
||||
L'application de la substitution requiert une bonne connaissance de ce qui
|
||||
engendre des compatibilités.
|
||||
|
||||
### compatibilité
|
||||
|
||||
La compatibilité entre **spécifications de fonctions** dépend en particulier de
|
||||
leurs domaines d'entrée et de sorties. La compatibilité entre spécfications de
|
||||
fonctions est donc :
|
||||
|
||||
\\[
|
||||
(In' \rightarrow Out') <: (In \rightarrow Out')\\\
|
||||
\text{si } In <: In' \\\
|
||||
\text{et } Out' <: Out
|
||||
\\]
|
||||
|
||||
Donc:
|
||||
|
||||
* \\(In'\\) a un ensemble d'instances **égal ou plus grand** que \\(In\\);
|
||||
* \\(Out'\\) a un ensemble d'instance **égal ou plus petit** que \\(Out\\);
|
||||
|
||||
Cette règles relatives aux fonctions peuvent se généraliser **aux
|
||||
conditions**:
|
||||
|
||||
* les **préconditions** \\(Pre\\) d'une spécification \\(S\\) sont les
|
||||
propriétés de notre spécification qui doivent être implémentées par un
|
||||
composant pour qu'ils soit exécuté, appliqué, activé.
|
||||
* les **postconditions** \\(Post\\) d'une spécification \\(S\\) sont les
|
||||
propriétés de notre spécification qui doivent être implémentées par les
|
||||
résultats, les services rendus, les effets obtenus d'un composant.
|
||||
|
||||
\\[
|
||||
(Pre', Post') <: (Pre, Post')\\\
|
||||
\text{si } Pre <: Pre' \\\
|
||||
\text{et } Post' <: Post
|
||||
\\]
|
||||
|
||||
autrement dit:
|
||||
|
||||
* les préconditions sont plus faible ou égale: **contravariance**;
|
||||
* les postconditions sont plus forte ou égale: **covariance**
|
||||
|
||||
### Vérification des substitutions
|
||||
|
||||
Liskov introduit des bugs s'il n'est pas bien appliqué. La compréhension est
|
||||
donc essentielle sinon des bugs liés aux intentions feront leur apparition, et
|
||||
ils sont souvent difficile à trouver.
|
||||
|
||||
### Principe de substitution de Liskov
|
||||
|
||||
Sans une architecture logicielle, il faut favoriser la construction de
|
||||
composants spécifiés au niveau adéquat de précision de manière à ce qu'ils
|
||||
soient substituables sous leur spécification de manière satisfaisante dans leur
|
||||
contexte de programmation.
|
||||
|
||||
Il faudra considérer alors le bon choix de précision des spécifications et la
|
||||
vérification des spécifications, des compatibilités ainsi que des aproximations
|
||||
qui y sont associés.
|
443
content/reseaux_protocoles/4_couche_reseau/index.md
Normal file
443
content/reseaux_protocoles/4_couche_reseau/index.md
Normal file
|
@ -0,0 +1,443 @@
|
|||
---
|
||||
title: "Réseaux et Protocole: couche réseau"
|
||||
date: 2024-02-21
|
||||
tags: ["OSI", "reseau", "control plane", "data plane"]
|
||||
categories: ["Réseaux et protocoles", "Cours"]
|
||||
mathjax: true
|
||||
---
|
||||
|
||||
Le but de cette partie et de comprendre ce qui se passe dans la couche réseaux
|
||||
matérialisée la quasi-totalité du temps par le **protocole IP**. Comme pour les
|
||||
autres couches vue jusqu'à présent, il est encore question **d'encapsulation**
|
||||
et de **décapsulation**.
|
||||
|
||||
C'est la couche qui se trouve dans les équipements *Internet* pour faire du
|
||||
**routage**: le *routeur* examine les entêtes des *paquets IP* afin de
|
||||
déterminer leur destination. Deux notions apparaissent alors:
|
||||
|
||||
* le **forwarding** qui consiste à récupérer les paquets sur une *interface* et
|
||||
les renvoyer vers une autre;
|
||||
* le **routage** qui consiste à déterminer la route de la source vers la
|
||||
destination (le chemin complet donc).
|
||||
|
||||
Dans ce chapitre nous aborderons les notions de **data plane**, **control plan**
|
||||
ou encore de **software defined network** (*SDN*).
|
||||
|
||||
## Le *data plane*
|
||||
|
||||
C'est la partie responsable du mouvement "réel" des données à travers les
|
||||
périphériques réseaux. La logique de routage est implémenter dans chacun des
|
||||
périphérique composant le réseau.
|
||||
|
||||
### Les routeurs
|
||||
|
||||
Pierre angulaire de l'acheminement des paquets. ils prenne des pacquets sur des
|
||||
interfaces en entrée qu'il redirigent vers des interfaces en corties en fonction
|
||||
de critères établis. En définitive chaque routeur est indépendant et composé
|
||||
d'un *data plane* et d'un *control plane* contenant la **table de routage**.
|
||||
|
||||
Pour schématiser, le *control plane* représente le logiciel et le *data plane*
|
||||
le matériel.
|
||||
|
||||
### Switch fabric
|
||||
|
||||
Le *data plane* se compose des ports en entrée et en sortie, au milieu se
|
||||
trouve la **switch fabric**. C'est cette partie qui est charger d'acheminer les
|
||||
paquets des entrées vers les sorties en fonction de ce que le *control plane*
|
||||
veut. Le temps de traitement d'un *datagramme* est de l'ordre de la nanoseconde
|
||||
[^traitement].
|
||||
|
||||
|
||||
[^traitement]: là ou pour le *control plane* c'est de l'ordre de la
|
||||
milliseconde. Chaque routeur est aussi responsable de son algorithme de
|
||||
routage.
|
||||
|
||||
#### ports d'entrée
|
||||
|
||||
|
||||
Ils reçoivent les *trames* de la couche liaison. Les entêtes de la couche
|
||||
reseaux sont extraites. Deux traitements sont alors possibles:
|
||||
|
||||
* forwarding basé sur **la destination** basé uniquement sur l'adresse de
|
||||
destination;
|
||||
* forwarding **généralisé** basé sur les valeurs de l'entête (une, quelques
|
||||
unes ou toutes).
|
||||
|
||||
Pour les correspondances sur les adresses, la règle du *longuest prefix match*
|
||||
s'applique. La correspondance se fait sur le prefixe le plus détaillé.
|
||||
|
||||
Le *switching rate* est donné par le rapport entre le nombre de paquet en entrée
|
||||
et en sorties. Idéaliement il est de 1 ou plus, ce qui signifie que les
|
||||
*datagrammes* en entrée sont traités directement. si ce nombre est inférieur à 1
|
||||
alors il y a engorgement à l'entrée. Dans ce cas les paquets sont mis en file
|
||||
d'attente dans un *buffer* (à l'entrée).
|
||||
|
||||
Il peuvent l'être aussi si les paquets reste bloqués pour diverses raison comme
|
||||
par exemple un *buffer* de sortie plein.
|
||||
|
||||
En cas de remplissage du *buffer* alors des **paquets peuvent être perdus**.
|
||||
|
||||
#### ports de sortie
|
||||
|
||||
Ils reçoivent les *datagrammes* en provenance de la *switch fabric* et les
|
||||
acheminent vers leur destination. Là encore nous avons un *buffer** où les
|
||||
paquets en attente sont stocké par exemple si les paquets arrivent plus vite que
|
||||
le lien ne peut les transmettre.
|
||||
|
||||
Ici encore des paquets pevent être perdus en cas de **buffer overflow**.
|
||||
|
||||
Les paquets évincés dépendent alors de la stratégie définie :
|
||||
|
||||
* `tail drop` pour refuser les nouveaux datagrammes qui arrivent;
|
||||
* `priority` pour supprimer des datagrammes en fonction des priorités.
|
||||
|
||||
#### Ordonnancement
|
||||
|
||||
Il est possible de définir l'ordonnancement des datagrammes et ainsi d;organiser
|
||||
une stratégie de priorisation en fonction des besoins. Le plus simple reste
|
||||
*FIFO* pour *First In First Out*[^FCFS] où ils sont acheminés en fonction de
|
||||
leur ordre d'arrivé.
|
||||
|
||||
Il est aussi possible d'ordonnancer suivant la priorité, par *round-robbin*, par
|
||||
poids attribués aux paquets ...
|
||||
|
||||
[^FCFS]: aussi appelle *First Come First Serve*.
|
||||
|
||||
### Le protocole IP
|
||||
|
||||
C'est un ensemble de règle définissant:
|
||||
|
||||
* un format de *datagrammes*;
|
||||
* l'adressage;
|
||||
* les conventions d'action sur les paquets;
|
||||
* le protocole ICMP (report d'erreur et signalement de routeurs);
|
||||
* les algorithme de sélection de chemins pour router les paquets (BGP, OSPF).
|
||||
|
||||
L'entête d'un datagramme IP fait 20 octets pour sa version v4, elle se compose:
|
||||
|
||||
* *version* du protocole (4 bits);
|
||||
* *longueur de l'entête* -- nombre de mots de 32 bits -- par défaut 5 (4 bits);
|
||||
* *type de services* (8bits);
|
||||
* *longueur totale du datagramme* en octets (16 bits);
|
||||
* données utilisé pour la fragmentation :
|
||||
* *identifiant* ( 16 bits);
|
||||
* *drapeau* (4 bits);
|
||||
* *décallage* (12 bits);
|
||||
* adresse *source* (32 bits);
|
||||
* adresse *destination* (32 bits);
|
||||
* *options* si besoin (32 bits);
|
||||
|
||||
#### L'adresse IP
|
||||
|
||||
C'est un identifiant codé sur 32 bits et attribué à chacune des interface des
|
||||
hôtes connectés au réseau. Une *interface* représente une connexion entre un
|
||||
hôte (ou un routeur) et un lien physique (issu de la couche liaison que nous
|
||||
verrons plus tard)
|
||||
|
||||
Il existe deux façons de classifier les adresse IP:
|
||||
|
||||
* L'adressage par classes représenté par des classes d'adresses allant de *A* à
|
||||
*E* en fonction des préfixes (1.0.0.0 - 126.255.255.255 pour la classe A par
|
||||
exemple);
|
||||
* *CIDR* pour *Classless Inter Domain Routing* ou les sous-réseaux peuvent
|
||||
avoir des adresses d'une taille arbitraire.
|
||||
|
||||
Dasn le second cas, les adresses sont découpés entre le préfixe de sous-réseau
|
||||
et la part réserver aux hôtes, par exemple
|
||||
|
||||
```text
|
||||
192.168.23.0/23
|
||||
```
|
||||
|
||||
Il existe aussi les adresses publiques et privées (utilisable dans un réseaux
|
||||
local). Pour ces dernière 3 classes sont disponibles:
|
||||
|
||||
* 10.0.0.0/8
|
||||
* 172.16.0.0/12
|
||||
* 192.168.0.0/16
|
||||
|
||||
##### le sous-réseau
|
||||
|
||||
Nous avons parlé de sous-réseaux, c'est la portion d'un réseau ou les hôtes
|
||||
peuvent se contacter les uns les autres sans que les datagrammes passent par
|
||||
un routeur. Ainsi chaque portion isolée d'un réseau est un sous-réseau. NMous
|
||||
pouvons alors créer des "îles".
|
||||
|
||||
|
||||
#### Obtenir une adresse IP
|
||||
|
||||
Plusieurs moyens sont à la disponision des administrateurs réseaux afin
|
||||
d'assigner une adresse IP à une interface.
|
||||
|
||||
* Adresse codée directement "en dur" sur l'interface via, par exemple, le
|
||||
fichier `/etc/network/interfaces`.
|
||||
* Assignée dynamiquement par un serveur *DHCP* *Dynamic Host Configuration
|
||||
Protocol*.
|
||||
|
||||
Pour ce dernier, voici les étapes:
|
||||
|
||||
1. l'hôte envoie un message de *broadcast* de type `DHCP discover`;
|
||||
2. les serveurs *DHCP* disponibles répondent avec le message `DHCP Offer` et
|
||||
fait une proposition;
|
||||
3. l'hôte répond avec avec un message `DHCP request` au serveur qu'il a retennu
|
||||
avec comme charge utile l'adresse IP qui lui a été proposée;
|
||||
4. le serveur retenu répond alors avec un message `DHCP ack`.
|
||||
|
||||
Le DHCP fait bien plus qu'assigner des adresses IP, il peut aussi définit
|
||||
l'adresse de la passerelle (routeur de premier niveau), les adresses des
|
||||
serveurs de nom, le masque de réseau etc.
|
||||
|
||||
### NAT, *Network Address Translation*
|
||||
|
||||
Il est question ici de *"partager"* une adresse IP **publique**. L'agent
|
||||
responsable de la translation d'adresse. Il est question de remplacer le port et
|
||||
l'adresse IP source. Notre agent responsable -- équipement effectuant la
|
||||
translation -- une table de translation est disponible afin de connaitre l'état
|
||||
des connexions en cours.
|
||||
|
||||
Le NAT n'est utile que pour l'IP v4 dont les adresses routables sont au bord de
|
||||
l'epuisement. Il est utilisé intensivement pour les connexions domestiques et
|
||||
les réseaux cellulaires. Cependant les problèmes de pénurie ont leur solution:
|
||||
IPV6.
|
||||
|
||||
Problème supplémentaire, c'est le routeur qui se charge de faire le *NAT*,
|
||||
cependant il ne ddevrai pas aller farfouller dans la couche 4 du modèle OSI et
|
||||
se cantonner **sa couche 3**.
|
||||
|
||||
### Forwarding généralisé (SDN)
|
||||
|
||||
Chaque routeur contient une **table de forwarding**. Lors du forwarding
|
||||
généralisé, la correspondance ne se fait pas seulement sur l'adresse de
|
||||
destination mais sur l'ensemble de l'entête. Le routeur utilise alors la
|
||||
correspondance (*match*), les *actions* et la *priorité*.
|
||||
|
||||
* Les *match* se font sur les couches *lien*, *réseau* et * transport.
|
||||
* Les actions possibles sur les paquets sont *drop*, *copy*, *modify* et *log*.
|
||||
* Les priorité afin de savoir *quoi faire* lorsque plusieurs *match* arrivent.
|
||||
* Enfin, les couteurs sont là afin d'acoir des metriques sur *les bits* et les
|
||||
*paquets* qui passent.
|
||||
|
||||
Le principe du SDN est d'unifier **routage**, **pare-feu**, **NAT**,
|
||||
**switching** en allant chercher dans toutes les entêtes de ces couches.
|
||||
|
||||
## Control plane
|
||||
|
||||
Comme nous l'avons vu au début de cette partie, le **control plane** est
|
||||
responsable du routage : il détermine le chemin pris par les paquets. Deux
|
||||
possibilités s'offre alors à nous:
|
||||
|
||||
1. un *control plane* dans chaque routeur (ce que nous avons jusqu'ici);
|
||||
2. un *control plane* centralisé qui pilote un ensemble de routeurs.
|
||||
|
||||
Dans le premier cas il est nécessaire d'implémenter le routage par équipement
|
||||
individuellement, ce qui peut vite se réveller fastidieux. Dans le second cas,
|
||||
les routeurs utilisent un control place distant définis par logiciel. ainsi la
|
||||
configuration de tous les routeurs **est unifiée**.
|
||||
|
||||
Pour rappel, le routage a pour objectif de déterminer le meilleur chemin à
|
||||
prendre pour un paquet donné. Le chemin est en fait un ensemble de routeur par
|
||||
lequel le paquet va passer. Le meilleur chemin peut avoir plusieurs sens,
|
||||
parlons nous de *moins cher*, de *plus rapide*, *moins congestionné*?
|
||||
|
||||
### Algorithme de routage
|
||||
|
||||
Il existe bien évidemment plusieurs algorithme de routage avec chacuns
|
||||
avantages et inconvénients par exemple :
|
||||
|
||||
* *statique*, les routes changent peu et lentement
|
||||
* *dynamique*, les routes changent rapidement soit périodiquement soit en
|
||||
réponse à des incidents;
|
||||
* algorithme *link-state* ou chaque routeur voit la topologie complète avec les
|
||||
coûts des différents liens;
|
||||
* algorithme décentralisé *distant vector* ou les routeurs ne connaissent au
|
||||
départ que les coûts des liens vers leurs voisins directs. C'est un
|
||||
algorithme dynamique basé sur le calcul, et l'échange d'informations entre
|
||||
routeurs voisins.
|
||||
|
||||
|
||||
#### Algorithme de Dijkstra
|
||||
|
||||
C'est un algorithme centralisé ou les coûts vers tous les nœuds sont connus à
|
||||
l'avance via des messages de type `link-state broadcast`. Tous les nœuds
|
||||
détiennent **les mêmes informations**.
|
||||
|
||||
Avec ces informations, nous pouvons alors calculer les chemins les *moins
|
||||
chers*" depuis un nœud vers tous les autres. Nous obtenons alors une table de
|
||||
*forwarding* complète.
|
||||
|
||||
Le processus est **itératif*, ainsi après un nombre \\(K\\) d'itérations., nous
|
||||
connaissons le meilleurs chemin vers \\(k\\) destinations. Voici cet algorithme:
|
||||
|
||||
```
|
||||
// c(x,y) coût entre lien direct entre x et y
|
||||
// D[v] estimation du coût du meilleur chemin vers v depuis la source
|
||||
// p(v) nœud précédent sur le chemin de la source vers v
|
||||
// N`` ensemble de nœuds que notre algorithme connais via least-cost path
|
||||
|
||||
/* Init */
|
||||
N` = u; //compute least-cost path from u to all others nodes}
|
||||
for all_node v
|
||||
if v in all_node()
|
||||
D[v] = c(u,v);
|
||||
else
|
||||
D[v] = INFINITE;
|
||||
|
||||
do
|
||||
find w not_in N` such D[w] is minimal
|
||||
add w to N`
|
||||
update D[v] for all v adjacent tow and not in N`:
|
||||
D[v] = min(D[v], D[w] + c(w,v))
|
||||
until all node in N`
|
||||
```
|
||||
|
||||
#### Algorithme de Bellman-Ford
|
||||
|
||||
Chaque nœud envoie régulièrement sa table de vecteur de distance et leurs coûts
|
||||
associés à ses voisins. Lorsque notre nœud reçoit les information de ses
|
||||
voisins, il mets à jour sa propre table de vecteurs de distances en réalisant
|
||||
des calculs. C'est un algorithme asynchrone, itératif et sans notification de
|
||||
l'extérieur.
|
||||
|
||||
### Routage intra-ISP: OSPF
|
||||
|
||||
Pour l'instant, tout ce que nous avons vu relève du **monde idéal** et ne passe
|
||||
pas à l'échelle pour *Internet*:
|
||||
|
||||
* tout le réseau est **identique**;
|
||||
* le réseau est "**plat**".
|
||||
|
||||
Dans la vrai vie l existe des **milliards** de destinations et tout un tas de
|
||||
**réseaux autonomes**. Il est donc impossible de stocker toutes ces information
|
||||
dans une sable de routage ni de gérer de façon unifiés tout ce beau monde. Il
|
||||
est donc nécessaire d'agréger des régions appelées **systèmes autonomes** abrégé
|
||||
*AS*. nous avons alors deux types de routages:
|
||||
|
||||
* **intra-AS** ou *intra-domaine* pour tout ce qui se trouve dans notre système
|
||||
autonome, le protocole utilisé est forcément le même sur tous les routeurs de
|
||||
notre domaine
|
||||
* **inter-AS** ou *inter-domaine* qui représentens les liens entre différents
|
||||
*AS*
|
||||
|
||||
Les liens entre les *AS* sont réalisés par les routeurs de bordures.
|
||||
|
||||
#### Protocoles intra-AS
|
||||
|
||||
Les protocoles les plus communs sont:
|
||||
|
||||
* **RIP** pour *Routing Information Protocol*, les routeurs échange des
|
||||
*distant vectors* classique toutes les 30 secondes -- n'est plus utilisé
|
||||
aujourd'hui;
|
||||
* **EIGRP** pour *Enhanced Interior Gateway Procolol* qui est lui aussi basé
|
||||
sur les *distant vectors*, c'est à l'origine un protocole propriétaire de
|
||||
Cisco mais ouvert en 2013;
|
||||
* **OSPF** pour *Open Short Path First* qui est un protocole de type
|
||||
*link-state*
|
||||
|
||||
Dans le cadre de ce cours nous ne verrons qu'*OSPF* qui est le plus utilisé
|
||||
aujourd'hui.Chaque routeur annonce l'état de ces liens directement en utilisant
|
||||
le protocole IP (pas d'encapsulation de segment de la couche transport) à tous
|
||||
les autre routeur de l'*AS*. Les informations de coûts peuvent provenir de
|
||||
différentes métriques comme la bande passante, la latence etc.
|
||||
|
||||
Au niveau sécurité ds échanges, tous les messages *OSPF* peuvent être
|
||||
authentifiés.
|
||||
|
||||
*OSPF* propose deux niveau de **hiérarchie** :
|
||||
|
||||
* *backbone* interconnectant plusieurs zones;
|
||||
* *local area* représentant une zone en particulier, plus localisée.
|
||||
|
||||
L'état des liens, comprenant le couple *IP/masque* est enregistré dans une base
|
||||
de données. Cette ase est ensuite utilisée pour les calculs. La mise à jour se
|
||||
fait par des messages multicasts `link-state-advertisement`. Plusieurs types de
|
||||
paquets existent.
|
||||
|
||||
* `hello` pour la découverte des voisins, l'entetien des relations de
|
||||
voisinages. Ces paquets sont envoyés toutes les 10 secondes, si aucune de
|
||||
reponse n'est effectuées au bouts de 4 `hello`, alors l'hote est considéré
|
||||
comme *downn*.
|
||||
* `database description` pour synchroniser les bases de données avec ses
|
||||
voisins.
|
||||
* `link-state-request` pour demander des informations aux voisins.
|
||||
* `link-state-advertisement` pour mettre à jour l'état des liens, il en existe
|
||||
11 types différents de paquets:
|
||||
* type 1: décrire les interfaces du routeur;
|
||||
* type 2: décription ds routeur conectés à un segment (dans une même *area
|
||||
OSPF);
|
||||
* type 3: résumés des information envoyées depuis une autre *area*.
|
||||
* etc.
|
||||
* `link-state-update` qui contient plusieurs `LSA`
|
||||
* `link-state-ack` pour l'acquitement d'un `LSR` ou d'un `LSA`
|
||||
|
||||
OSPF est basé sur l'algorithme de Dijkstra: le plus court chemin. Il est calculé
|
||||
en fonction de la bande passante du lien. 100Mbit/s a un poind de 1, 10Mbit/s un
|
||||
poid de 10 (100/10) et 1000Mbit/s 0.1 (100/1000). Cependant le poind ne peut
|
||||
être inférieur à 1, donc 0,1 devient 1. Pour poivoir profiter des poids sur les
|
||||
liens suppieur à 100Mbit/s, il faut alors **modifier manuellement la valeur de
|
||||
base**.
|
||||
|
||||
#### Protocole inter-AS: BGP
|
||||
|
||||
BGP pour *Border Gateway Protocol* annonce l'existance d'un réseau, d'une
|
||||
destination. Il permet d'obtenir des informations de routage de ses voisins via
|
||||
**eBGP**, de déterminer les routes vers les autres réseaux en fonction des
|
||||
information de disponibilités et des politiques ou encore d'avertir ses voisins
|
||||
de ses propres réseaux / disponibilités. Par le biais **d'iBGP** il propage les
|
||||
information obtenues de ses voisins à tous les routeur *intra-domaine*.
|
||||
|
||||
*BGP** utilise les sessions établies via TCP pour communiquer. Plusieurs type de
|
||||
messages sont disponibles:
|
||||
|
||||
* **open** pour ouvrir une connexion TCP vers un hôte BGP distant et
|
||||
s'authentifier;
|
||||
* **update** pour avertir de changement que se soit suppression, ajout ou
|
||||
modification;
|
||||
* **keepalive** pour maintenir la session ouverte;
|
||||
* **notification** pour notifier d'une erreur ou fermer une session.
|
||||
|
||||
Une annonce contient un *préfixe* plus un *attribut*. Les deux attributs les
|
||||
plus importants sont:
|
||||
|
||||
* *as-path* qui représente le chemin;
|
||||
* *next-hop* qui indique le routeur spécifique pour arriver à une destination
|
||||
définie.
|
||||
|
||||
BGP utilise des politique de routage pour déterminer les chemins à annoncer.
|
||||
|
||||
Principe de la **patate chaude**: BGP choisira de faire sortir le paquet le plus
|
||||
vite possible de son infrastructure, ne prenant pas en comptes les coûts
|
||||
intra=domaines
|
||||
|
||||
|
||||
### SDN *Software Defined Network
|
||||
|
||||
Depuis 2005, des recherches sont menées afin de trouvwr de nouvelles approches
|
||||
réseaux. Le *control plane* et le *data plane* se faisaient traditionnellement
|
||||
sur les routeurs. Maintenant le controle est éloigné et installe à distance les
|
||||
tables de routages. Ainsi la gestion du réseau est facilitée (configuration en
|
||||
un seul point, plus de flexibilité, contrôle *openflow* et architcture
|
||||
indépendate du vendeur --interopérable).
|
||||
|
||||
Le *SDN controller* prend alors trois fonctions:
|
||||
|
||||
* *interface layer* offrant l'accès aux API;
|
||||
* *network state management* prenant en compte les information des liens, du
|
||||
*switching;
|
||||
* les communication via les API (Openflow, SNMP).
|
||||
|
||||
#### le protocole Openflow
|
||||
|
||||
Il s'intercate entre les controlleurs et les *switches* et utilise TCP. Il
|
||||
comporte trois types de messages:
|
||||
|
||||
* `controller` vers les `switch` pour demander des information, envoyer des
|
||||
configurations etc.;
|
||||
* asynchrone avec par exemple les paquets à traiter par le conrolleurs,
|
||||
notifier la suppression d'une entrée dans la *table de forwarding*
|
||||
* symetrique
|
||||
|
||||
#### ICMP *Internet Control Message Protocol*
|
||||
|
||||
C'est un protoboe de contrôle utilisé pour obtenir des informations au niveau du
|
||||
réseau (*unreachable host|protocol|port*, *ping*). Il s'intercate entre les
|
||||
couches réseau et transport.
|
|
@ -213,3 +213,55 @@ labels de taille fixe entre l'entête Ethernet et la charge utile.
|
|||
|
||||
Le routeur MPSL regarde donc le label pour décider quoi faire avec le paquet: le
|
||||
routage est plus rapide (pas de décapsulation) et plus flexible.
|
||||
|
||||
## Les réseaux sans fils
|
||||
nous distingons deux type de fonctionnements principaux:
|
||||
|
||||
1. **infrastructure**: une station de base est utiliée par tous les terminaux
|
||||
du réseaux sans-fils pour communiquer;
|
||||
2. **ah-hoc**: les terminaux de débrouillent entre eux pour s'interconnecter.
|
||||
|
||||
### Caractéristiques
|
||||
|
||||
L'**aténuation** est la caractéristiques celon laquelle le signal perd en
|
||||
puissance à mesure qu'il se propage. Plus la distance est élevée et plus la
|
||||
fréquence est haure, plus le signal diminue en intensité (*path loss*).
|
||||
|
||||
Le **mutltipath propagation** est lié au fait que le signal sans fils peut être
|
||||
réfléchit pat l'environnement (mur par exemple). Les paquets issus de cette
|
||||
réflexion vont être reçus avec du délais, il faut qlors que les équipements le
|
||||
gèrent.
|
||||
|
||||
Le **bruit**: des signaux sont envoyés par d'auyres équipement dans le rayon
|
||||
d'action de notre réseau. Il faut alors mesuré le **Rapport signal bruit**. Plus
|
||||
il est élevé et meilleure est la qualité de réception.
|
||||
|
||||
Les **équipements cachés** Si un obstaacle empêche A de voir C alors que A voit
|
||||
B qui voit C, alors il y a des riques de collisions de paquets.
|
||||
|
||||
### 802.11
|
||||
|
||||
C'est un protocole basé sur l'*infrastructure*, la station de base est
|
||||
matérialisée par un **point d'accès**. Le spectre est divisé en canaux
|
||||
(*channel*) afinde géger les interférences. chaque équipement doit s'associer
|
||||
avec le point d'accès et s'authentifier.
|
||||
|
||||
Avant de pouvoir choisir un point d'accès, il faut realiser un scan, deux mode
|
||||
sont disponibles:
|
||||
|
||||
* *passive scan*: le point d'accès envoie des trames spécifique pour s'annoncer
|
||||
(*beacon*)
|
||||
* *active scan*: les équipement sont à l'origine de la connexion par le biais
|
||||
des `prove request frame` auxquelle le point d'acces répond par
|
||||
une`association request`;
|
||||
|
||||
Cette norme sans fils utilise CSMA (*sense before send*) mais sans détection de
|
||||
collision pour éviter les problèmes de medium (aténuation, terminaux cachés,
|
||||
...). Il utilise CSMA/CA pour *collision Avoidance* (l'hôte envoie une
|
||||
`request-to-send`, le point d'accès envoie alors un `CTS` en *broadcast*
|
||||
avertissant alors les autres équipement de la transmission à venir.
|
||||
|
||||
#### Mobilité dans un même réseau
|
||||
|
||||
Si le changement se fait au niveau du *BSS* mais sans changement de sous-réseau,
|
||||
alors c'est au *switch* de gérer car les adresses *MAC* sont les mêmes.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue