C Programmation TCP Checksum
J'ai eu du mal à faire la somme de contrôle TCP depuis plusieurs jours maintenant. J'ai regardé de nombreuses sources sur Internet, mais aucun des exemples que j'ai vu de vous montrer comment faire le total de contrôle TCP. J'ai aussi regardé le RFC document et encore j'ai de la difficulté:
Ci-dessous c'est le code que j'utilise pour générer la somme de contrôle:
unsigned short checksum(unsigned short * buffer, int bytes)
{
unsigned long sum = 0;
unsigned short answer = 0;
int i = bytes;
while(i>0)
{
sum+=*buffer;
buffer+=1;
i-=2;
}
sum = (sum >> 16) + (sum & htonl(0x0000ffff));
sum += (sum >> 16);
return ~sum;
}
Cette fonction fonctionne pour la somme de contrôle IP.
Ci-dessous est la structure que j'ai fait pour mon en-tête TCP:
struct tcp_header
{
unsigned short tcp_sprt;
unsigned short tcp_dprt;
unsigned int tcp_seq;
unsigned int tcp_ack;
unsigned char tcp_res:4;
unsigned char tcp_off:4;
unsigned char tcp_flags;
unsigned short tcp_win;
unsigned short tcp_csum;
unsigned short tcp_urp;
};
J'ai été en utilisant Wireshark pour tester ces paquets et la seule chose de mal, c'est la somme de contrôle.
Enfin, voici le pseudo-en-tête struct que je charge avec l'en-tête TCP et de l'information de l'en-tête IP:
struct pseudoTcpHeader
{
unsigned int ip_src;
unsigned int ip_dst;
unsigned char zero;//always zero
unsigned char protocol;//= 6;//for tcp
unsigned short tcp_len;
struct tcp_header tcph;
};
Une fois que je charge cette structure avec les informations correctes j'utilise ensuite la fonction de la somme de contrôle sur l'ensemble de la pseudo-en-tête struct et affecter le total de contrôle TCP à cette valeur. Voyez-vous quelque chose de mal avec ce que j'ai fourni? Si le problème n'est pas ici, il peut être une mauvaise erreur que je ne peux pas voir.
OriginalL'auteur Hudson Worden | 2012-01-13
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé un assez bon exemple sur le winpcap-liste de diffusion des utilisateurs qui devrait répondre à Greg commentaire à propos de longueur impaire de données et vous donner quelque chose à comparer votre code contre.
OriginalL'auteur synthesizerpatel
Je vois un couple de choses:
htonl(0x0000ffff)
semble suspect. Pourquoi êtes-vous de la conversion d'une constante à réseau ordre des octets de les combiner avec des données dans hôte ordre des octets?OriginalL'auteur Greg Hewgill
RFC 793 dit "Si un segment contient un nombre impair d'en-tête et le texte octets être calculée, le dernier octet est rembourré sur la droite avec des zéros pour former un 16 bits mot de somme de contrôle." Votre code ci-dessus ne permet pas de gérer ce cas. Je pense que la boucle conditionnelle devrait être i > 1, puis vérifier pour i == 1 à l'extérieur de la boucle et de faire le traitement spécial pour le dernier octet.
OriginalL'auteur Kyle Jones
J'ai trop de mal à le trouver c++/c le code qui calcule, jusqu'à ce que j'ai trouvé Comment Calculer IP/TCP/UDP Checksum–Partie 2 mise en Œuvre – roman10, et cela a fonctionné! Testé avec Wireshark validation.
OriginalL'auteur david-hoze