Trouble understanding Flannel and Calico

Currently I’m trying to deep dive into K8S networking. After understanding the basics of same-node pod networking using network namespaces and a bridge, i’m trying to piece it together when it comes to networking across nodes. When talking about Flannel, what exactly is an overlay network, or a VXLAN? Why does it use UDP tunneling (specifically, why on that OSI layer)?
On the other hand, Calico uses IPinIP. How are the private IP ranges routable?

Given we know how to set up network namespaces and link them up on a node manually, can we also manually set up routes between nodes for each of the pod private IP ranges, since the nodes must be connected anyways?