why does nat hole punching for p2p require server
===

I am required to implement a p2p communicator and read about nat hole punching. There are a few questions I don't quite understand:

1. Do I really require a server if I know the public IP address and destination of my peer?
2. In real life scenario, does it really work and what are some network policies that may cause it to fail
3. For Skype, why does it optionally also require 443 and 80 if theoretically works for any Ports?