---
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.
