Understanding gRPC architecture in simple terms

Most tutorials explain how to write a .proto file and call a gRPC method. But very few explain what actually happens after that call. I recently implemented gRPC in one of my projects and while learning it, I tried to understand its architecture from first principles — not just how to use it, but why it is designed this way and why it is fast. This post is a simple breakdown of that.