4 Amélioration de la pile TCP/IPv4
Il est maintenant temps d'améliorer la pile TCP/IPv4 de vos ainés.
4.1 Structure en couches
Regardez comment les différentes couches de la pile TCP/IP sont déclarées dans la structure
de données stackLayers du fichier stack.c. Explorez aussi les fichiers net*.c
pour comprendre comment les différentes couches appellent les couches supérieures (dans les
fonctions xxxDecodePacket) et les couches inférieures (dans les fonctions
xxxSendPacket). En particulier, notez comment les tableaux associatifs sont
utilisés pour communiquer entre les couches.
4.2 Gestion mémoire
En supposant que la primitive realloc soit capable de changer la taille des blocs
mémoire sans jamais devoir déplacer ces blocs et que la fonction memmove soit
capable de déplacer les données sans jamais utiliser de mémoire tampon, donnez la
taille de l'espace mémoire utilisée sur le tas dans les situations suivantes :
-
récupération d'une requête ARP et réponse ARP ;
- récupération d'un paquet UDP et réponse UDP à ce paquet UDP.
Détaillez l'utilisation mémoire selon les couches de la pile.
4.3 Protocole ARP
Vérifiez que la pile TCP/IP gère déjà correctement ARP, en particulier les requêtes ARP.
Lancez la pile, affectez une adresse IP à l'interface Ethernet virtuelle dans le même
réseau IP que la pile, et lancez un ping sur l'adresse IP de la pile. Arrêtez
l'utilitaire ping et vérifiez que la requête ARP de votre machine de TP a bien
reçu une réponse.
4.4 Prise en compte des réponse ARP
Relancez l'utilitaire ping sur l'adresse IPv4 de votre pile TCP/IPv4.
Comparez le premier temps d'aller-retour des sondes ICMPv4 avec les temps suivants.
Que constatez-vous ? Examinez le code pour comprendre le pourquoi de vos constatations.
Vos observations doivent vous conduire à une constante particulière. Quel est son nom ?
4.5 Amélioration pour ARP
En utilisant l'astuce de programmation employée dans l'exercice 3.4 supprimez
le délai de prise en compte des réponses ARP dans la pile TCP/IPv4. Vous pouvez suivre
les suggestions suivantes.
-
Modifiez la structure de la table ARP pour permettre d'y stocker deux types d'entrées;
les entrées classiques et les entrées incomplètes. Les entrées classiques sont constituées
d'une adresse IP, d'une adresse MAC et d'une estampille de temps. Les entrées incomplètes
comprennent un identifiant, l'adresse IP et un descripteur.
- Modifiez le mode de réémission d'un paquet IP; passez d'une réémission sur expiration
de minuteur à une réémission sur activité d'un tube. Le descripteur d'écriture du tube est
passé à la couche ARP à la faveur de la demande d'émission de requête ARP.
- Créez un événement local à la couche ARP. L'action liée à cet événement doit utiliser
l'identifiant d'entrée incomplète passée en donnée du sélecteur pour trouver le descripteur
permettant de signaler l'arrivée d'une réponse ARP.
- Faites en sorte qu'une entrée incomplète soit insérée dans le cache ARP dès l'envoi
d'une requête ARP. En profiter pour prévoir le déclenchement d'un événement ARP après
l'expiration d'un minuteur.
- Lors de l'arrivée d'une réponse ARP, trouver l'ensemble des entrées incomplètes
concernées. Signaler les paquets en attente à l'origine de ces entrées incomplètes.
- Modifier le mécanisme de purge du cache ARP pour supprimer les entrées incomplètes
ayant été utilisées.