Если вы хотите, чтобы ответ был очень простым, вам нужно принять некоторое упрощение, если вы хотите с этим смириться, вот оно:
Данные передаются по несовершенным ссылкам - ошибки могут возникать напуть.Представьте, что вы хотите, чтобы полученная информация была такой же, как и передаваемая, не тратя слишком много пропускной способности, как бы вы это сделали?
Вы могли бы передавать каждый фрагмент информации дважды, и если на принимающей стороне вы видитечто первый отличается от второго, вы знаете, что произошла ошибка, и вам необходимо запросить данные еще раз - но это было бы очень расточительно, это эффективно сократило бы вашу пропускную способность в два раза.
Теперь, чтоЕсли бы вы могли рассчитать какое-то значение, которое намного меньше, чем сами данные, но зависит от него?Таким образом, если данные изменились по пути (из-за ошибки), вычисленное значение больше не будет «соответствовать» данным, и вы будете знать, что произошла ошибка.Есть ли такой расчет?
А как насчет простого деления и взятия остатка в качестве этого значения?
Скажем, я хочу передать информацию / число 1000.Я делю его на выбранное число - например, 6, что дает мне 166 и остаток 4. Я беру остаток в качестве контрольного значения, которое намного меньше, чем информация, которую я фактически передаю, поэтому я не теряюслишком большая полоса пропускания, и я передаю 1000, а затем 4. Получатель получает его, берет число 1000, делит его на 6, а если остаток равен 4, то предполагается, что ошибки не произошло.
Если произошла ошибкаи он получит 998 вместо 1000 из-за ошибки в ссылке - он разделит ее на 6, получит остаток от 2, который не соответствует 4, и альт знает, что произошла ошибка.Это основной принцип CRC.
Конечно, это немного сложнее, потому что он делится на полином, но принцип использования остатка в качестве «короткого значения, представляющего данные», чтобы проверить его на наличие ошибок втак же стоит.
Надеюсь, это поможет вам разобраться в происходящем;)