Handles and protocols are at the core of what makes UEFI extensible. Together they are the mechanism by which UEFI can adapt to a wide array of hardware and boot conditions, while still providing a consistent interface to drivers and applications.
Handles represent resources. A resource might be a physical device such as a disk drive or USB device, or something less tangible like a loaded executable.
A Handle is an opaque pointer, so you can't do anything with it directly. To operate on a handle you have to open a protocol.
Protocols are interfaces that provide functions to interact with a resource. For example, the BlockIO protocol provides functions to read and write to block IO devices.
Protocols are only available during the Boot Services stage; you can't access them during the Runtime stage.
The UEFI Specification defines a very large number of protocols. Because
protocols are inherently very diverse, the best place to learn about
individual protocols is the UEFI Specification. There are many
chapters covering various protocols. Not all of these protocols are
uefi-rs yet (contributions welcome!) but many of the most
commonly useful ones are.
See the Using Protocols how-to for details of the
uefi-rs API for
interacting with protocols.