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