Алгоритм вычисления контрольной суммы — Информатика, информационные технологии
Рассмотрим алгоритм вычисления контрольной суммы (КС).
КС — способ цифровой идентификации некоторой последовательности данных, который заключается в вычислении контрольного значения её кода.
С точки зрения математики КС является типом хэш-функции, используемой для вычисления контрольного кода (КК). КК есть небольшое количество бит внутри большого блока данных, например, сетевого пакета, применяемого для обнаружения ошибок при передаче или хранении информации. Результат вычисления КС добавляется в конец блока данных непосредственно перед началом передачи или сохранения данных на каком -либо носителе информации. Впоследствии он проверяется для подтверждения целостности переданной информации. Популярность КС обусловлена тем, что подобная проверка просто реализуема в двоичном цифровом оборудовании, легко анализируется, и хорошо подходит для обнаружения общих ошибок, вызванных наличием шума в каналах передачи данных.
Принцип КС основан на использовании свойств двоичного многочлена, в виде которого представляется исходная битовая последовательность блока данных. При этом каждый бит такой последовательности соответствует одному из полиномиальных коэффициентов. Например, десятичное число 90 (1011010 в двоичной записи) соответствует многочлену следующего вида:
P(x) = 1 * x6 + 0 * x5 + 1 * x4 + 1 * x3 + 0 * x2 + 1 * x1 + 0 * x0
Подобным же образом в виде многочлена может быть представлен любой из блоков обрабатываемых данных.
При вычислении контрольного кода по методу КС используется свойство поведения многочленов, позволяющее выполнять с ними любые арифметические действия. Контрольный код рассчитывается, как остаток от деления по модулю 2 многочлена, полученного из исходной битовой последовательности на некоторый другой заранее определённый многочлен (такой многочлен называется порождающим или примитивным).
R(x) = P(x) * xr mod G(x) | (6.1) |
где
R(x) — контрольный код многочлена P(x).
P(x) — исходный многочлен.
G(x) — порождающий многочлен.
r — степень порождающего многочлена.
Применим алгоритм к поиску КС, если задано:
Р(х) = 90, х = 2.
Пусть G(x)= 1 * x3 + 0 * x2 + 1 * x1 + 0 * x0 – этот полином скрыт от передачи и не изменен.
r=3, G(x) = 8 + 0 + 2 + 0 = 10. Тогда, согласно формуле получим:
R(x) = 90 * 2r mod 10=90*8 mod 10 = 720 mod 10 = 0.
Продолжим решение и внесем изменение в передаваемую информацию, изменив только один последний бит, получим число 91 (1011011 в двоичной записи) соответствует многочлену следующего вида:
P(x) = 1 * x6 + 0 * x5 + 1 * x4 + 1 * x3 + 0 * x2 + 1 * x1 + 1 * x0
Далее действуем по аналогии с выше рассмотренными действиями. Получим:
Р(х) = 91, х = 2.
Пусть G(x)= 1 * x3 + 0 * x2 + 1 * x1 + 0 * x0
r=3, G(x) = 8 + 0 + 2 + 0 = 10. Тогда, согласно формуле получим:
R(x) = 91 * 2r mod 10=91*8 mod 10 = 728 mod 10 = 8.
Как видно из решения, что при любом нарушении целостности информации меняется ее контрольная сумма, а значит будет обнаружена ошибка передачи данных.
Порядок выполнения самостоятельной работы
1. Возьмите любое число P, например, трехзначное. Представьте его в двоичной системе счисления (x=2). Получим
полином P(х), который будет передаваться по каналу связи вместе с КС блоками по 8 бит.
2. В качестве порождающего полинома возьмите G(x) = 1 * x3 + 0 * x2 + 1 * x1 + 1 * x0 , где степень полинома r = 3.
3. Вычисли число порождающего полинома G(x).
4. Вычислим контрольный код по формуле (6.1) и представим его объемом 8 бит, добавляя незначащие нули слева.
5. Присоединим КС к передаваемому числу в конец блока из 8 бит.
6. Измените начальное число и пересчитайте после этого контрольную сумму, сверьте с заданной и определите, был
сбой в системе или нет.
Ассиметричное шифрование
Цель работы – изучить принципы ассиметричного шифрования, алгоритм RSA и уметь его применять в задачах ассиметричного шифрования.
Функциональная схема взаимодействия участников асимметричного криптографического обмена представлена на рис. 7.1.
В данной схеме участвует получатель секретного сообщения А и отправитель секретного сообщения B. ОКА – открытый ключ пользователя А, СКА – секретный ключ пользователя А. Ключевая пара (ОКА, СКА) сгенерирована на стороне получателя А, после чего открытый ключ данной пары ОКА отправляется по открытому каналу пользователю B. Предполагается, что злоумышленнику также известен открытый ключ ОКА.
Рис. 7.1. Функциональная схема асимметричной криптосистемы
Отправитель B, зная открытый ключ получателя А, может зашифровать на данном ключе открытый текст и переслать его пользователю А. Пользователь А с помощью своего секретного ключа, соответствующего ОКА, может дешифровать присланное пользователем B сообщение. Злоумышленник, зная ОКА и закрытый текст, не может получить доступ не к СКА, не к открытому тексту.
Рис 4.5 отражает только одностороннюю схему взаимодействия в рамках асимметричных криптосистем. Для реализации двустороннего обмена необходима реализация следующих шагов:
1. Пользователь A генерирует ключевую пару (ОКА,СКА).
2. Пользователь B генерирует ключевую пару (ОКB,СКB).
3. Пользователи A и B должны обменяться своими открытыми ключами. Пользователь А передает свой открытый ключ ОКА пользователю B, пользователь B передает свой открытый ключ ОКB пользователю A.
4. Пользователь А шифрует информацию для пользователя B на ключе ОКB, пользователь B шифрует информацию для пользователя A на ключе ОКA.
5. Пользователь А дешифрует информацию, присланную ему от пользователя B, на ключе СКА, пользователь B дешифрует информацию, присланную ему от пользователя A, на ключе СКB.
Обмен открытыми ключами в современных криптографических сетях, насчитывающих десятки и даже сотни тысяч пользователей более удобно реализовывать, используя специально выделенные для этого центры распределения ключей. Пользователь A может выложить на центр распределения ключей свой открытый ключ и любой другой пользователь, желающий шифровать информацию для A, может обратиться в данный центр и забрать его открытый ключ.
У. Диффи и М. Хеллман сформулировали требования, выполнение которых обеспечивает безопасность асимметричной криптосистемы [6]:
1. Вычисление ключевой пары (ОК, СК) должно быть достаточно простым.
2. Отправитель, зная открытый ключ получателя, может легко получить шифротекст.
3. Получатель, используя свой секретный ключ, может легко из шифротекста восстановить исходное сообщение.
4. Знание открытого ключа злоумышленником не должно влиять на криптостойкость системы. При попытке вычислить злоумышленником закрытый ключ по открытому, он должен наталкиваться на непреодолимую вычислительную проблему.
5. Злоумышленник, зная шифротекст и открытый ключ, на котором осуществлялось шифрование, при попытке восстановить исходный текст должен наталкиваться на трудно преодолимую вычислительную проблему.
Алгоритм шифрования RSA
В криптосистеме RSA открытый ключ ОК, секретный ключ СК, исходное сообщение М и шифротекст С являются целыми числами от 0 до N-1, где N – модуль. Пусть пользователь А является получателем сообщения, которое ему должен переслать отправитель B. Пользователь A должен вначале сгенерировать ключевую пару RSA, это он делает следующим образом.
Статьи к прочтению:
57.CRC алгоритм (Урок 48. Теория)
Похожие статьи:
Алгоритм вычисления контрольной суммы — это… Что такое Алгоритм вычисления контрольной суммы?
- Алгоритм вычисления контрольной суммы
Wikimedia Foundation. 2010.
- Алгоритмическая неразрешимость
- Алгоритмы рисования линии
Смотреть что такое «Алгоритм вычисления контрольной суммы» в других словарях:
Циклическая проверка на чётность — Алгоритм вычисления контрольной суммы (англ. Cyclic redundancy code, CRC циклический избыточный код) способ цифровой идентификации некоторой последовательности данных, который заключается в вычислении контрольного значения её циклического… … Википедия
Циклическая проверка на четность — Алгоритм вычисления контрольной суммы (англ. Cyclic redundancy code, CRC циклический избыточный код) способ цифровой идентификации некоторой последовательности данных, который заключается в вычислении контрольного значения её циклического… … Википедия
Циклический избыточный код — Эта статья о коде. О методе мозгового штурма см. CRC карта. Циклический избыточный код (англ. Cyclic redundancy check, CRC[1]) алгоритм вычисления контрольной суммы, предназначенный для проверки целостности… … Википедия
Adler-32 — Adler 32 хеш функция, разработанная Марком Адлером (англ.). Является модификацией контрольной суммы Fletcher (англ.). Вычисляет значение контрольной суммы в соответствии с RFC 1950 для массива байт или его фрагмента. Данный… … Википедия
Список алгоритмов — Эта страница информационный список. Основная статья: Алгоритм Ниже приводится список алгоритмов, группированный по категориям. Более детальные сведения приводятся в списке структур данных и … Википедия
Программируемые алгоритмы — Служебный список статей, созданный для координации работ по развитию темы. Данное предупреждение не устанавл … Википедия
FAT — (англ. File Allocation Table «таблица размещения файлов») классическая архитектура файловой системы, которая из за своей простоты всё ещё широко используется для флеш накопителей. В недавнем прошлом использовалась в дискетах, на… … Википедия
Контрольное число — Эта статья или раздел нуждается в переработке. Пожалуйста, улучшите статью в соответствии с правилами написания статей … Википедия
Контрольная цифра — Контрольное число, контрольная цифра разновидность контрольной суммы, добавляется (обычно в конец) длинных номеров с целью первичной проверки их правильности. Применяется с целью уменьшения вероятности ошибки при обработке таких номеров: машинном … Википедия
ГОСТ Р 34.11-94 — Криптографическая хеш функция Название ГОСТ Р 34.11 94 Создан 1994 Опубликован 23 мая 1994 Размер хеша 256 бит Число раундов 1 Тип хеш функция ГОСТ Р 34.11 94 российский … Википедия
Код Хэмминга. Пример работы алгоритма / Хабр
Коды Хэмминга — наиболее известные и, вероятно, первые из самоконтролирующихся и самокорректирующихся кодов. Построены они применительно к двоичной системе счисления.
Другими словами, это алгоритм, который позволяет закодировать какое-либо информационное сообщение определённым образом и после передачи (например по сети) определить появилась ли какая-то ошибка в этом сообщении (к примеру из-за помех) и, при возможности, восстановить это сообщение. Сегодня, я опишу самый простой алгоритм Хемминга, который может исправлять лишь одну ошибку.
Также стоит отметить, что существуют более совершенные модификации данного алгоритма, которые позволяют обнаруживать (и если возможно исправлять) большее количество ошибок.
Сразу стоит сказать, что Код Хэмминга состоит из двух частей. Первая часть кодирует исходное сообщение, вставляя в него в определённых местах контрольные биты (вычисленные особым образом). Вторая часть получает входящее сообщение и заново вычисляет контрольные биты (по тому же алгоритму, что и первая часть). Если все вновь вычисленные контрольные биты совпадают с полученными, то сообщение получено без ошибок. В противном случае, выводится сообщение об ошибке и при возможности ошибка исправляется.
Как это работает.
Для того, чтобы понять работу данного алгоритма, рассмотрим пример.
Подготовка
На этом этапе стоит определиться с, так называемой, длиной информационного слова, то есть длиной строки из нулей и единиц, которые мы будем кодировать. Допустим, у нас длина слова будет равна 16. Таким образом, нам необходимо разделить наше исходное сообщение («habr») на блоки по 16 бит, которые мы будем потом кодировать отдельно друг от друга. Так как один символ занимает в памяти 8 бит, то в одно кодируемое слово помещается ровно два ASCII символа. Итак, мы получили две бинарные строки по 16 бит:
и
После этого процесс кодирования распараллеливается, и две части сообщения («ha» и «br») кодируются независимо друг от друга. Рассмотрим, как это делается на примере первой части.
Прежде всего, необходимо вставить контрольные биты. Они вставляются в строго определённых местах — это позиции с номерами, равными степеням двойки. В нашем случае (при длине информационного слова в 16 бит) это будут позиции 1, 2, 4, 8, 16. Соответственно, у нас получилось 5 контрольных бит (выделены красным цветом):
Было:
Стало:
Таким образом, длина всего сообщения увеличилась на 5 бит. До вычисления самих контрольных бит, мы присвоили им значение «0».
Вычисление контрольных бит.
Теперь необходимо вычислить значение каждого контрольного бита. Значение каждого контрольного бита зависит от значений информационных бит (как неожиданно), но не от всех, а только от тех, которые этот контрольных бит контролирует. Для того, чтобы понять, за какие биты отвечает каждых контрольный бит необходимо понять очень простую закономерность: контрольный бит с номером N контролирует все последующие N бит через каждые N бит, начиная с позиции N. Не очень понятно, но по картинке, думаю, станет яснее:
Здесь знаком «X» обозначены те биты, которые контролирует контрольный бит, номер которого справа. То есть, к примеру, бит номер 12 контролируется битами с номерами 4 и 8. Ясно, что чтобы узнать какими битами контролируется бит с номером N надо просто разложить N по степеням двойки.
Высчитав контрольные биты для нашего информационного слова получаем следующее:
и для второй части:
Вот и всё! Первая часть алгоритма завершена.
Декодирование и исправление ошибок.
Теперь, допустим, мы получили закодированное первой частью алгоритма сообщение, но оно пришло к нас с ошибкой. К примеру мы получили такое (11-ый бит передался неправильно):
Вся вторая часть алгоритма заключается в том, что необходимо заново вычислить все контрольные биты (так же как и в первой части) и сравнить их с контрольными битами, которые мы получили. Так, посчитав контрольные биты с неправильным 11-ым битом мы получим такую картину:
Как мы видим, контрольные биты под номерами: 1, 2, 8 не совпадают с такими же контрольными битами, которые мы получили. Теперь просто сложив номера позиций неправильных контрольных бит (1 + 2 + 8 = 11) мы получаем позицию ошибочного бита. Теперь просто инвертировав его и отбросив контрольные биты, мы получим исходное сообщение в первозданном виде! Абсолютно аналогично поступаем со второй частью сообщения.
Заключение.
Примечание.
На написание этого топика меня подвигло то, что в поиске я не нашёл на Хабре статей на эту тему (чему я был крайне удивлён). Поэтому я решил отчасти исправить эту ситуацию и максимально подробно показать как этот алгоритм работает. Я намеренно не приводил ни одной формулы, дабы попытаться своими словами донести процесс работы алгоритма на примере.
Источники.
2. Calculating the Hamming Code
Контрольная сумма — Checksum — qaz.wiki
Данные небольшого размера, вычисленные на основе цифровых данных для обнаружения ошибок передачи
Эффект типичной функции контрольной суммы ( утилита Unix cksum )Контрольная сумма является малогабаритной точкой привязки , полученной из блока из цифровых данных с целью обнаружения ошибок , которые могут быть введены в процессе его передачи или хранения . Сами по себе контрольные суммы часто используются для проверки целостности данных, но не используются для проверки подлинности данных .
Процедура , которая формирует эту контрольную сумму, называется функцией контрольной суммы или контрольная сумма алгоритм . В зависимости от целей разработки хороший алгоритм контрольной суммы обычно выводит существенно другое значение, даже при небольших изменениях, внесенных во входные данные. Это особенно верно для криптографических хэш-функций , которые могут использоваться для обнаружения многих ошибок повреждения данных и проверки общей целостности данных ; Если вычисленная контрольная сумма для текущего ввода данных совпадает с сохраненным значением ранее вычисленной контрольной суммы, существует очень высокая вероятность того, что данные не были случайно изменены или повреждены.
Функции контрольной суммы связаны с хэш-функциями , отпечатками пальцев , функциями рандомизации и криптографическими хеш-функциями . Однако каждая из этих концепций имеет разные приложения и, следовательно, разные цели проектирования. Например, функция, возвращающая начало строки, может предоставить хэш, подходящий для некоторых приложений, но никогда не будет подходящей контрольной суммой. Контрольные суммы используются в качестве криптографических примитивов в более крупных алгоритмах аутентификации. Для криптографических систем с этими двумя конкретными целями проектирования см. HMAC .
Контрольные цифры и биты четности являются частными случаями контрольных сумм, ассигновать для небольших блоков данных (например, номера социального страхования , банковские счета чисел, машинных слов , отдельных байтов и т.д.). Некоторые коды с исправлением ошибок основаны на специальных контрольных суммах, которые не только обнаруживают типичные ошибки, но также позволяют в определенных случаях восстанавливать исходные данные.
Алгоритмы
Байт четности или слово четности
Простейший алгоритм контрольной суммы — это так называемая продольная проверка четности , при которой данные разбиваются на «слова» с фиксированным числом битов n , а затем вычисляется исключающее ИЛИ (XOR) всех этих слов. Результат добавляется к сообщению как дополнительное слово. Чтобы проверить целостность сообщения, получатель вычисляет исключающее или всех его слов, включая контрольную сумму; если результатом не является слово, состоящее из n нулей, получатель знает, что произошла ошибка передачи.
С этой контрольной суммой любая ошибка передачи, которая переворачивает один бит сообщения или нечетное количество битов, будет обнаружена как неправильная контрольная сумма. Однако ошибка, затрагивающая два бита, не будет обнаружена, если эти биты находятся в одной и той же позиции в двух разных словах. Также замена двух или более слов не будет обнаружена. Если затронутые биты независимо выбраны случайным образом, вероятность того, что двухбитовая ошибка не будет обнаружена, равна 1 / n .
Сумма дополнения
Вариант предыдущего алгоритма состоит в том, чтобы сложить все «слова» как двоичные числа без знака, отбросив любые биты переполнения, и добавить двойное дополнение к общей сумме в качестве контрольной суммы. Чтобы проверить сообщение, получатель таким же образом складывает все слова, включая контрольную сумму; если результат не является словом, полным нулей, вероятно, произошла ошибка. Этот вариант также обнаруживает любые однобитовые ошибки, но промодульная сумма используется в SAE J1708 .
Зависит от позиции
Простые контрольные суммы, описанные выше, не позволяют обнаружить некоторые общие ошибки, которые затрагивают сразу несколько битов, такие как изменение порядка слов данных или вставка или удаление слов со всеми битами, установленными в ноль. Алгоритмы контрольной суммы, наиболее часто используемые на практике, такие как контрольная сумма Флетчера , Adler-32 и циклический контроль избыточности (CRC), устраняют эти недостатки, рассматривая не только значение каждого слова, но и его позицию в последовательности. Эта функция обычно увеличивает стоимость вычисления контрольной суммы.
Нечеткая контрольная сумма
Идея нечеткой контрольной суммы была разработана для обнаружения спама в электронной почте путем создания кооперативных баз данных от нескольких интернет-провайдеров электронной почты, подозреваемой в спаме. Содержание такого спама часто может отличаться по деталям, что делает обычное вычисление контрольной суммы неэффективным. Напротив, «нечеткая контрольная сумма» сокращает основной текст до характерного минимума, а затем генерирует контрольную сумму обычным образом. Это значительно увеличивает вероятность того, что несколько различающиеся спам-письма будут давать одинаковую контрольную сумму. Программное обеспечение для обнаружения спама от интернет-провайдеров, такое как SpamAssassin , сотрудничающих с ними интернет-провайдеров, отправляет контрольные суммы всех электронных писем в централизованную службу, такую как DCC . Если количество отправленных нечетких контрольных сумм превышает определенный порог, база данных отмечает, что это, вероятно, указывает на спам. Пользователи службы ISP аналогичным образом генерируют нечеткую контрольную сумму для каждого из своих электронных писем и запрашивают службу на предмет вероятности спама.
Общие Соображения
Сообщение длиной m бит можно рассматривать как угол m -мерного гиперкуба. Эффект алгоритма контрольной суммы, который дает n-битную контрольную сумму, заключается в отображении каждого m -битного сообщения на угол большего гиперкуба с измерением . 2 m + n углов этого гиперкуба представляют все возможные полученные сообщения. Допустимые полученные сообщения (те, которые имеют правильную контрольную сумму) составляют меньший набор, всего с 2 м углами. м+п{\ displaystyle m + n}
Тогда однобитовая ошибка передачи соответствует смещению от допустимого угла (правильное сообщение и контрольная сумма) к одному из m смежных углов. Ошибка, затрагивающая k бит, перемещает сообщение в угол, который на k шагов удаляется из правильного угла. Цель хорошего алгоритма контрольной суммы состоит в том, чтобы раздвинуть допустимые углы как можно дальше друг от друга, чтобы повысить вероятность того, что «типичные» ошибки передачи окажутся в недопустимом углу.
Смотрите также
Общая тема
Исправление ошибки
Хеш-функции
Связанные понятия
Ссылки
внешние ссылки
Как рассчитывается контрольная сумма TCP и UDP?
Когда вы отправляете и получаете данные по сети, есть вероятность, что данные могут быть повреждены, изменены или изменены (это может быть случайным, преднамеренно сделанным со злым умыслом). Как бы то ни было, необходим метод, с помощью которого получатель может легко проверить и определить, были ли данные изменены или повреждены.
Обычно происходит следующее … Отправитель вычисляет короткое значение контрольной суммы (очень маленькое по размеру), которое представляет сообщение / данные, которые отправляются.Вычисленное значение отправляется либо вместе с сообщением, либо другими методами. Как только данные получены, получатель также вычисляет контрольную сумму. Если оба значения (отправителя и получателя) совпадают, то данные не повреждены / не изменены.
Спасибо криптографам, разработавшим хэш-алгоритмы. Некоторые из популярных алгоритмов хеширования — это MD5, SHA1 и т. Д. Возможно, вы заметили веб-сайты, которые предоставляют хеш-значения MD5 и SHA1 для файла, который вы хотите загрузить.Это связано с тем, что вы можете рассчитать хэш-значение для загруженного файла, а затем, если оно соответствует тому, которое указано на веб-сайте, вы можете быть уверены, что файл не поврежден / и не изменен.
MD5 и SHA1 в основном используются для проверки целостности файлов. Однако Интернет-соединение (проверка данных базовой сети. Проверка данных TCP и UDP) не использует MD5 или SHA1. Метод, используемый для связи в Интернете, и алгоритмы хеширования похожи, но не в точности одинаковы.Потому что потребность в каждом конкретном случае разная.
Коллизия — самый важный фактор в хэш-алгоритмах. Это не что иное, как уверенность в том, что «Никакие два выхода хеша не будут иметь одинаковое значение». Если есть два разных набора данных с одним и тем же хеш-выводом, то это превосходит цель. Потому что он должен быть уникальным для определенных данных. Только тогда вы сможете проверить целостность. MD5 и SHA1 концентрируют больше на создании выходных данных без конфликтов. Он разработан, чтобы быть действительно прочным и не иметь никаких столкновений.Это причина его использования для проверки целостности файлов. Также прелесть хеш-функции в том, что это односторонний хеш. Вы не можете получить данные, если у вас есть хеш-значение. По этой причине в большинстве случаев пароли хранятся в базах данных в виде хеш-значений. Когда пользователь вводит пароль, программа входа в систему генерирует хеш-значение пароля и сравнивает его с значением в базе данных. Если оба значения совпадают, пользователь может войти в систему.
Расчет контрольных сумм TCP и UDP не сильно влияет на коллизию как таковую (по сравнению с алгоритмами md5 и sha1). Для контрольной суммы TCP и UDP важнее быстрота и эффективное обнаружение ошибок, чем коллизия.
Связано: Как работает UDP, если он не ориентирован на соединение?
Связано: Общие сведения о трехстороннем подтверждении связи TCP
По этой причине контрольная сумма TDP и UDP использует метод дополнения единиц для вычисления контрольной суммы.
дополнение — это не что иное, как значение, которое мы получаем, когда мы меняем все 0 на 1 и 1 на 0.Например, дополнение до единиц 110111001010 равно 001000110101.
Как работает метод дополнения единиц для вычисления контрольной суммы UDP и TCP?
Разберемся на примере. Представьте, что у нас есть сегмент UDP или пакет TCP. Первое, что мы делаем, это разделяем и разрезаем на части по 16 бит. Предположим, у нас есть три 16-битных данных, как показано ниже.
1 0 0 1 1 0 1 0 0 1 0 1 0 1 1 0
0 0 0 0 1 0 1 1 1 0 0 0 1 1 1 0
0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 0
Если мы сложим эти три 16-битных данных с помощью двоичного сложения.Мы получаем следующие 16-битные данные (простое двоичное сложение).
1001101001010110 + 0000101110001110 + 0000110111001100 = 1011001110110000
Одно дополнение к нашему результату 1011001110110000 — это 0100110001001111. Итак, нам нужно в основном отправить наши данные (которые представляют собой три двоичных 16-битных числа) вместе с их контрольной суммой на приемник. Главное понимать, получатель получит данные, а также рассчитанную нами контрольную сумму.
Ресивер получит следующие вещи.
1 0 0 1 1 0 1 0 0 1 0 1 0 1 1 0 (данные)
0 0 0 0 1 0 1 1 1 0 0 0 1 1 1 0 (данные)
0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 0 (данные)
0 1 0 0 1 1 0 0 0 1 0 0 1 1 1 1 (Контрольная сумма)
Получатель просто добавит все вышеперечисленное 4 вещи. Данные и контрольная сумма суммируются. Попробуем добавить.
1001101001010110 + 0000101110001110 + 0000110111001100 + 0100110001001111 = 11111111111111
Если на выходе сумма 16-битных данных и контрольная сумма1111111111 1111.Все поля будут равны 1 с. Даже если есть один 0, это означает, что в данные были внесены ошибки во время передачи.
Это служит цели. В отличие от md5 и sha1, его также довольно просто вычислить и проверить. Когда дело доходит до сложения двоичных файлов, компьютеры супер крутые :). Именно так рассчитывается контрольная сумма TCP и UDP.
Есть еще несколько вещей, которые нужно понять при вычислении контрольных сумм TCP и UDP. Контрольная сумма рассчитывается не только с использованием заголовков и данных TCP / UDP.Он также рекламирует несколько бит данных из заголовка IP. Эти данные иногда называют псевдозаголовком.
Давайте теперь посмотрим, что это за псевдозаголовок. Псевдо-заголовок имеет несколько полей из IP-заголовка. Другими словами, для вычисления контрольной суммы TCP и UDP (находящихся на транспортном уровне) требуется несколько полей данных и битов с сетевого уровня. Как это вообще возможно. Потому что сетевой уровень находится ниже транспортного уровня. Мы обсудим это через несколько минут.
Псевдо-заголовок состоит из следующих элементов IP-заголовка.
- Адрес источника (IP)
- Адрес назначения (IP)
- Заголовок протокола (например, TCP, UDP, ICMP и т. Д.) Длина
- (TCP / UDP)
- Зарезервировано 8 бит
Все содержимое псевдозаголовка составляет около 12 байтов (32-битный адрес источника + 32-битный адрес назначения + 8-битный зарезервированный + 16-битная длина TCP + 8-битный тип протокола = 96 бит = 12 байтов).Вы можете ясно видеть, что большая часть информации поступает из заголовка IP (с сетевого уровня), хотя мы обсуждаем вычисление контрольной суммы на транспортном уровне.
Вот как это работает. На стороне отправителя, когда данные поступают на транспортный уровень, системе необходимо вычислить контрольную сумму. Он временно создает псевдозаголовок. Имейте в виду слово «временный» После создания этого псевдозаголовка он сохраняется в буфере. Затем он начинает вычислять контрольную сумму, разделяя все это на 16-битные блоки (псевдозаголовок, данные tcp, заголовок tcp), а затем добавляет его.Наконец, он вычисляет дополнение, как мы делали ранее.
После вычисления контрольной суммы результат контрольной суммы перейдет в нужное место. Это поле контрольной суммы заголовка TCP. Как только контрольная сумма помещается в настоящий TCP-заголовок, псевдозаголовок, временно созданный для вычисления контрольной суммы, отбрасывается.
Но каково будет значение поля Checksum в заголовке TCP при вычислении самой контрольной суммы ?. Мы узнали, что при вычислении контрольной суммы используются заголовки, данные и псевдозаголовок TCP.Итак, во время этого расчета, что будет помещено в поле контрольной суммы заголовка tcp?
Во время вычисления контрольной суммы в поле обычно указываются нули. После расчета правильное значение заменит все 0.
Также имейте в виду, что псевдозаголовок никогда не покидает систему. Он отбрасывается и никогда не является частью заголовка TCP, заголовка IP или чего-либо еще, что проходит по сети.
Итак, что происходит на стороне назначения?
То же самое происходит и на стороне назначения.Создается временный псевдозаголовок и передается на транспортный уровень вместе с фактическим заголовком и данными TCP. Это временно добавляется к сегменту tcp / udp для вычисления контрольной суммы.
Если результат добавления временного псевдозаголовка, данных tcp, заголовка tcp оказывается равным единице, то принимающая сторона может подтвердить, что данные не повреждены.
Зачем вам нужен псевдозаголовок?
Это законный вопрос. Поскольку заголовок IP (сетевого уровня) также имеет собственное поле контрольной суммы.Так какой смысл брать оттуда несколько полей при вычислении контрольной суммы TCP / UDP?
Если адрес источника или адрес назначения не совпадают, контрольная сумма не будет выполнена. Обратите внимание на то, что даже если сетевой пакет каким-то образом достигает транспортного уровня, все равно выполняется вторичная проверка источника и назначения с помощью контрольной суммы. Основная цель — подтвердить со 100-процентной уверенностью, что данные TCP / UDP достигли правильного места назначения.
Главное, что нужно понимать о псевдозаголовке, это то, что он никогда не покидает систему.Но все же он выполняет свою работу, добавляя еще один уровень проверки. Если вы захватываете сетевой трафик в своей системе на несколько минут, вы можете увидеть значение контрольной суммы TCP / UDP в таких инструментах, как wirehark.
sudo tcpdump -vvv -s 0 -l -n порт 80 -w tcp-out.pcap
Вышеупомянутая команда будет захватывать пакеты на порт номер 80, а затем записывать выходные данные в файл с именем tcp-out.pcap. Затем этот файл можно импортировать в такие инструменты, как wirehark, для его дальнейшего анализа.Вы должны увидеть контрольную сумму в разделе TCP / UDP внутри wirehark.
.Расчет контрольной суммыТакже невозможно равномерно разделить данные на 16-битные фрагменты (например, последний фрагмент может не иметь 16 бит). Чтобы решить эту проблему, к двоичному значению добавляются нули, чтобы сделать его 16-битным во время вычисления контрольной суммы.