2014-06-25 2 views
-1

Je souhaite modifier les paquets que j'ai et envoyer ces paquets via la carte réseau. Pour ce faire, j'ai besoin de calculer ma couche UDP Checksum.Calcul de la somme de contrôle de couche UDP

Je suis donc trouvé this fonction qui prend un tableau et renvoie la Checksum, mais j'ai deux petites questions:

  1. couche UDP a 8 octets: port 2 source, 2 port de destination, 2 longueur et 2 somme de contrôle. la fonction que j'ai trouvé doit être appelée avec un tableau, alors devrais-je envoyer cette fonction mon tableau de 6 octets avec ou sans les 2 octets de somme de contrôle?

  2. Cette fonction mentionne qu'elle calcule la somme de contrôle IP, ce qui permet également de calculer la somme de contrôle UDP?

    Edit:

J'ai trouvé this article qui calculent IP/TCP/UDP de, puis-je avoir de l'aide pour convertir le code de calculer la somme de contrôle UDP en C#?

+0

Avez-vous vérifié wikipedia? Belle page avec algos et tout. – TomTom

+0

oui j'ai vérifié – user3637066

+0

Les sommes de contrôle IP n'utilisent que l'en-tête. Les sommes de contrôle TCP/UDP utilisent l'en-tête et les données. – clcto

Répondre

0

L'auteur de ce poste dit dans ses commentaires

» ... Le premier paramètre est le tableau d'octets contenant le paquet en-tête IP (déjà formé, mais avec le champ de contrôle [deux octets] mis à zéro). "

Vous devez donc définir les deux octets de somme de contrôle (octets 7 et 8) sur zéro, puis envoyer tous les 8 octets de votre en-tête pour que la somme de contrôle soit calculée. Comme pour les sommes de contrôle UDP/IP, ce sont deux choses différentes et l'auteur a déclaré que ce calcul était spécifiquement pour la création d'une somme de contrôle d'en-tête IP.

+0

donc je peux utiliser cette fonction pour la somme de contrôle UDP? – user3637066

+0

Non. Comme indiqué dans la dernière phrase, l'auteur a dit qu'il s'agissait d'une somme de contrôle d'en-tête IP. Cela produira sans doute la mauvaise valeur pour une somme de contrôle UDP.Voir l'article SO pour plus d'informations sur les sommes de contrôle UDP: http://stackoverflow.com/questions/1480580/udp-checksum-calculation – GEEF

+0

Veuillez consulter ma mise à jour – user3637066

0

Avez-vous essayé de le régler à zéro? Selon RFC 768, il est facultatif.

http://tools.ietf.org/html/rfc768

« Une toute valeur de contrôle transmis zéro signifie que l'émetteur a généré aucune somme de contrôle (pour le débogage ou pour les protocoles de niveau supérieur qui ne se soucient pas). »

Si vous voulez vraiment le calculer, vous pouvez essayer la fonction assemble_udp_ip_header dans FreeBSD: http://svnweb.freebsd.org/base/head/sbin/dhclient/packet.c?view=markup.

Vous ne devez pas l'appeler avec un tableau de 6 octets car la procédure de somme de contrôle doit être exécutée sur le pseudo-en-tête. Alors que vous pourriez probablement utiliser la fonction que vous avez mentionnée sur le pseudo en-tête, je suppose qu'il a un bug où il peut accéder après la fin du tableau si le paramètre length n'est pas pair.

La somme de contrôle que vous avez calculée est incorrecte car elle doit être calculée dans l'en-tête psuedo. Il vous manque des champs tels que le protocole, la source d'adresse IP, la destination de l'adresse IP et la charge utile réelle. Vous écrivez aussi seulement sur 6 des 8 octets que vous avez alloués.

+0

Veuillez consulter ma mise à jour – user3637066

Questions connexes