Приклад розрахунку контрольної суми в протоколах ТСР/ІР

Перед розрахунком контрольної суми в протоколах ТСР/ІР повідомлення доповнюється в кінці нульовими бітами до довжини, кратної 16 бітам (додаткові нульові біти не відправляються разом з повідомленням). Початкове значення контрольної суми у час розрахунку контрольної суми повідомлення, що відправляється, приймається за нуль.

Для розрахунку контрольної суми уся інформація, для якої розраховується контрольна сума, розбивається на слова (1 слово = 2 байти (2 октети) = 16 біт). Потім розраховується порозрядне доповнення до одиниці суми всіх слів з порозрядним доповненням. Результат записується у відповідне поле заголовку.

У тому випадку, якщо контрольна сума вийшла рівною нулю, поле заповнюють одиницями. Якщо контрольну суму не потрібно розраховувати, значення поля залишають нульовим.

Для прикладу розрахуємо контрольну суму декількох 16-бітових слів: 0x398А, 0xF802, 0x14B2, 0xC281. Нагадаємо, що тут, як і в деяких мовах програмування позначка “0х” є префіксом, ознакою того, що далі записане число в шістьнадцатьковій системі числення. Знаходимо їх суму з переносом старшої (п’ятої) тетради (в разі її наявності) до молодшої та доповненням останнього біта молодшої тетради:

0x 3 9 8 A + 0x F 8 0 2 = 0011 1001 1000 1010 + 1111 1000 0000 0010 =

0011 1001 1000 1010

1111 1000 0000 0010

00010011 0001 1000 1100→


= 0001 0011 0001 1000 1100 → 0x 3 1 8 С → 0011 0001 1000 1101 = 0x 3 1 8 D


0x318D + 0x14B2 = 0011 0001 1000 1101 + 0001 0100 1011 0010 =

0011 0001 1000 1101

0001 0100 1011 0010

0000 0100 0110 0011 1111→


= 0000 0100 0110 0011 1111 = 0x0463F → 0x463F

0x463F + 0xC281 = 0100 0110 0011 1111 + 1100 0010 1000 0001 =

0100 0110 0011 1111

1100 0010 1000 0001

0001 0000 1000 1100 0000→


= 0001 0000 1000 1100 0000 → 0000 1000 1100 0001 →0x08C1

 
 


Тепер знаходимо порозрядне доповнення до одиниці отриманого результату:

0x08C1 = 0000 1000 1100 0001 → 1111 0111 0011 1110 = 0xF73E або, інакше - 0xFFFF - 0x08C1 = 0xF73E. Це і є шукана контрольна сума

При отриманні повідомлення одержувач рахує контрольну суму заново (уже з урахуванням контрольної суми), і, якщо в результаті вийде двійкове число з шістнадцяти одиниць (тобто 0xffff), то контрольна сума вважається такою, що збіглася, і повідомлення приймається.

Таблиця переводу чисел

0hex = 0dec = 0oct   8hex = 8dec = 10oct
1hex = 1dec = 1oct   9hex = 9dec = 11oct
2hex = 2dec = 2oct   Ahex = 10dec = 12oct
3hex = 3dec = 3oct   Bhex = 11dec = 13oct
4hex = 4dec = 4oct   Chex = 12dec = 14oct
5hex = 5dec = 5oct   Dhex = 13dec = 15oct
6hex = 6dec = 6oct   Ehex = 14dec = 16oct
7hex = 7dec = 7oct   Fhex = 15dec = 17oct