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