The simplest take on the concept is get a 3rd party with a public address to exchange the current port tuples used to connect to it between the 2 clients so the clients can then use this information to connect directly.
Beyond the basic take on it there really isn't an intuitive single explanation because "simple" things like "NAT traversal" quickly turn into "Full-cone NAT to Port-restricted NAT with UPnP behind CG-NAT" individual corner cases endlessly fighting the need to just go to IPv6.