QoS

//__Introduction à la Qualité de service__//
La plupart des réseaux importants, tels que les réseaux d'entreprises, proposent différents services aux utilisateurs pour respecter leurs besoins. On trouve par exemple des services tels que de la téléphonie, un accès à internet, le transfert de données, l'hébergement de serveurs,... Il est donc nécessaire que certains de ces services soit plus accessibles que d'autres, c'est-à-dire que l'on préférera, par exemple, améliorer la qualité de transfert des services de téléphonie au détriment des transferts de données qui ne sont pas aussi importants. La Qualité de Service (QoS), représente une série de techniques nécessaires pour gérer différents paramètres sur une ligne tels que la bande passante, le temps de transfert, la gigue, ou la perte de paquets. Lorsque une entreprise utilise MPLS, il est essentiel pour elle que ses besoins soient respectés en garantissant une disponibilité des ressources malgré les variations de charge du réseau. Les opérateurs qui offrent désormais des services de VPN et de Trafic Engineering (TE) peuvent se concurrencer en offrant divers niveaux de qualité de service en fonction des différents types de trafic que l'on peut rencontrer sur le réseau. Par exemple, lorsque l'on souhaite utiliser des services de voix sur IP (VoIP) sur notre réseaux, il est essentiel de garantir une bande passante et des délais de transmissions optimaux. Dans le cas de transfert de données importants, il est nécessaire de garantir un taux de perte de paquet faible alors que la gigue importe peu. Le modèle DiffServ permet le gestion de cette QoS de bout en bout (end-to-end) dans notre réseau.

//__DiffServ__//
Le modèle DiffServ utilise, pour les traitements à effectuer, le champ DSCP (Differenciated Services Code Point). Celui-ci remplace le champ TOS (Type of Service) mis en place par l'IETF pour l'IPv4. Ce champ est codé sur 6 bits et est définit par les routeurs de périphérie, il permet d'indiquer aux routeurs du cœur le comportement qu'ils doivent adopter en fonction de sa valeur. Ce comportement s'appelle le **P** er **H** op **B** ehaviour (comportement par saut). Le modèle DiffServ applique 3 classes de traitement: Expedited Forwarding est utilisé pour les flux les plus important comme les flux dit "temps réels" (VoIP ou vidéo) pour lesquels il est important d'avoir une gigue très faible et une bande passante garantie. Assured Forwarding regroupe 4 classes de priorité appelées le plus souvent "Platinium", "Gold", "Silver"et "Bronze"; Platinum étant la classe ayant la plus grande priorité et bronze, la plus faible. La classe Best Effort n’applique aucun traitement par rapport aux priorités sur les paquets. Ils sont donc censés être les derniers à arriver si le trafic réseau le permet. En cas de congestion, ce sont les premiers paquets à être supprimés. La classification des paquets réalisée au niveau des routeurs peut-être deux types différents : > Behaviour Agregate est en général appliquée sur les routeurs de cœur et permet de limiter les traitements à effectuer sur les paquets. Cette méthode consiste à effectuer la classification seulement en fonction du champ DSCP du paquet. La seconde méthode est davantage utilisée par les routeurs de périphérie et permet d'effectuer la classification en fonction du champ DSCP du paquets et d'autres éléments comme les adresses IP sources et destinations, les ports … On utilise beaucoup DiffServ aujourd'hui car son implémentation est très simple et son efficacité est bonne.
 * Expedited Forwarding (EF)
 * Assured Forwarding (AF)
 * Best Effort (BE)
 * Behaviour Agregate
 * MultiField

Différents champs DSCP: Ces champs sont à entrer lorsque l'on configure DiffServ sur les routeurs, ils seront donc utilisés dans la partie suivante.

__**Comment mettre en place la QoS sur les routeurs Cisco ?**__  Lorsque l'on souhaite mettre en place une qualité de service sur un réseau, une configuration du matériel est nécessaire. Cette configuration se fait suivant plusieurs étapes que nous expliquerons par la suite :
 * 1) __**Création des classes**__

- Création de "class-map" - Création de "policy-map" - Création de "service policy"
 * 1) __Création des "class-map"__

