буферы протокола google - вероятность битовых ошибок и способы их уменьшения

Я передаю довольно большое количество сообщений буфера протокола Google через VPN через беспроводную сеть через Интернет через TCP, и я чувствую, что получаю относительно высокий уровень ошибок (например, логическое переключение поля с false на true или что-то подобное). Что-то между 1 из 10 000 и 1 из 50 000.

Это возможно? Википедия утверждает, что TCP имеет слабую контрольную сумму, но это обычно фиксируется в базовых протоколах:

Контрольная сумма TCP является слабой проверкой по современным стандартам. Уровни канала передачи данных с высокой частотой ошибок по битам могут потребовать дополнительных возможностей исправления/обнаружения ошибок канала. Слабая контрольная сумма частично компенсируется обычным использованием CRC или лучшей проверки целостности на уровне 2, ниже как TCP, так и IP, например, используется в PPP или фрейме Ethernet.

У кого-нибудь есть опыт, какой должна быть ожидаемая частота ошибок? Если указанная выше скорость возможна, какой рекомендуемый/самый простой способ ее исправить? Дублирование полей? Отправляете сообщение дважды? Или можно еще что-то сделать для повышения надежности?

Спасибо


person Cookie    schedule 23.12.2011    source источник
comment
Не должно произойти. Как говорит Википедия, об этом позаботятся контрольные суммы в TCP и базовых транспортных протоколах. Ваша проблема, скорее всего, кроется в другом.   -  person Thilo    schedule 23.12.2011
comment
У вас что-то не так. Однобитовый переключатель определяется CRC. Кроме того, если VPN использует шифрование, вероятность ошибки передачи составляет 0% (на практике).   -  person Luka Rahne    schedule 23.12.2011
comment
Битовые ошибки иногда остаются незамеченными TCP; в прошлом это приводило к серьезным сбоям: status.aws.amazon.com/s3. -20080720.html Между прочим, TCP не использует CRC, он использует суммы с дополнением до единиц.   -  person bdonlan    schedule 23.12.2011


Ответы (2)


Нет, это не (разумно) возможно. Предполагая, что у вас нет аппаратного сбоя (памяти, вашей сетевой карты и т. д.), что должно быть легко проверить — происходит ли это на более чем одном компьютере?

Гораздо более вероятно, что у вас есть недопустимый доступ к памяти или что-то подобное в коде вашего приложения, или что данные, которые вы отправляете, просто не соответствуют вашим намерениям. Попробуйте запустить свой код под valgrind или подобным.

Идея дублирования полей как части нормальной работы кажется абсурдной: в принципе никто так не делает, да и вам это не нужно. В вашей системе существует несколько уровней защиты от скрытого повреждения данных, поэтому, скорее всего, это простая (или не очень простая) ошибка приложения.

person John Zwinck    schedule 23.12.2011

Ответ Джона Цвинка правильный в том смысле, что ваши результаты неразумны, а исправление на прикладном уровне является ошибкой.

VPN (при условии, что уровень SW) сошла бы с ума и потеряла бы соединение, если бы сетевая карта вносила столько ошибок.

Попробуйте Valgrind, как было предложено, чтобы узнать, не портит ли ваше ПО буфер.

Кроме того, на случай, если «легко проверить» память не кажется таковой, хорошим выбором будет memtest86, http://www.memtest86.com, который можно записать на USB-накопитель или компакт-диск и оставить работать на ночь или на выходные.

person EMM    schedule 01.05.2015