Я разрабатываю сервер на C # (используя * асинхронные методы).Все работает нормально, пока одна сторона не нарушит протокол (например, атака на сервер).
Клиент и сервер обмениваются сообщениями следующей структуры:
- Первые 4 байта определяют длину (N) тела сообщения в байтах
- Следующие N байтов определяют тело сообщения
Если кто-то передает неправильную длину - вся связь между этим клиентом и сервером становится непредсказуемой.
Таким образом, идея состоит в том, чтобы создать самосинхронизирующийся протокол самым простым способом.
Я использую протокол TCP, поэтому идея состоит в том, чтобы разбить сообщение на пакеты, и никакие два сообщения не должны совместно использоваться.тот же пакет - так я смогу игнорировать нарушения протокола и восстановить связь, если что-то пойдет не так.
Я хочу использовать для этого TCP, поэтому пакет будет таким же, как сегмент TCP,Но есть несколько ловушек:
- MTU (который определяет MSS) может отличаться, и нет предопределенного значения для размера буфера, который я мог бы использовать (поправьте меня, если я ошибаюсь)
- Я не смог найти способ манипулирования TCP-сегментами напрямую (без абстракции «потока»).
Я новичок в программировании на сокет-серверах, поэтому мне нужна помощь.Может быть, кто-то может поделиться общим решением этой проблемы (отказоустойчивый протокол) или описать общие подводные камни, или, возможно, предоставить полезные ссылки.
Я занимаюсь разработкой под .NET и не хочу использоватьлюбой P / вызывает, если этого можно избежать.