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