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