Dans un réseau, il est nécessaire de différencier les types de trafics pour pouvoir gérer leurs priorités. Les "class-map" (littéralement "plan de classes") permettent une classification de ces types de flux suivant plusieurs critères comme le protocole ou encore les ports utilisés. Par exemple pour créer un type de trafic appelé "VOIP" que l'on utilisera pour les communications vocales, on utilisera les commandes suivantes: ** Router(config)# ** class-map VOIP ** Router(config-cmap)# ** match ip rtp 16384 16383 La ligne 2 spécifie que l'on souhaite créer une classe pour les flux IP utilisant le protocole RTP et les ports 16384 et 16383. Pour des questions d'organisation et de simplicité, on préfère attacher les classes à des ACLs. Pour cela, on créé tout d'abord ces ACLs qui permettront d'autoriser le trafic sur certains ports et pour certains protocoles: **Router(config)#** access-list 101 permit tcp any any eq 16383 Cette Access-list est dite "étendue", elle permet d'autoriser le trafic TCP en provenance et à destination de n'importe quelle adresse IP et concernant les ports 16383 et 16384. On peut ensuite créer une classe et y associer l'ACL: **Router(config)#** class-map VOIP Cette commande permet de liée l'access-list 101 à la classe VOIP. On peut associer autant d'ACL que l'on souhaite à un classe. La class-map est ainsi créée.
 * Router(config)**# access-list 101 permit tcp any any eq 16384
 * Router(config-cmap)#** match access-group 101
 * 1) __Création des "policy-map"__

Une "policy-map" permet de définir une action associée à une "class-map", c'est-à-dire, le traitement à lui appliquer comme par exemple une bande passante. Pour un flux de données, par exemple ftp, on pourra utiliser les commandes suivantes : Router(config)** # ** policy-map ftppolicy  Ainsi, on créé une "policy-map" appelée ftppolicy appliquée à la classe ftp et une bande passante égale à 20% de la bande passante totale sera divisée entre les différents flux.
 * R outeur(config-pmap****)#** class ftp **R****outeur(config-pmap-cmap)** # bandwidth percent 20

Lorsque les données à transmettre sont plus importantes et nécessitent des débits __assurés__ (flux dit "temps réel"), les commandes à utiliser sont différentes: Router(config**)#** policy-map VOIPpolic**e** **R** outeur(config-pmap)# class VOIP **R****outeur(config-pmap-cmap)** # priority percent 40  Ainsi, on créé une "policy-map" appelée VOIPpolicy appliquée à la classe VOIP et on spécifie une bande passante __ minimum __ pour ce flux égale à 40% de la bande passante totale.  Les "service policy" permettent d'attacher des politiques à des interfaces du routeur. En fonction du type de trafic, on peut attacher ces politiques soit sur l'interface sortante, soit sur l'interface entrante. On peut ainsi éviter les congestions à l'entrée du routeur en limitant la quantité de paquets sur l'interface entrante. De plus, si l'on souhaite assurer une priorité sur des paquets en direction de l'extérieur (VoIP), on peut appliquer ces politiques sur l'interface sortante.
 * 1) __Création des "service-policy"__

**Router(config)** # interface Serial 0/0  **Router(config-if)** # service-policy output VOIPpolicy


 * 1) __**Utilisation de DiffServ**__

 On utilise DiffServ pour assurer une qualité de service de bout-en-bout. Pour implémenter DiffServ, on sépare tout d'abord les interfaces qui recevront les données de celles qui les enverront. Pour l'interface qui recoit les données, on créé tout d'abord les ACLs (comme vu précédemment) puis les classes. On attribue ensuite une valeur au champ DSCP. Ce qui donne: //a) Création des access-list :// **Router(config)** # access-list 101 permit tcp any any eq 16383  **Router(config)**# access-list 101 permit tcp any any eq 16384 //b) Création des classes :// ** Router(config-cmap) **** # ** match access-group 101 //c) Attribution de la valeur au champ DSCP// Router(config)** # ** policy-map dscp R outeur(config-pmap-cmap)**# ****<span style="color: #000000; font-family: Times New Roman,serif; font-weight: normal;">set ip dscp 46 ** R outeur(config-pmap-cmap) **<span style="font-family: Times New Roman,serif; font-weight: normal;"># class ftp **  R outeur(config-pmap-cmap) **<span style="font-family: Times New Roman,serif; font-weight: normal;"># ****<span style="font-family: Times New Roman,serif; font-weight: normal;">set ip dscp 22 **
 * Router(config)**# access-list 102 permit tcp any any eq 20
 * Router(config)**# access-list 102 permit tcp any any eq 21
 * Router(config) **** # ** class-map VOIP
 * Router(config-cmap) **** # end **
 * Router(config) **** # class-map ftp **
 * Router(config-cmap) **** # match access-group 102 **
 * Router(config-cmap) **** # end **
 * R**outeur(config-pmap) **<span style="font-family: Times New Roman,serif; font-weight: normal;"># class VOIP **

