So it's a unicast?
In that case, shouldn't there be a DNS type of thing which hold the address for the nodes so that each individual node can contact other nodes and not broadcast it?
Correct.
Each node software creator is allowed to use whatever method they like to find and keep track of the IP addresses and port numbers of other nodes
Bitcoin Core keeps a list of all the other nodes that it has connected or is aware of from the past.
When a Bitcoin Core node first connects to another node, it immediately uses a "getaddr" message to ask that node for a list of all the IP addresses and ports that node knows about, and it adds them to ts own list.
During the very first time that a node powers up, there is a node discovery process that it uses to find out about some Bitcoin Nodes. You can read about that process here:
https://en.bitcoin.it/wiki/Satoshi_Client_Node_Discovery