Как контрольная сумма для 1-го уровня полезна для обнаружения ошибок?

Контрольная сумма может быть сгенерирована просто путем добавления битов. Как дополнительный шаг в использовании 1-го дополнения полезен?

Я понимаю теорию. Я знаю, как рассчитать 1s дополнение, и я знаю, как добавление дополнений делает результат всех 1s.

Я хотел бы увидеть простой пример того, как обнаружена ошибка.

Ответы

Ответ 1

Я считаю, что пример, который вы ищете, можно найти здесь.

Причина, по которой мы делаем 1 дополнение, заключается в том, что когда 1 дополнение добавляется к сумме всех значений, а результат обрезается до длины бит машины (16 бит в примере выше), это все 1-х. ЦП имеют функцию, чтобы взять 1 дополнение чисел, и взятие 1 дополнения к all-1 - все-0.

Причина: процессоры ненавидят работу с битами, за исключением кусков, сколько их обычно используют. Таким образом, добавление двух 64-битных чисел может занять 1 цикл, но при проверке всех битов этого числа индивидуально потребуется еще много (в наивном цикле, возможно, до 8х64 циклов). ЦП также имеют возможность тривиально принимать 1 дополнение и обнаруживать, что результат последнего вычисления был равен нулю, не проверяя отдельные биты и ветвь на основе этого. Таким образом, в основном это оптимизация, которая позволяет нам быстро проверять контрольные суммы. Поскольку большинство пакетов просто отлично, это позволяет нам проверять контрольную сумму "на лету" и быстрее получать данные в пункт назначения.

Ответ 2

Пример. У вас есть три слова в пакете UDP, которые необходимо отправить.

0110011001100000
0101010101010101
1000111100001100

UDP на стороне отправителя выполняет 1s-дополнение суммы всех 16-разрядных слова. Сумма первых двух из этих 16-битных слов

0110011001100000
+
0101010101010101
--> 1011101110110101 

Добавление третьего слова к приведенной выше сумме дает, Обратите внимание, что это последнее добавление имело переполнение, которое было обернуто вокруг

--> 0100101011000010

Дополнение 1s получается путем преобразования всех 0s в 1s и преобразования всех 1s в 0s.

Таким образом, 1s-дополнение суммы 0100101011000010 составляет 1011010100111101, что становится контрольной суммой. В приемнике добавляются все четыре 16-битных слова, включая контрольную сумму. Если в пакет не введены ошибки, то, очевидно, сумма в приемнике будет 1111111111111111. Если один из битов равен 0, то мы знаем, что ошибки были введены в пакет.

Ответ 3

Под "добавлением бит" я предполагаю, что вы имеете в виду вычисление бит четности. Согласно этой записи в Википедии о контрольных суммах, для контрольной суммы четности "вероятность обнаружения двухбитовой ошибки равна 1/n", а при модульная сумма (такая как дополнение 1s) "вероятность того, что двухбитовая ошибка не будет обнаружена, немного меньше 1/n."

В этой колонке "Спросить доктора Math" обсуждается, как рассчитать дополнение 1s (чаще всего для TCP/IP).

Ответ 4

Одно дополнение (инверсия битов) контрольной суммы полезно, по крайней мере, двумя способами.

  1. Упрощает процесс проверки контрольной суммы

Если, например, конечная контрольная сумма равна 56, дополнение будет 199. Сложите их вместе, и результат будет 255. Обоснование: при дополнении окончательной контрольной суммы конечный результат всегда будет 255 при включении цифры контрольной суммы в сумму расчет. Выполнение дополнения во второй раз с 255 даст 0, что для процессоров в то время было более эффективным способом подтвердить, что контрольная сумма действительна, не сравнивая два числа.

  1. Позволяет обнаружить одну необнаружимую ошибку

Вычисление сообщения из n нулей дает контрольную сумму нуля. Это означает, что допустимое сообщение, состоящее из нулей, неотличимо от потери памяти или ситуации стирания, которая должна быть обнаружена как ошибка. Дополняя окончательную контрольную сумму 0 в этом случае, вместо этого получается 255, предотвращая сохранение результата с нулем.

Ответ 5

Контрольная сумма очень важна для работы в сети, как упоминается partickmdnet. В принципе, для каждой дейтаграммы, переданной в IP-протоколе, есть контрольная сумма, которая была вычислена заранее и передана. Если даже один бит поврежден и отправлен неправильно в части данных дейтаграммы, тогда контрольная сумма, вычисленная на принимающем маршрутизаторе, будет отличаться от контрольной суммы, предоставляемой дейтаграммой. Это сообщает маршрутизатору, что датаграмма повреждена (либо сама информация, либо сама контрольная сумма), и маршрутизатор будет отбрасывать дейтаграмму.