Re: Надежность потока TCP
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 14.08.12 04:37
Оценка:
Здравствуйте, gladov, Вы писали:

G>Возник вопрос с правильной организацией протокола прикладного уровня. Для управления устройством предполагается использовать Ethernet + TCP/IP. Данные представляют собой управляющие команды (как следствие, планируется пакетная передача) и терять их никак нельзя.

G>Возникает главный вопрос: возможна ли теоретически потеря или порча данных в потоке TCP? Если допустить что раз в год и палка стреляет, то возможна такая ситуация, что будет испорчен заголовок команды. Тогда пакет будет принят некорректно, но самое страшное, что будет потеряно ожидаемое начало следующего пакета и т.п. Короче, возможен рассинхрон.

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

Но судя по тому, что мало кто реально заморачивается такими проблемами сейчас, то, что раз в год и палка стреляет, мало кого волнует. А если кого волнует, он добавляет всякие SHA* для защиты данных.

Если вы строите свою систему, и предполагаете достаточную надёжность всех компонентов (например, проблемы порчи памяти устранены за счёт тотального ECC), то можно постараться обойтись минимальными мерами — вроде тех же таймаутов.

G>Во избежание, придется любо городить некие таймауты для восстановления синхронизации, что не очень хорошо скажется на скорости работы, либо делать стаффинг, но мне не очень нравится реализовывать логику по сути канального уровня поверх транспортного. Либо делать еще что-то, чего мне в голову пока не пришло.

G>Гуру, подскажите, как все таки правильно сделать надежный пакетный обмен по TCP/IP?

Для начала предлагаю реализовать просто таймауты — на уровне протокола, и контрольные суммы понадёжнее (как минимум CRC32C, а можно и SHA1) — на уровне форматов пакетов. 99%, что этого хватит и даже они будут выстреливать пару раз в год.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.