الخلاصة

  • عرض RFC 1141 طريقة لتعديل قيمة التحقق الموجودة في ترويسة IP عندما تتغير خانة واحدة، مثل انخفاض مدة الحياة TTL أثناء التوجيه.
  • بيّن RFC 1624 أن الصيغة قد تكتب 0xFFFF حين يعطي إعادة الحساب الكامل 0x0000، لأن الحساب بمتمم الواحد يملك تمثيلين للصفر.

على مكتب المحاسب ورقتان تحملان اسم الصفر. كل الخانات في الأولى فارغة، وكلها مملوءة في الثانية. حسابياً قد يصلان إلى النتيجة ذاتها؛ أما ظرف البيانات فيحمل رسماً محدداً من البتات. كان هذا الفرق الصغير كافياً كي يحتاج اختصار شائع لحساب قيمة التحقق في IP إلى تصحيح.

شرح RFC 1071 الصادر في سبتمبر 1988 طريقة جمع كلمات من 16 بت وفق حساب متمم الواحد، ثم وضع متمم المجموع في حقل التحقق. يستطيع المستقبل جمع الترويسة بما فيها ذلك الحقل واعتبار النتيجة المؤلفة من آحاد كلها علامة نجاح. تناول النص أيضاً وسائل توفير الوقت: الجمع المتوازي، تأخير معالجة الحمل، اختلاف ترتيب البايتات وضم الحساب إلى نسخ الذاكرة. وإذا تغير حقل واحد، أمكن استغلال الفرق بدل إعادة جمع كل شيء.

المثال المتكرر هو مدة الحياة TTL. ينقص الموجّه قيمتها، بينما تبقى بقية الترويسة كما كانت. صاغ RFC 1141 في يناير 1990 طريقة عملية لتحديث قيمة التحقق المخزنة نفسها. عندما ينقص TTL درجة واحدة في البايت الأعلى من الكلمة ذات 16 بت، عرض النص إضافة 0x100 إلى حقل التحقق. للموجّه الذي يكرر هذه العملية مع كل حزمة، تبدو الجولة المختصرة معقولة تماماً.

لكن في حساب متمم الواحد يوجد الصفر الموجب 0x0000 والصفر السالب 0xFFFF. يتشابهان في معنى حسابي، ويختلفان بتاً بتاً. أوضح RFC 1624 المنشور في مايو 1994 أن تبسيط معادلة RFC 1141 اعتمد خاصية توزيع لا تصح حين تكون النتيجة صفراً. في تلك اللحظة يمكن أن تنتج المعادلة المختصرة النسخة الخطأ من الصفر داخل الترويسة.

قدّم RFC 1624 الأرقام بدقة. يتغير حقل طوله 16 بت من 0x5555 إلى 0x3285، ومجموع بقية كلمات الترويسة 0xCD7A، وقيمة التحقق القديمة 0xDD2F. الحساب الكامل للترويسة الجديدة يكتب 0x0000. اختصار RFC 1141 يكتب 0xFFFF. أما الصيغة المصححة HC' = ~(~HC + ~m + m') فتعود إلى 0x0000. الحديث هنا عن البتات المخزنة بالفعل، لا عن اسم العدد على الورق؛ ومع وجود حقل غير صفري، لن ينتج الحساب الكامل 0xFFFF قيمةً لذلك الحقل.

ثم تأتي آلة الاستقبال. إذا جمعت الترويسة كلها مع حقل التحقق وبحثت عن نتيجة جميعها آحاد، قبلت القيمتين في المثال. وإذا حسبت قيمة الحقل من جديد وقارنتها بالبتات التي وصلت، أمكنها رفض 0xFFFF. لذلك لم يكن أثر الاختصار في الموجّه منفصلاً عن برنامج التحقق عند الطرف الآخر. الخطأ الحسابي نفسه قد يمر في مسار فحص ويظهر في مسار آخر.

سجل RFC 1624 طريق اكتشاف الحالة: كشفتها اختبارات لمنتج يطبق خوارزمية RFC 1141، وتأكد الحل المعدّل بمحاكاة. لا يعرض المستند اسم المنتج ولا عدداً للحزم المتأثرة. بدلاً من ذلك يضع أمام القارئ حالة قابلة للتكرار وخطوة جبرية فاشلة ومعادلة بديلة. وإذا كانت كلفة التعليمات الإضافية مهمة في التنفيذ، يقدّم المستند صيغة أخرى تعتمد الطرح مع الاستلاف.

بقي تحديث قيمة التحقق من الفرق فكرة نافعة. الذي تغير هو الانضباط عند النهاية: على الترويسة أن تحمل التمثيل الذي يعطيه الحساب الكامل. للصفر توأم في هذه الرياضيات، ولا يجوز ترك اختيار التوأم للمصادفة.