Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parOscar Meloche Modifié depuis plus de 7 années
1
problèmes d'équilibrage utilisant CEF (Cisco Express Forwarding)
Résolution de problèmes d'équilibrage de charge en utilisant CEF (Cisco Express Forwarding)
2
Sommaire • Introduction • Prérequis • Rappel de théorie
• C'est quoi l'équilibrage de charge? • Avant CEF - Collecter de multiples Chemins ou Routes • Configurer l'équilibrage de charge CEF • Mécanismes internes d'équilibrage de charge CEF • Vérification de l'équilibrage de charge CEF • Partage de charge après un changement de liaison
3
Introduction Ce document décrit comment l'IOS Cisco implémente l'équilibrage de charge de couche
3 sur plusieurs liaisons parallèles en utilisant CEF (Cisco Express Forwarding). Prérequis Ce document suppose la compréhension de deux structures de CEF: ● FIB (Forwarding Information Base) ● Table d'adjacences Rappel de théorie La commutation IP est le mécanisme interne utilisé par l'IOS Cisco pour acheminer les paquets à travers un routeur. Les mécanismes disponibles comprennent le processus de commutation, la commutation rapide (Fast-Switching) et CEF (Cisco Express For- warding). Selon lequel des trois mécanismes est utilisé pour commuter la majorité des paquets, la performance globale du système et l'équilibrage de charge sont affectés. Les mécanismes de commutation IP supportent deux modes généraux : par paquet ou par destination. Le tableau suivant souligne les avantages et inconvénients des deux modes. Par destination Par paquet Mécanisme de commutation IP Fast-Switching et Cisco Express Forwarding Process-Switching et Cisco Express Forwarding Avantages Avec Fast-Switching, les pa- quets pour une destination donnée sont garantis de prendre le même chemin même si plusieurs chemins sont disponibles. Avec la commutation Cisco Express Forwarding, les pa- quets pour une paire host source-destination sont ga- rantis de prendre le même chemin même si plusieurs chemins sont disponibles. Le trafic destiné à différen- tes paires tend à prendre chemins différents L'utilisation de chemin avec l'équilibrage de charge par paquet est bonne car l'équili-brage de charge par paquet permet au routeur de trans- mettre des paquets successifs sur des chemins sans tenir compte des adresses de host ou de sessions utilisateur. Il utilise la méthode round-robin pour déterminer quel chemin chaque paquet doit prendre pour aller vers la destination.
4
C'est quoi l'équilibrage de charge?
Par destination Par paquet Mécanisme de commutation IP Fast-Switching et Cisco Express Forwarding Process-Switching et Cisco Express Forwarding Inconvénients Avec Fast-Switching, la com- mutation par destination peut résulter en un partage de charge non égal car les paquets pour une destina- tion suivent le même chemin. La commutation Cisco Express Forwarding peut résulter en une distribution inégale avec un petit nombre de paires source-destination. L'équilibrage de charge par destination dépend de la dis- tribution statistique du trafic; le partage de charge devient plus efficace dès le nombre de paires source-destination augmente. Les paquets pour une paire source-destination donnée peuvent prendre des chemins différents ce qui peut introdui- re du réordonnancement de paquets. Ceci n'est pas recom- mandé pour la VoIP (Voice over IP) et d'autres flux qui requiè- rent la remise de paquet en séquence. C'est quoi l'équilibrage de charge? L'équilibrage de charge décrit la capacité d'un routeur à transmettre des paquets IP vers une adresse IP destination (connue également comme préfixe) sur plusieurs che- mins. Quand on parle de l'équilibrage de charge, on a besoin de définir les termes suivants: Terme Définition Préfixe (Prefix) Décrit un réseau IP destination tel que /24. L'IOS Cisco ajoute un préfixe IP destination à la table de routage en utilisant des informations obtenues par un protocole de routage dynamique ou par configuration ma- nuelle de routes statiques. Chemin (Path) Décrit une route valide pour atteindre un préfixe destina- tion. L'IOS Cisco affecte un coût à chaque chemin. Un en- semble de chemins actifs vers un préfixe destination peu- vent avoir des coûts égaux ou inégaux. Session Décrit de communication unidirectionnelle entre deux ex- trémités IP. Tous les paquets d'une session utilisent les mêmes adresses IP source et destination.
5
Avant CEF - Collecter de multiples chemins ou routes
Cisco Express Forwarding utilise l'information de chemin dans la table de routage IP pour équilibrer le trafic sur de multiples liaisons. Pour cette raison, confirmer un équilibrage de charge CEF correct commence par la validation du contenu de la table de routage IP. Dans la topologie suivante les routeurs A et B sont connectés face à face par trois in- terfaces série avec une encapsulation HDLC. Routeur A Routeur B interface Ethernet 0 ip address ! interface Serial1 ip address interface Serial2 ip address interface Serial3 ip address ip ospf cost 100 router ospf 1 network area 0 network area 0 network area 0 network area 0 ip address clockrate ip address clockrate ip address maximum-paths 1 Regardons comment le routeur B choisit un ou plusieurs chemins pour atteindre l'in- terface Ethernet du routeur A avec le réseau IP ● Par défaut OSPF (Open Shortest Path First) supporte quatre chemins de coûts égaux vers une destination. Dans ce scénario, le routeur B est configuré avec un nombre maximum de chemins de coûts égaux égal à 1. Donc le routeur B choisira un seul chemin parmi les chemins égaux possibles sur la base du premier chemin appris. Le routeur B commence par sélectionner l'interface Serial 2 comme le seul chemin vers le réseau Utilisez les commandes show ip cef et show ip route pour voir le chemin courant. RouterB#show ip cef /24, version 59, cached adjacency to Serial2 0 packets, 0 bytes via , Serial2, 0 dependencies next hop , Serial2 valid cached adjacency
6
Known via "ospf 1", distance 110, metric 74, type intra area
RouterB#show ip route Routing entry for /24 Known via "ospf 1", distance 110, metric 74, type intra area Redistributing via ospf 1 Last update from on Serial2, 00:03:58 ago Routing Descriptor Blocks: * , from , 00:03:58 ago, via Serial2 Route metric is 74, traffic share count is 1 ● Utilisez la commande maximum-paths dans OSPF pour autoriser plus d'un chemin dans la table de routage. OSPF autorise uniquement l'équilibrage de charge sur des chemins de coûts égaux. Pour du partage de charge avec des chemins de coûts inégaux, utilisez EIGRP (Enhanced Interior Gateway Routing Protocol). RouterB(config)#router ospf 1 RouterB(config-router)#maximum-paths ? <1-6> Number of paths RouterB(config-router)#maximum-paths 3 ● Utilisez la commande show ip route pour confirmer que la table de routage con tient deux chemins vers le réseau Last update from on Serial1, 00:00:11 ago * , from , 00:00:11 ago, via Serial2 , from , 00:00:11 ago, via Serial1 !--- La métrique de route est 74 pour les deux chemins. ● Bien OSPF soit configuré pour supporter trois chemins de coûts égaux, seuls deux chemins actifs sont affectés dans la sortie de la commande show ip route. Vous pouvez utiliser la commande show ip ospf interface pour en déterminer la raison La liaison Serial 3 a un coût supérieur à Serial 1 et Serial 2 et par conséquent non égal. RouterB#show ip ospf interface s1 Serial1 is up, line protocol is up Internet Address /24, Area 0 Process ID 1, Router ID , Network Type POINT_TO_POINT, Cost: 64
7
tion et faire que les coûts des trois liaisons Serial soient égaux.
RouterB#show ip ospf interface s2 Serial2 is up, line protocol is up Internet Address /24, Area 0 Process ID 1, Router ID , Network Type POINT_TO_POINT, Cost: 64 RouterB#show ip ospf interface s3 Serial3 is up, line protocol is up Internet Address /24, Area 0 Process ID 1, Router ID , Network Type POINT_TO_POINT, Cost: 100 ● Utilisez la commande show running-config pour confirmer que l'interface Serial est configurée avec la commande ip ospf cost 100. Utilisez la commande no ip ospf cost 100 en mode de configuration interface pour la retirer de la configura- tion et faire que les coûts des trois liaisons Serial soient égaux. RouterB#show runnning-config interface s3 Building configuration... Current configuration: ! interface Serial3 ip address no ip directed-broadcast ip ospf cost 100 ip ospf interface-retry 0 ● La commande show ip route affiche maintenant trois chemins de coûts égaux vers le réseau RouterB#show ip route Routing entry for /24 Known via "ospf 1", distance 110, metric 74, type intra area Redistributing via ospf 1 Last update from on Serial1, 00:00:01 ago Routing Descriptor Blocks: * , from , 00:00:01 ago, via Serial2 Route metric is 74, traffic share count is 1 , from , 00:00:01 ago, via Serial3 , from , 00:00:01 ago, via Serial1 Route metric is 74, traffic share count is Maintenant regardons comment l'équilibrage de charge Cisco Express Forwarding utilise l'information de la table de routage pour acheminer les paquets.
8
Configurer l'équilibrage de charge CEF
Cisco Express Forwarding réalise un équilibrage de charge au moyen d'une table charge-partage. Comme toutes les autres solutions d'équilibrage de charge sur les routeurs Cisco, la décision d'équilibrage de charge est faite en sortie sur les interfaces. Contrairement aux autres méthodes de commutation, CEF fait les chemins sur la base de l'adresse source et de l'adresse destination du chemin. Pour caractériser cela vous pouvez dire que le chemin est une session IP et que chaque session est identifiée logi- quement par une paire d'adresses source-destination. Pour comprendre comment l'équilibrage de charge fonctionne, vous devez d'abord voir comment les tables sont liées. La table CEF (Cisco Express Forwarding) pointe vers 16 index de hachage (table load-share) qui à leur tour pointes sur la table d'adjacence pour les chemins parallèles. Avec chaque paquet devant être commuté une paire d'adresses source-destination est constituée et comparée à la table "load-share". Note : Il y a deux types principaux de commutation CEF : par paquet ou par destina- tion. Si les deux types sont utilisés sur le routeur, chaque type a sa table "load-share". L'équilibrage de charge par destination permet au routeur d'utiliser plusieurs chemins pour faire du partage de charge. L'équilibrage de charge par destination est validé par défaut quand vous validez CEF (Cisco Express Forwarding) et c'est le choix de méthode d'équilibrage de charge dans la majorité des situations. Parce que l'équilibrage de char- ge par destination dépend de la distribution statistique du trafic, le partage de charge est plus efficace dès que le nombre de paires source-destination augmente. L'équilibrage de charge par paquet permet au routeur de transmettre des suites de pa- quets sans tenir compte des hosts ou de session utilisateur. Il utilise la méthode round-robin pour déterminer quel chemin chaque paquet doit prendre pour aller vers la destination. L'équilibrage de charge par paquet assure l'équilibrage sur de multiples liaisons. L'utilisation du chemin avec cette méthode est bonne mais les paquets d'une paire source-destination peuvent prendre différents chemins ce qui peut provoquer un réordonnancement de paquets. Pour cette raison, l'équilibrage de charge par paquet est inapproprié pour certains types de trafic tels que la VoIP (Voice over IP) qui impose que les paquets arrivent en séquence à la destination. Utilisez l'équilibrage de charge par paquet permet de s'assurer qu'un chemin pour une paire source-destination uni- que ne deviendra pas surchargé. Utilisez la commande ip load-sharing pour changer entre les méthodes par-paquet ou par-destination. (config)#interface fast 0/0 (config-if)#ip load-sharing ? per-destination Deterministic distribution per-packet Random distribution (config-if)#ip load-sharing per-packet
9
Mécanismes internes d'équilibrage de charge CEF
Utilisez la commande show cef interface pour confirmer le changement : #show cef interface fast 0/0 FastEthernet0/0 is up (if_number 3) Corresponding hwidb fast_if_number 3 Corresponding hwidb firstsw->if_number 3 Internet address is /24 ICMP redirects are always sent Per packet load-sharing is enabled IP unicast RPF check is disabled Inbound access list is not set Outbound access list is not set IP policy routing is disabled Hardware idb is FastEthernet0/0 Fast switching type 1, interface type 18 IP CEF switching enabled IP Feature Fast switching turbo vector IP Feature CEF switching turbo vector Input fast flags 0x0, Output fast flags 0x0 ifindex 1(1) Slot 0 Slot unit 0 VC -1 Transmit limit accumulator 0x0 (0x0) IP MTU 1500 Mécanismes internes d'équilibrage de charge CEF Commençons par étudier le mécanisme d'équilibrage de charge dans CEF. ● Chaque session est affectée à un chemin actif. ● L'affectation session-chemin est faite en utilisant une fonction de hachage qui prend les adresses IP source et destination et, dans les releases récentes de l'IOS Cisco, un ID de hachage unique qui rend aléatoire l'affectation à travers le chemin de bout en bout. ● Les chemins actifs sont affectés en interne à plusieurs des 16 index de hachage L'affectation path-vers-Index varie selon le type d'équilibrage de charge et le nombre de chemins actifs. ● Le résultat de la fonction de hachage est utilisé pour prendre un des index validé et par conséquent le chemin à utiliser pour cette session. ● Pour toutes les sessions en cours d'acheminement par le routeur, chaque chemin actif transporte le même nombre de sessions. Examinons un exemple de fonctionnement interne de CEF : 1. Utilisez la commande maximum-paths pour réduire à deux le nombre de chemins actifs pour un préfixe destination RouterB(config)#router ospf 1 RouterB(config-router)#maximum-paths 2
10
RouterB#show ip cef 194.168.20.0 internal
2. Utilisez la commande show ip cef {prefix} internal pour voir l'affectation chemin-index. RouterB#show ip cef internal /24, version 66, per-destination sharing 0 packets, 0 bytes via , Serial2, 0 dependencies traffic share 1 next hop , Serial2 valid adjacency via , Serial3, 0 dependencies next hop , Serial3 0 packets, 0 bytes switched through the prefix Load distribution: (refcount 1) !--- La ligne de distribution de charge résume comment chaque !--- chemin est affecté aux index de hachage. Hash OK Interface Address Packets 1 Y Serial point2point 0 2 Y Serial point2point 0 3 Y Serial point2point 0 4 Y Serial point2point 0 5 Y Serial point2point 0 6 Y Serial point2point 0 7 Y Serial point2point 0 8 Y Serial point2point 0 9 Y Serial point2point 0 10 Y Serial point2point 0 11 Y Serial point2point 0 12 Y Serial point2point 0 13 Y Serial point2point 0 14 Y Serial point2point 0 15 Y Serial point2point 0 16 Y Serial point2point 0 Les 16 index de hachage sont fixés d'après le type d'équilibrage de charge et nom- bre de chemins actifs. Le cas simple est pour un nombre de chemins pair. Les 16 index sont de manière égale avec les chemins actifs. Si 16 n'est pas divisible par le nombre de chemins actifs seule la valeur entière est prise en compte. Le tableau suivant montre à quoi ressemble les index de hachage pour deux et trois chemins actifs. Index/Chemins 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 x
11
Dans l'exemple suivant nous avons trois chemins vers la destination
Dans l'exemple suivant nous avons trois chemins vers la destination. Notez comment CEF a retiré l'index de hachage N°16 et comment les trois liaisons série sont affectées équitablement aux index de hachage 1 à RouterB#show ip cef interface /24, version 64, per-destination sharing 0 packets, 0 bytes via , Serial2, 0 dependencies traffic share 1 next hop , Serial2 valid adjacency via , Serial3, 0 dependencies next hop , Serial3 via , Serial1, 0 dependencies next hop , Serial1 0 packets, 0 bytes switched through the prefix Load distribution: (refcount 1) !--- Les chemins actifs sont affectés aux index de hachage !--- avec une méthode round-robin. Hash OK Interface Address Packets 1 Y Serial point2point 2 Y Serial point2point 3 Y Serial point2point 4 Y Serial point2point 5 Y Serial point2point 6 Y Serial point2point 7 Y Serial point2point 8 Y Serial point2point 9 Y Serial point2point 10 Y Serial point2point 11 Y Serial point2point 12 Y Serial point2point 13 Y Serial point2point 14 Y Serial point2point 15 Y Serial point2point !--- L'index de hachage 16 a été retiré. Note : Bien qu'ils sélectionnent un seul chemin pour une destination, les mécanismes Fast-Switching et CEF par-destination diffèrent sur la manière de choisir le chemin. CEF considère les adresses IP source et destination alors que Fast-Switching prend en compte uniquement l'adresse IP destination.
12
Vérification de l'équilibrage de charge CEF Exécutez les étapes suivantes pour vérifier l'équilibrage de charge CEF sur votre rou- teur: 1. Confirmez que CEF est globalement validé sur le routeur. S3-4K-2#show ip cef %CEF not running Prefix Next Hop Interface !--- Cette sortie montre que Cisco Express Forwarding n'est pas !--- validé. Utilisez la commande ip cef en mode de configuration !--- global pour le valider. 2. Confirmez que la commutation par paquet ou par destination est validée sur les interfaces de sorties particulières. Par défaut c'est la commutation par destina- tion RouterA#show cef interface s1 Serial1 is up (if_number 3) Internet address is /24 ICMP redirects are always sent Per packet loadbalancing is disabled IP unicast RPF check is disabled Inbound access list is not set Outbound access list is not set Interface is marked as point to point interface Hardware idb is Serial1 Fast switching type 4, interface type 40 IP CEF switching enabled !--- Cisco Express Forwarding est validé sur l'interface. IP CEF Fast switching turbo vector Input fast flags 0x0, Output fast flags 0x0 ifindex 5(5) Slot 0 Slot unit 1 VC -1 Transmit limit accumulator 0x0 (0x0) IP MTU 1500 3. Confirmez que la table de routage contient tous les chemins parallèles en utilisant la commande show ip route. RouterB#show ip route Routing entry for /32, 1 known subnets O [110/65] via , 00:06:54, Serial1 [110/65] via , 00:06:54, Serial2 [110/65] via , 00:06:54, Serial3
13
4. Vérifiez la FIB de CEF en utilisant la commande show ip cef.
RouterB#show ip cef /24, version 18, per-destination sharing 0 packets, 0 bytes via , Serial3, 0 dependencies traffic share 1 next hop , Serial3 valid adjacency via , Serial2, 0 dependencies next hop , Serial2 via , Serial1, 0 dependencies next hop , Serial1 0 packets, 0 bytes switched through the prefix tmstats: external 0 packets, 0 bytes internal 0 packets, 0 bytes RouterB#show ip cef internal Load distribution: (refcount 1) Hash OK Interface Address Packets 1 Y Serial point2point 2 Y Serial point2point 3 Y Serial point2point 4 Y Serial point2point 5 Y Serial point2point 6 Y Serial point2point 7 Y Serial point2point 8 Y Serial point2point 9 Y Serial point2point 10 Y Serial point2point 11 Y Serial point2point 12 Y Serial point2point 13 Y Serial point2point 14 Y Serial point2point 15 Y Serial point2point
14
Note : La table load-share page précédente montre la distribution de charge 0 1 2
0 1 2…. , et le partage de trafic est 1 pour chaque route. Ceci signifie un partage de charge par destination de coût égal parmi trois routes de coûts égaux Vérifiez les adjacences Cisco Express Forwarding RouterB#show adjacency detail Protocol Interface Address IP Serial point2point(11) 0 packets, 0 bytes 0F000800 CEF expires: 00:02:31 refresh: 00:00:31 IP Serial point2point(11) IP Serial point2point(11) 6. Confirmez que le mécanisme d'équilibrage de charge CEF attendu est configuré sur toutes les interfaces de sortie RouterB#show ip cef /24, version 89, per-destination sharing via , Serial1, 0 dependencies traffic share 1 next hop , Serial1 valid adjacency [sortie omise] 7. Validez la comptabilité sur l'index de hachage afin de collecter des statistiques pour mieux comprendre CEF dans votre réseau. Par exemple vous aimeriez collec- ter des informations telles que le nombre de paquets et d'octets commutés vers une destination ou le nombre de paquets commutés à travers une destination. Utilisez la commande suivante : router(config)# ip cef accounting load-balance-hash
15
Vérifiez le flux de paquets en observant les valeurs dans le champ Packets RouterB#show ip cef internal [...] Load distribution: (refcount 1) Hash OK Interface Address Packets 1 Y Serial point2point 2 Y Serial point2point 3 Y Serial point2point 4 Y Serial point2point 5 Y Serial point2point 6 Y Serial point2point 7 Y Serial point2point 8 Y Serial point2point 9 Y Serial point2point 10 Y Serial point2point 11 Y Serial point2point 12 Y Serial point2point 13 Y Serial point2point 14 Y Serial point2point 15 Y Serial point2point 125 paquets passent par l'interface Serial 2. Si vous utilisez ping pour générer du trafic, assurez-vous que les paquets doivent transiter par le routeur utilisant CEF. En d'autres termes, les paquets du ping doivent entrer sur une interface avec la commutation CEF et sortir sur une autre interface avec commutation CEF Note : L'équilibrage de charge par-destination devient plus efficace dès que le nombre de paires source-destination augmente Tout en transmettant du trafic vers le préfixe, capturez plusieurs sorties de la com- mande show interface. Analysez les valeurs "txload" et "rxload". Bien que l'équi- librage de charge par paquet fournisse une distribution égale dans le nombre de paquets, des liaisons parallèles peuvent montrer un débit non-égal selon la taille des paquets. Serial1/0:0 is up, line protocol is up reliability 255/255, txload 10/255, rxload 3/255 Serial1/1:0 is up, line protocol is up reliability 255/255, txload 18/255, rxload 3/255
16
9. Avec l'équilibrage de charge CEF par destination vous pouvez déterminer vers quel chemin une session est affectée avec la commande suivante. Ajoutez le mot-clé internal pour afficher l'index de hachage utilisé. show ip cef exact-route {source-ip-address} {dest-ip-address} [internal] RouterB# show ip cef exact-route internal > : Serial9/0 (next hop ) Bucket 4 from 15, total 3 paths RouterB# show ip cef exact-route internal > : Serial9/0 (next hop ) Bucket 7 from 15, total 3 paths RouterB# show ip cef exact-route internal > : Serial9/0 (next hop ) RouterB# show ip cef exact-route internal > : Serial9/0 (next hop ) Bucket 13 from 15, total 3 paths 10. Si la sortie apparaît inégale, considérer ce qui suit : Le nombre de paires d'adresses source et destination ou sessions uniques passant par les liaisons parallèles Le nombre et la taille des paquets dans chaque session. Est-ce qu'une session a un plus grand nombre de paquets? L'équilibrage de charge par destination dépend de la distribution statistique du trafic et devient plus efficace quand le nombre de paires adresses source-destination augmente. Partage de charge après un changement de liaison Quand un changement dans la table de routage modifie le nombre de chemins actifs vers une destination, Cisco Express Forwarding met à jour les structures pour l'équili- brage de charge vues dans la sortie de la commande show ip cef {prefix} internal. Cisco Express Forwarding fait ensuite les nouveaux paquets arrivant avec une adja- cence et un index de hachage correspondant. L'index de hachage peut être ou non le même que celui utilisé précédemment. Les étapes suivantes décrivent comment l'information d'équilibrage de charge Cisco Express Forwarding se met à jour après un changement dans le nombre de chemins actifs vers un préfixe destination Supposons qu'un préfixe de destination est accessible à travers deux chemins Le Chemin 1 est inactif et le Chemin 2 est actif et transporte tout le trafic Quand le Chemin 1 est de nouveau disponible, il active le processus de reconver- gence IP.
17
3. Cisco Express Forwarding équilibre la charge sur les deux chemins et ne préserve pas le flux existant sur le chemin 2. Faire cela aurait laissé le chemin 1 non-utili sé. En d'autres termes Cisco Express Forwarding ne considère pas qu'il peut ache miner des paquets pour une session sur un chemin valide et pourrait sélectionner un nouveau chemin pour un flux selon l'index de hachage qu'il choisit Information de partage de charge due à l'effacement Après un changement dans la table de routage, Cisco Express Forwarding efface et reconstruit les structures de l'équilibrage de charge qui affectaient les chemins actifs aux index de hachage. Pendant le processus de reconstruction, quelques paquets peuvent être perdus et la commande show ip cef {prefix} internal indique Load sharing information due for deletion. router#show ip cef int /28, version 63, per-destination sharing 0 packets, 0 bytes via , 0 dependencies, recursive next hop , POS0/0/0 valid adjacency Load sharing information due for deletion Les modifications implémentées au travers de Cisco bug ID CSCdm87127 minimisent la perte de paquet pendant la modification du nombre de chemins actifs pour la route par défaut Spécifiquement, CEF alloue maintenant une entrée de FIB avec un espace pour le maximum de chemins actifs possibles pour cette route.
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.