next up previous contents
Next: Capture des paquets Up: Noyau Previous: Noyau   Contents

Mais qu'est ce qu'un paquet : structure

Toujours à l'aide de WinPcap, nous pouvons recevoir les données d'une carte réseau, sous la forme la plus basique, c'est-à-dire un pointeur sur une zone mémoire et la longueur de la donnée.
Alors pour pouvoir manipuler les paquets, une structure leur est appliquée, ce qui a pour effet d'enregistrer chaque élément du paquet pour que l'on puisse facilement désigner chaque octet (par exemple pour désigner le port source de l'entête TCP on aura "Tcp_Hd.SrcPort").
Pour définir la suite ou l'enchaînement des entêtes on peut représenter un paquet par ce type schema :
    ([ETHERNET]([      DONNÉES     ]))   : Trame Ethernet
               ([IP]([    DONNÉES  ]))   : Datagramme IP
                    ([TCP]([DONNÉES]))   : Datagramme TCP
On lie les structures avec des pointeurs, par exemple le champ "DONNÉES" de la couche ETHERNET n'est qu'un pointeur vers la couche IP qui contient différents champs dont un champ de "DONNÉES" qui ne sera qu'un pointeur vers la couche TCP...
Chaque entête est donc un type de donnée contenant tout les champs nécessaires.
Exemple : Structure d'entête Ethernet type PEth_Hd = Eth_Hd; Eth_Hd = packed record Destinataire : array[0..5] of byte; Expéditeur : array[0..5] of byte; Protocole : Word; Data : pointer; //Data est un pointer sur le reste de la donnée// end;
Adresse
éthernet de
destination
Adresse
éthernet de
source
Type
de
trame
En-tête Ethernet
Mais pour certaines fonctions, nécessitant un accès plus direct aux données, par exemple pour les calculs de checksum, il est indispensable d'avoir le paquet sous la forme d'un tableau d'octet. Pour ce faire, nous utilisons un type de tableau dynamique (TTabByte = Array of Byte) pour 'Caster' la donnée (pTab := @TTabByte(Data)). Bien sûr, le fait de structurer ('Caster') la donnée ne la recopie pas.
Mais ce n'est pas par ce qu'il nous faut la donnée sous deux formes différentes que nous allons avoir deux versions de la même chose, ce serait trop coûteux en mémoire.
On structure donc deux fois la même donnée dans deux pointeurs différents, donc pas de gaspillage de mémoire.

next up previous contents
Next: Capture des paquets Up: Noyau Previous: Noyau   Contents
root 2002-06-23