MTProd > Dev4all > Articles > Programmation > Réseau > Programmation Winsock avancée avec les systèmes NT > 4 Les différents protocoles
Rechercher13 Personnes en-ligne
Programmation Winsock avancée avec les systèmes NT

4  Les différents protocoles

Pour pouvoir jouer avec l'en tête des datagrammes il va déjà falloir connaitre à quoi celle-ci correspond. Je vais essayer ici de vous décrire les options des protocoles de bases comme le protocole IP, TCP, ou encore ICMP. Pour forger votre propre en tête, vous allez tout simplement devoir remplir les structures représentants l'entête des datagrammes voulus.



4.1  Le protocole IP (Internet Protocol)

Ce protocole joue un rôle majeur sur Internet. Celui-ci assure sans connexion un service non fiable de délivrances de paquets IP. Ce service est dit non fiable car il n'assure pas la délivrance de chaque paquet à l'host de destination, ces paquets peuvent très bien être perdus, retardés, dupliqués, altérés, ou encore mis dans le désordre. Et aucune option dans le paquet indique ce genre de problème. En plus concis, nous pouvons dire que ce protocole gère le routage sur Internet.

Voici à quoi ressemble ce type de datagramme :



Figure 4.1.1: Paquet IP

Etudions ensemble chacunes des options présentes dans ce datagramme :

version : ce champ définie la version du protocole IP voulut, actuellement la version la plus courante est la 4 (IPv4), elle est codée sur 4 bits. si ce champ n'est pas initialisé avec une valeur correcte, le paquet est tout simplement rejeté.

longueur d'en-tête : il s'agit du nombre de mots de 32 bits sur lesquels sont répartis l'en-tête, toujours codé sur 4 bits.

type de service (tos: type of service) : ce champ indique la façon dont les packets doivent être traités. il est codé sur 8 bits.

longueur totale : il s'agit de la taille totale en octets du datagramme, et comme ce champ est de 2 octets on en déduit que la taille complète d'un datagramme ne peut dépasser 65535 octets. Utilisée avec la longueur de l'en-tête elle permet de déterminer où; commencent exactement les données transportées.

identification, drapeaux (flags) et déplacement de fragment : ces trois champs interviennent dans le processus de fragmentation des datagrammes IP, nous ne rentrerons pas dans de profonds détails à ce sujet, pour ceci aller plutôt vous renseigner auprès du rfc. (IP - internet protocol, RFC 791)

durée de vie (ttl : time to live) : ce champ indique le nombre maximum de routeurs que peut traverser notre paquet. cela permet d'éviter qu'un datagramme "tourne" indéfiniment sur internet. il permet aussi la réalisation d'un outil comme traceroute.

protocole : ce champ permet de savoir quel protocole de plus haut niveau a servi a créé ce datagramme. Les valeurs codées etant codées sur 8 bits sont : 1 pour ICMP, 2 pour IGMP, 6 pour TCP et 17 pour UDP. Ainsi, la station destinatrice qui reçoit un datagramme IP pourra diriger les données qu'il contient vers la couche adéquate.

somme de contrôle en-tête : ce champ contient une valeur codée sur 16 bits qui permet de contrôler l'intégrité de l'en tête afin de déterminer si celui-ci n'a pas été altéré pendant la transmission. La somme de contrôle est le complément à un de tous les mots de 16 bits de l'en-tête (champ somme de contrôle exclu). Celle-ci est en fait telle que lorsque l'on fait la somme des champs de l'en-tête (somme de contrôle inclue), on obtient un nombre avec tous les bits positionnés à 1.

adresse IP source : ce champ représente l'adresse IP de la machine émettrice, il permet au destinataire de répondre (codée sur 32 bits).

adresse IP destination : adresse IP du destinataire (toujours codée sur 32 bits).


Maintenant observons la structure associée à ce type de datagramme :