**<span style="font-family: Times New Roman,serif; font-weight: normal;">Pour l'interface qui reçoit les données, on créé les classes puis on alloue une bande passante, ce qui nous donne: ** <span style="color: #000000; font-family: Times New Roman,serif;">** Router(config-cmap) **** # end ** **<span style="font-family: Times New Roman,serif; font-style: normal;">Router(config) ****<span style="font-family: Times New Roman,serif; font-style: normal; font-weight: normal;"># class-map bpriorite ** <span style="color: #000000; font-family: Times New Roman,serif;">** Router(config-cmap) **** # end **
 * <span style="font-family: Times New Roman,serif;">// a) Création des classes : // **
 * <span style="font-family: Times New Roman,serif; font-style: normal;">Router(config) ****<span style="font-family: Times New Roman,serif; font-style: normal; font-weight: normal;"># class-map hpriorite **
 * <span style="font-family: Times New Roman,serif; font-style: normal;">Router(config-cmap) ****<span style="font-family: Times New Roman,serif; font-style: normal; font-weight: normal;"># match ip dscp 46 **
 * <span style="font-family: Times New Roman,serif; font-style: normal;">Router(config-cmap) ****<span style="font-family: Times New Roman,serif; font-style: normal; font-weight: normal;"># match ip dscp 22 **

<span style="color: #000000; font-family: Times New Roman,serif;"> **// b) Allocation de la bande passante : //** <span style="font-family: Times New Roman,serif;"> Router(config) ** # policy-map QOS ** <span style="font-family: Times New Roman,serif;"> R outeur(config-pmap) ** # class hpriorite ** Router(config-pmap-cmap)# priority percent 40 R outer(config-pmap-cmap)# class ftp <span style="font-family: Times New Roman,serif;">R outer(config-pmap-cmap) ** # ****<span style="font-family: Times New Roman,serif; font-style: normal; font-weight: normal;">bandwidth percent 30 ** <span style="font-family: Times New Roman,serif;"> R outer(config-pmap-cmap) ** # end **

**__DiffServ et MPLS__**
Un des champs de l'entête MPLS est EXP, il s'agit du champ expérimental qui permet l'utilisation de la QoS. Ce champ est de 3 bit et est lié à la valeur du champ DSCP. Ces 3 bits correspondent au 3 premiers bits du champ DCSP, par exemple, si le DSCP à une valeur de 46, soit 101110 en binaire, la valeur du champ EXP sera de 101 soit 5. Ce champ étant de 3 bits, sa valeur est comprise entre 0 et 7.

Les routeurs de frontière marquent le trafic grâce au champ DSCP de DiffServ. Ces routeurs sont capable de recopier les informations DiffServ depuis l’en-tête du paquet IP pour les placer dans le champ EXP de l’en-tête MPLS. Ainsi, les informations relatives à la classe de service désirée sont conservées de bout en bout et la qualité de service est garantie pour chaque type de trafic.

Grâce au mode de configuration, on peut aussi fixer la valeur du champ expérimental dans une "service policy" en utilisant la même démarche que lors de la créations des classes expliquée précédement"**//set mpls experimental 5//**" Ce champ n'est normalement pas modifié au cours de son transit, le flux sera donc traité de la même façon par tout les routeurs.

http://nuntius.com/docs/QoSandMPLS1.pdf