Как реализовать чексуммы для сетевого протокола уровня приложения?
При использовании TCP стека (Ethernet, IP, TCP) не гарантируется сохранение целостности.
Хочу реализовать это с помощью чексумм для сообщений на уровне самого приложения - считать чексумму (например, CRC32) вручную и добавлять его к сообщению.
Вопрос: где есть больше информации о подобной реализации - какие алгоритмы чексуммы лучше использовать, какие подводные камни, как лучше организовать проверку и т.д.?
Можно также с примерами протоколов приложений, которые это реализуют
Сергей Соловьев, Вспомните математику, ну или теорвер - в случае с ether + IP + tcp - вероятности перемножаются! Итого: вероятность ошибки в неправильно переданном пакете будет примерно 10 в минус -9 степени, если не меньше. И это при условии совпадения чексумм, А по мне, так это вероятность - близкая к нулю на произвольном пакете. Приблизительно, при совпадении абсолютно всех условий - один пакет в сто тысяч лет!
Вы, увы, плохо знаете и математику, и сетевые протоколы.
Что же касается UDP, то все тоже самое, только неправильный пакет никогда не будет перепослан получателю.
Ну а если хотите сами реализовывать - то читаем; алгоритмы хеширования и контроля четности. Коды Рида-Саломона, для исправления потенциальной ошибки.
И до кучи - алгоритмы перемежения, чтобы минимизировать ошибку во времени.
Алексей Черемисин, я уже написал, что полагаться можно только на TCP чексумму, т.к. IP зависит только от своих заголовков, а Ethernet пересчитывается на каждом маршрутизаторе.
Итого надо учитывать только чек-суммe TCP. А если вспомнить, что эта чек-сумма - просто 16 битовый XOR, то легко догадаться, что достаточно всего 2 поменявшихся битов на одной и той же позиции, чтобы ошибка не была обнаружена.
Сергей Соловьев, у Вас плохо и с математикой, и с протоколами!
У Вас же матрешка из протоколов, каждый из которых проверяет внутреннее содержимое. Итлго, в эзернете контрольные суммы пересчитываются несколько раз для каждого содержимого. Как минимум дважды - для фрейма и для tcp.