typedef struct iphdr {
unsigned char verlen; /* version du protocol IP + la longeur de l'en tète */
unsigned char tos;     /* type de service */
unsigned short tot_len; /* longueur totale du datagramme */
unsigned short id;     /* identification */
unsigned short offset; /* décalage */
unsigned char ttl;     /* durée de vie du paquet */
unsigned char protocol; /* protocole */
unsigned short checksum; /* somme de contrôle */
unsigned int saddr; /* adresse IP source */
unsigned int daddr; /* adresse IP destinataire */
} IP_HDR;





4.2  Le protocole TCP (Transmission Control Protocol)

Ce protocole assure la liaison entre les applications et la couche inférieure du modèle (IP), il est trés utilisé sur l'internet pour sa fiabilité que cela soit au niveau de la vérification de l'état des paquets, ou encore grâce à sa sécurité et ses possibilités de multiplexage/démultiplexage.

Observons comment est constitutuée une trame TCP :



Figure 4.2.1: Trame TCP

Etudions ensemble les champs constituant ce datagramme :

port source : ce champ est codé sur 16 bits, il correspond au port relatif à l'application en cours sur la machine source.

port destination : toujours codé sur 16 bits, il correspond au port relatif à l'application en cours sur la machine de destination.

numéro de séquence (isn) : champ codé sur 32bits, il correspond au numéro du premier octet de données par rapport au début de la transmission (sauf si syn est marqué). si syn est marqué, le numéro de séquence est le numéro de séquence initial (isn) et le premier octet à pour numéro isn+1.

accusé de réception : champ codé sur 32 bits. si ack est marqué ce champ contient le numéro de séquence du prochain octet que le récepteur s'attend à recevoir. une fois la connexion établie, ce champ est toujours renseigné.

décalage données (data offset) : taille de l'en-tête TCP en nombre de mots de 32 bits. Il indique ou commence les données. L'en tête TCP, dans tous les cas à une taille correspondant à un nombre entier de mots de 32 bits.

réservé : codé sur 6 bits. Réservé pour usage futur. Doivent nécessairement être à 0.

bits de contrôle : toujours codé sur 6 bits, ces "flags" indique le "type" du paquet.

  • urg: pointeur de données urgentes significatif

  • ack: accusé de réception significatif

  • psh: fonction push

  • rst: réinitialisation de la connexion

  • syn: synchronisation des numéros de séquence

  • fin: fin de transmission



fenêtre : nombre d'octets à partir de la position marquée dans l'accusé de réception que le récepteur est capable de recevoir. Codé sur 16 bits.

somme de contrôle (checksum) : ce champ contient une valeur codée sur 16 bits qui permet de contrôler l'intégrité de l'en tête afin de déterminer si celui-ci n'a pas été altéré pendant la transmission. La somme de contrôle est le complément à un de tous les mots de 16 bits de l'en-tête (champ somme de contrôle exclu). Celle-ci est en fait telle que lorsque l'on fait la somme des champs de l'en-tête (somme de contrôle inclue), on obtient un nombre avec tous les bits positionnés à 1.

pointeur de données urgentes : communique la position d'une donnée urgente en donnant son décalage par rapport au numéro de séquence. Le pointeur doit pointer sur l'octet suivant la donnée urgente. Ce champs n'est interprété que lorsque urg est marqué. ce champ est également codé sur 16 bits.

options : les champs d'option peuvent occuper un espace de taille variable à la fin de l'en-tête TCP. ils formeront toujours un multiple de 8 bits. Toutes les options sont prises en compte par le checksum. Un paramètre d'option commence toujours sur un nouvel octet. (voir rfc 793 pour plus de renseignement)

remplissage (padding) : les octets de bourrage terminent l'en-tête TCP :

  • de sorte que le nombre d'octet de celle-ci soit toujours multiple de 4 (32 bits)

  • de sorte que l'offset de données marqué dans l'en-tête corresponde bien au début des données applicatives.



options : la taille maximale de segment de ce champ est de 16 bits. si cette option est présente, elle communique à l'émetteur la taille maximale des segments qu'il pourra envoyer. ce champ doit être envoyé dans la requête de connexion initiale (avec syn marqué). si cette option est absente, le segment pourra être pris de n'importe quelle taille.


