04:38
Незнакомый потолок
Пусть надо передать пакет по физическому каналу связи от устройства А до устройства Б. Длина пакета известна. Устройство Б принимает байты, пока буфер не заполнится, а потом начинает разбор пакета.
Но это идеальный случай. Канал связи реальный, и в нём могут происходить сбои. Когда произошёл сбой, в буфере оказывается мусор. Заполнили буфер -- попытались разобрать -- выбросили. Заполнили ещё раз. Но из-за изначальной ошибки у нас начало пакета оказывается в середине буфера, а не в начале. Поэтому сколько буфер не выбрасывай, начало очередного пакета мы не найдём. Это потеря синхронизации.
Такая ситуация обязательно должна быть предусмотрена разработчиками. Алгоритма разрешения тут два:
1. Сброс буфера по тайм-ауту. Если слишком долго нет очередного байта, то делается вывод о том, что пауза между пакетами попала на середину буфера. Надо выбросить неполный буфер и начать приём сначала.
2. Поиск синхронизации по сигнатуре. Сигнатура -- это фиксированные, заранее известные байты, которые всегда следуют в начале любого пакета. Если сигнатура обнаруживается в середине пакета, а в начале пакета её нет, то у нас пропала синхронизация. Надо, опять-таки, выбросить текущий буфер, а принятую только что сигнатуру записать в начало.
Но это идеальный случай. Канал связи реальный, и в нём могут происходить сбои. Когда произошёл сбой, в буфере оказывается мусор. Заполнили буфер -- попытались разобрать -- выбросили. Заполнили ещё раз. Но из-за изначальной ошибки у нас начало пакета оказывается в середине буфера, а не в начале. Поэтому сколько буфер не выбрасывай, начало очередного пакета мы не найдём. Это потеря синхронизации.
Такая ситуация обязательно должна быть предусмотрена разработчиками. Алгоритма разрешения тут два:
1. Сброс буфера по тайм-ауту. Если слишком долго нет очередного байта, то делается вывод о том, что пауза между пакетами попала на середину буфера. Надо выбросить неполный буфер и начать приём сначала.
2. Поиск синхронизации по сигнатуре. Сигнатура -- это фиксированные, заранее известные байты, которые всегда следуют в начале любого пакета. Если сигнатура обнаруживается в середине пакета, а в начале пакета её нет, то у нас пропала синхронизация. Надо, опять-таки, выбросить текущий буфер, а принятую только что сигнатуру записать в начало.
18.03.2022 в 20:37
18.03.2022 в 21:03