It describes a set of method signatures, the implementations of which may be provided by multiple classes that are otherwise not necessarily related to each other.
This means that a sorting method, for example, can sort a collection of any objects of types which implement the Comparable interface, without having to know anything about the inner nature of the class (except that two of these objects can be compared by means of compareTo()).
Some programming languages provide explicit language support for protocols (Ada, C#, D, Dart, Delphi, Go, Java, Logtalk, Object Pascal, Objective-C, OCaml, PHP, Racket, Seed7, Swift, Python 3.8).
In languages supporting multiple inheritance, such as C++, interfaces are implemented as abstract classes.
[3] Type classes in languages like Haskell, or module signatures in ML and OCaml, are used for many of the things that protocols are used for.