Можно ли перевернуть два бита в большом сообщении, чтобы контрольная сумма в Интернете не обнаружила ошибку?
1 ответ
Не существует такой вещи, как контрольная сумма в Интернете.
Однако некоторые из протоколов в наборе интернет-протоколов содержат контрольную сумму. Обычно они вычисляются как сумма модуля-65535, что означает, что каждая 16-я разрядная позиция будет вносить одинаковое значение в конечное значение.
Таким образом, если вы перевернете один бит от 0 до 1 и другой бит от 1 до 0, и если эти два бита кратны 16 битам друг от друга в пакете, то контрольная сумма не будет затронута. Таким образом, легко построить сценарий, в котором два бита могут быть перевернуты в пакете без обнаружения контрольной суммы.
Например, представьте пакет, содержащий эти байты 47 6f 6f 64 (hex). Второй байт заканчивается 1-битным, а четвертый байт заканчивается 0-битным. Эти биты расположены на 16 позиций друг от друга, поэтому, если мы перевернем их обе, контрольная сумма не изменится. 47 6e 6f 65 перевернуло ровно два бита, и у него будет та же контрольная сумма.
Тем не менее, важно отметить, что эти контрольные суммы не охватывают все, что отправляется через Интернет, поэтому необнаруженная коррупция с большей вероятностью произойдет по другим причинам.
Теперь давайте рассмотрим отдельные протоколы.
IPv4 имеет контрольную сумму заголовка. Он охватывает только заголовок, поэтому никакого повреждения полезной нагрузки не обнаружено. Поскольку каждый маршрутизатор должен обновлять поле TTL, контрольная сумма должна пересчитываться при каждом переходе. Легко представить ошибку реализации, из-за которой поврежденные данные могут привести к пересчету этой контрольной суммы поверх поврежденных данных.
IPv6 не имеет контрольной суммы заголовка. Он был устранен из-за проблем, упомянутых выше, а также из-за небольшого выигрыша в производительности из-за отсутствия необходимости его обновления, а также потому, что контрольные суммы на других уровнях протокола лучше подходят.
TCP вычисляет контрольную сумму для всех данных полезной нагрузки, а также для IP-адресов и номера протокола. Таким образом, даже если IP-адрес поврежден во время полета и из-за этого пакет доставлен в неправильный пункт назначения, контрольная сумма TCP может обнаружить его и отбросить пакет.
UDP, как и TCP, вычисляет контрольную сумму данных полезной нагрузки, IP-адресов и номера протокола. Это, однако, не является обязательным. UDP-пакеты могут быть отправлены через IPv4 с нулем в поле контрольной суммы, и в этом случае получатель будет принимать данные независимо от любого повреждения данных полезной нагрузки при передаче. Это верно только для IPv4. В IPv6 контрольная сумма UDP является обязательной. Предполагается, что это должно компенсировать отсутствие контрольной суммы заголовка, что означает, что контрольная сумма UDP является единственной защитой, обеспечивающей сброс пакета в случае повреждения IP-адреса при передаче.
UDPlite ведет себя точно так же, как UDP, за исключением того, что контрольная сумма не должна охватывать все данные полезной нагрузки. Отправитель решает, сколько байтов (считая от начала пакета) необходимо покрыть контрольной суммой. Коррупция в конце пакета останется незамеченной.