2017-08-27 2 views
0

J'essaie de calculer manuellement les totaux de contrôle pour divers paquets UDP, mais je reçois toujours de mauvais résultats par rapport à ce qui est montré dans Wireshark. Voici un exemple de la façon dont je le fais:Mon calcul de somme de contrôle UDP donne des résultats erronés à chaque fois

Source Address: 192.168.0.103 (0xC0A8, 0x0067) 
Destination Address: 192.168.0.1 (0xC0A8, 0x0001) 

Source Port: 57090 (0xDF02) 
Destination Port: 8000 (0x1F40) 

Packet length: 19 (0x0013) 
Data: hello world (0x6865, 0x6C6C, 0x6F20, 0x776F, 0x726C, 0x6400) 

Expected checksum: 0xEDFD (from wireshark) 

Je comprends que la somme de contrôle UDP est calculé avec les variables suivantes:

Source IP + Destination IP + 17 (0x0011 - protocol code) + 10 (0x000A - pseudoheader length) + Source Port + Destination Port + UDP Packet Length + Data 

tous dans des groupes de 16 bits.

Alors mes calculs sont (dans le même ordre):

0xC0A8 + 0x0067 + 0xC0A8 + 0x0001 + 0x0011 + 0x000A + 0xDF02 + 0x1F40 + 0x0013 + 0x6865 + 0x6C6C + 0x6F20 + 0x776F + 0x726C + 0x6400 

Le résultat de la somme ci-dessus est:

0x511F4 

Maintenant, puisque le résultat est supérieur à 0xFFFF je fais ce qui suit :

0x11F4 + 0x0005 = 0x11F9 

Après retournement des bits I obtenir le résultat:

0xEE06 <- which, as you can see, it is different from the expected one 

Donc, ma question est ce que je fais mal? Je reçois toujours presque le résultat de ce qui est montré dans wireshark.

est ci-dessous une capture d'écran du paquet à l'intérieur Wireshark, comme référence https://www.evernote.com/l/AWl0H1AGoxpGX4_zjgDlVBcytJM-HP_PvQE

+0

Il existe un RFC à ce sujet. L'avez-vous lu? – EJP

+0

Oui, j'ai lu RFC768. – Ibrahim

Répondre

0

J'ai trouvé ce que je faisais mal, dans le cas où quelqu'un d'autre a un problème similaire.

La façon dont je calculait l'en-tête de pseudo était comme ça:

Source IP + Destination IP + 17 (0x0011 - protocol code) + 10 (0x000A - pseudoheader length) 

Le problème était à l'octet de longueur. Ce devrait être la longueur du paquet UDP, pas la longueur du pseudo-en-tête.

La formule finale est la suivante:

Source IP + Destination IP + 17 (0x0011 - protocol code) + UDP Packet Length + Source Port + Destination Port + UDP Packet Length + Data 

Notez la longueur UDP Packet apparaît deux fois. D'abord pour le pseudo-en-tête et ensuite pour l'en-tête UDP actuel.