Здесь следует отметить, что большинство людей полностью упускают из виду, это тот факт, что контрольная сумма TCP на самом деле является очень плохой контрольной суммой.
Контрольная сумма TCP является 16-битнойсумма данных.Эта сумма поймает любую пакетную ошибку 15 бит или меньше, и все 16-битные пакетные ошибки, за исключением тех, которые заменяют один ноль дополнения одного на другой (т. Е. 16 соседних битов 1 заменяются 16 нулевыми битами или наоборот).На равномерно распределенных данных ожидается обнаружение других типов ошибок со скоростью, пропорциональной 1 в 2 ^ 16.Контрольная сумма также имеет основное ограничение: сумма набора 16-битных значений одинакова, независимо от порядка, в котором эти значения отображаются.
Источник: ftp: //ftp.cis.upenn.edu/pub/mbgreen/papers/ton98.pdf
Так что, если вы случайным образом перевернете любое количество бит в любом месте в части данных пакета, шансы от 1 до 65536, чтоэта ошибка не обнаруживается, даже если вы вообще не касаетесь контрольной суммы, поскольку новые данные, даже если они полностью повреждены, на самом деле имеют ту же контрольную сумму, что и старая.Если вы просто поменяете местами два 16-битных значения в части данных, независимо от того, какие из них и как часто, вероятность того, что эта ошибка не будет обнаружена даже на 100%, так как порядок, в котором 16-битные значения появляются в части данныхПакет не имеет никакого отношения к значению вычисленной контрольной суммы.
Здесь я хочу сказать, что вам не нужно слишком беспокоиться о довольно маловероятном случае, когда данные и контрольная сумма будут повреждены иэта ошибка не обнаружена, поскольку поврежденная контрольная сумма соответствует поврежденным данным, правда состоит в том, что каждый день миллионы TCP-пакетов в Интернете содержат только поврежденные данные, и эта ошибка не обнаруживается, поскольку неиспорченная контрольная сумма все еще соответствует поврежденным данным.*
Если вам нужно передать данные и вы хотите быть уверены, что данные не были повреждены, одной контрольной суммы TCP, безусловно, недостаточно для этой задачи.Я бы даже осмелился сказать, что контрольной суммы CRC недостаточно для этой задачи, поскольку CRC32 может не обнаружить ошибку, когда затронуто более 32 битов подряд (эти ошибки могут «компенсировать» друг друга).Минимальная контрольная сумма, необходимая для обеспечения безупречной передачи данных, - это значение данных MD5.Конечно, все, что лучше (SHA-1, SHA-256, SHA-384, SHA-512, Whirlpool и т. Д.), Будет работать еще лучше, но MD5 достаточно.MD5 может быть недостаточно безопасным для криптографической защиты (поскольку в прошлом он многократно нарушался), но в качестве контрольной суммы данных MD5 по-прежнему абсолютно достаточен.