Я думаю, что вы имеете дело с возможностями ошибки второго порядка, когда основной риск находится где-то в другом месте.
Когда мы использовали передачи последовательной линии, ошибки были частые (один или два каждые несколько килобайт). Мы использовали старый добрый Kermit с CRC и размером пакета около 100 байт, и этого было достаточно: я много раз сталкивался с неудачной передачей, потому что линия отключилась, но никогда не была корректной передачей с плохим файлом.
С существующими сетями, если у вас очень плохие линии, уровень аппаратного обеспечения не так уж плох, и в любом случае уровень линии передачи данных уровня 2 уже имеет контрольную сумму для управления тем, что каждый пакет не был изменен между двумя узлами. HDLC обычно используется на этом уровне, и он использует нормальную контрольную сумму CRC16 или CRC32, которая является очень правильной контрольной суммой.
Таким образом, контрольная сумма, как уровень TCP не предназначен для обнаружения случайных ошибок в потоке байтов, а просто в качестве последней линии обороны для неожиданных ошибок, для Exemple если маршрутизатор злится из-за поражения электрическим током и посылает полный мусор. У меня нет статистических данных, но я уверен, что количество ошибок, достигающих уровня TCP, уже очень мало.Говоря иначе, не беспокойтесь об этом: если вы не имеете дело с высокочувствительными данными, и в этом случае я бы предпочел иметь два разных канала: первый для данных, последний для глобальной контрольной суммы - достаточно TCP/IP.
Это, как говорится, добавление контроля на уровне приложения в качестве предельной защиты вполне приемлемо. Он будет обрабатывать только ошибки, которые могли быть обнаружены на канале передачи данных и уровне TCP, или, скорее, на ошибках в одноранговом приложении (кто его написал и как он прошел тестирование?). Таким образом, вероятность получить ошибку достаточно низко, чтобы использовать очень грубую процедуру восстановления:
- закрыть соединение
- открыть новый
- перезапуск после последнего пакета правильно обменены (если это имеет смысл) или просто продолжать посылать новые пакеты, если вы можете
Но риск гораздо выше, чтобы получить физическое разъединение, или отключения питания в любом месте в сети, не говоря уже в изъян в реализации на уровне приложений ...
И не забудьте полностью указать порядок байтов и размер crc и datasize ...