Groupe de travail Réseau

T. Mallory

Request for Comments : 1141

A. Kullberg

Mise à jour : RFC 1071

BBN Communications

Traduction Claude Brière de L'isle

janvier 1990

 

 

Mise à jour incrémentaire de la somme de contrôle Internet

 

Statut de ce mémoire

Le présent mémoire décrit correctement la procédure de mise à jour incrémentaire à utiliser avec la somme de contôle standard de l'Internet. Il est destiné à remplacer la description de la mise à jour incrémentaire de la RFC 1071. Ce n'est pas une norme mais plutôt une technique de mise en œuvre. La distribution du présent mémoire n'est soumise à aucune restriction.

 

Description

Aux pages 4 et 5 de la RFC 1071 figure la description d'une méthode de mise à jour de la somme de contrôle IP dans l'en-tête IP sans avoir à recalculer complètement la somme de contrôle. En particulier, la RFC recommande l'équation suivante pour calculer la mise à jour de la somme de contrôle C' à partir de la somme de contrôle d'origine C, et des valeurs ancienne et nouvelle de l'octet m :

 

C' = C + (-m) + m' = C + (m' - m)

 

Bien que l'équation ci-dessus soit correcte, elle n'est pas très utile pour les mises à jour incrémentaires car l'équation ci-dessus met à jour la somme de contrôle C, plutôt que le complément à un de la somme de contrôle, ~C, qui est la valeur mémorisée dans le champ Somme de contrôle. De plus, elle souffre de ce que la notation ne spécifie pas clairement toute l'arithmétique, incluant la négation unaire, qui doit être effectué sur le complément à un, et elle est donc difficile à utiliser pour construire un code opérationnel. Le calcul utile pour les machines de complément à 2 est :

 

~C' = ~(C + (-m) + m') = ~C + (m - m') = ~C + m + ~m'

 

Dans le cas souvent mentionné de mise à jour du champ IP TTL, soustraire 1 au TTL signifie AJOUTER 1 ou 256 selon le cas approprié au champ Somme de contrôle dans le paquet, en utilisant l'addition de complément à 1. Une mise en œuvre gros boutienne non portable en C ressemblerait à :

 

unsigned long sum;

ipptr->ttl--;   /* décrémenter ttl */

sum = ipptr->Checksum + 0x100;   /* incrémenter l'octet de fort poids de la somme de contrôle*/

ipptr->Checksum = (sum + (sum>>16))   /* ajouter le report */

 

Ce cas particulier peut être optimisé de nombreuses façons : par exemple, on peut faire un paquet de la mise à jour et de la vérification du ttl. Ce n'est pas une règle absolue des compilateurs. Voici un exemple plus général et peut être de plus d'utilité qui met à jour le ttl de n secondes :

 

UpdateTTL(iph,n)

struct ip_hdr *ipptr;

unsigned char n;

{

unsigned long sum;

unsigned short old;

 

old = ntohs(*(unsigned short *)&ipptr->ttl);

ipptr->ttl -= n;

sum = old + (~ntohs(*(unsigned short *)&ipptr->ttl) & 0xffff);

sum += ntohs(ipptr->Checksum);

sum = (sum & 0xffff) + (sum>>16);

ipptr->Checksum = htons(sum + (sum>>16));

}

 

Considérations pour la sécurité

 

Les questions de sécurité ne sont pas abordées dans le présent mémoire.

 

Adresse des auteurs

 

Tracy Mallory

A. Kullberg

BBN Communications Corporation

BBN Communications Corporation

50 Moulton Street

50 Moulton Street

Cambridge, MA 02238

Cambridge, MA 02238

Téléphone : (617) 873-3193

téléphone : (617) 873-4000

mél : tmallory@CCV.BBN.COM

mél : akullberg@BBN.COM