Transport Interface

If I consider myself a node behind a NAT and want to create a node with a real communication address I have to know my actual address. Since the examples are not actually going over any network, I am wondering, how I can create a real node like:
createNode([TCP, WebSockets], ['/ip4/', '/ip4/'])
but with real addresses.

Further question: Where is the difference from setting up a Transport and than dialing:
const transport = new Transport({ upgrader, ...[options] })
const connection = await transport.dial(multiaddr, [options])


node1.dialProtocol(node2.peerId, '/print')

Thanks in advance for any help !