Как правильно посчитать контрольную сумму tcp пакета?

Пользователь

от ian.heidenreich , в категории: Другие , 6 месяцев назад

Как правильно посчитать контрольную сумму tcp пакета?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от nicola , 6 месяцев назад

@ian.heidenreich 

Для расчета контрольной суммы TCP пакета используется алгоритм, известный как Checksum Complement.

  1. Создайте переменную с начальным значением нулевого байта.
  2. Разделите TCP пакет на 16-битные сегменты (двухбайтовые сегменты).
  3. Сложите все сегменты пакета, добавляя результат к переменной из шага 1.
  4. Если полученное число содержит перенос, сложите его с младшим байтом.
  5. Продолжайте шаги 3 и 4, пока не пройдете все сегменты.
  6. Инвертируйте биты полученного числа.
  7. Это и будет контрольная сумма TCP пакета.


Примечание: Если размер пакета нечетный, добавьте фиктивный последний нулевой байт перед расчетом контрольной суммы.


Пример:


Представим пакет данных: 4500 003c 1c46 4000 4006 0000 ac10 0a63 ac10 0a0c

  1. Инициализируем переменную checkSum = 0x0000.
  2. Разделяем пакет на сегменты: 4500, 003c, 1c46, 4000, 4006, 0000, ac10, 0a63, ac10, 0a0c.
  3. Добавляем все сегменты к checkSum: checkSum += 4500 + 003c + 1c46 + 4000 + 4006 + 0000 + ac10 + 0a63 + ac10 + 0a0c.
  4. Проверяем перенос и добавляем его к младшему байту: checkSum = (checkSum & 0xffff) + (checkSum >> 16).
  5. Повторяем шаги 3-4, пока не проходим все сегменты.
  6. Инвертируем биты полученного числа: checkSum = ~checkSum.
  7. Полученное значение 0xbfb5 - это контрольная сумма TCP пакета.


Похожий алгоритм расчета контрольной суммы используется во многих языках программирования и сетевых протоколах.