Start here. This is the direct spoken answer to practice first.
Overview
Both mechanisms can describe behavior, but they differ in how implementations opt in and what the runtime knows.
A Protocol describes the members a type must have for static structural typing. A class can satisfy it without inheriting from or even knowing about the protocol, which is useful for adapters and third-party types. An abstract base class is a nominal runtime relationship: implementations normally inherit or register and can share concrete behavior, class-level invariants, or an explicit family identity. I choose based on whether compatible behavior is enough or membership in the hierarchy matters.