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