Urbit's network is federated, not decentralized (although it could be).
Currently, you get a planet under a star under a galaxy. Galaxies are all discoverable under galaxy.urbit.org, and have a hard-coded public key in the kernel.
If I start up a planet under ~doznec under ~zod, and I want to talk to someone else, I first check if I already exchanged public keys with them and know their IP address. If I don't then I ask ~doznec (my parent). If they don't know, I ask ~zod. If they don't know, then I ask the galaxy that is the ancestor of the person to route me to the client, either on my behalf if I'm behind an extremely restricted NAT or just send me the IP and let us handshake. Galaxies are essentially root CAs.
There are also unknown, reputationless urbits called "comets". Their names, instead of being a number that maps to their hierarchy in the network, is the hash of their public key. This way, if you send a message to ~some-commet you are essentially using a pinned certificate. You still use ~zod for the initial sync of urbit files and TURN in the case of NAT, however. I don't see any reason why this can't become a DHT instead of using ~zod, however.
You can verify peers public key out of band if you want, or even add the peer to your known ships list manually if you are paranoid. You can even change the hard-coded galaxy keys in the source code, and then spin up your own galaxy...it just won't be trusted by anyone else on the network, and is probably a bad idea.
I'm not really sure what you mean by "classic plain text protocol"? Urbit builds its own network stack on top of UDP, that provides "exactly-once"(ish) messaging. All messages are just Nock nouns sent over the wire, with native support for RPC messages. You can just run `|hi ~haptem-fopnys "how are you?"`, and we have an IRC simulacra called :talk that you can switch to with ^X (type `;join ~doznec/urbit-meta`