Maintenant nous pouvons étudier la structure associée à ce type de trame :

typedef struct tcphdr
{
    unsigned short sport; /* port source */
    unsigned short dport; /* port de destination */
    unsigned int seqnum; /* numéro de séquence */
    unsigned int acknum; /* accusé de réception */
    unsigned char dataoffset; /* décalage des données (data offset) */
    unsigned char flags;     /* flags */
    unsigned short windows; /* fenêtre */
    unsigned short checksum; /* checksum */
    unsigned short urgpointer; /* pointeur de données urgentes */
} TCP_HDR;





4.3  Le protocole ICMP (Internet Control Message Protocol)

ICMP est le protocole utilisé pour gérer les informations contrôlant le trafic IP, qui permet notamment aux routeurs d'envoyer des messages de contrôle ou d'erreur vers d'autres ordinateurs ou routeurs connectés. Ces messages ICMP sont transportés sur le réseau sous forme de datagramme, ainsi les messages d'erreurs peuvent eux mêmes être sujet d'erreurs. Toutefois en cas d'erreur sur un datagramme transportant un message ICMP, aucun message d'erreur n'est délivré pour éviter un effet "boule de neige" en cas d'incident sur le réseau.

Voici à quoi ressemble ce genre de trame :



Figure 4.3.1: Trame ICMP

Pour ce qui est de la description des différents champs constituant ce type de datagramme je préfère vous envoyer lire le RFC 792, qui est plus précis à ce sujet, il y a trop de types, et de codes pour que je fasse ici une description. Observons plutôt la structure qui est associée à ce datagramme :

typedef struct icmphdr
{
    unsigned char type; /* type ICMP */
    unsigned char code; /* code ICMP */
    unsigned short checksum; /* checksum */
    unsigned short id; /* id, utilisé lors de la reconnaissance entre programmes des paquets ICMP */
    unsigned short sequence; /* séquence */
    unsigned long timestamp; /* timestamp */
} ICMP_HDR;






<<  3  Les raw socketsSommaire5  Forger ses propres paquets  >>

 Accés rapide

1  Winsock 2 et architecture
2  Les Sockets Streams
3  Les raw sockets
4  Les différents protocoles

Le protocole IP (Internet Protocol)

Le protocole TCP (Transmission Control Protocol)

Le protocole ICMP (Internet Control Message Protocol)

5  Forger ses propres paquets
6  Programmer un sniffer grâce aux raw sockets
7  Références
8  Remerciements
Voir le sommaire complet

 Liens utiles

  • Publier un article
  • Envoyer cette page
  • Ecrire à l'auteur

  •  Mini-Chat

    Thienou (00h11): salut
    Thienou (00h13): Oula mon inscription date de 11 ans je me sent vieux :)
    neowolf25 (17h59): MMF2 en "pay what you want" jusqu'à demain sur
    neowolf25 (17h59): https://www.hu
    mblebundle.com/
    weekly

    Miuka (21h15): Coin coin de 2014
    Miuka (21h15): Des gens qui ont migré sur le forum Clickteam ou ailleurs ?
    Strike (09h45): Salut les vieux !
    Hikarion (12h46): Salut les djeunz
    Hikarion (13h38): A qui profite le scandale ?
    Hikarion (13h44): le chat irc est toujours actif ?

    Votre message



     Archives

     Dev4all Newsletter

    Restez à jour avec la newsletter mensuelle !

    Votre e-mail


    1800 abonnés

     Recommander Dev4all

    Recommandez Dev4all à un ami. Cela fera grandir notre communauté !

    E-mails de vos amis




    [ Accueil | S'inscrire | Mon Dev4all | Communauté | Téléchargements | Articles | Forums | Chat ]

    [ A propos de Dev4all | Aide | La charte Dev4all | Contact ]

    © 2000-2018 MTProd. Tous droits réservés.
    L'utilisation de Dev4all implique l'acceptation et le respect de la charte Dev4all.