Я так понимаю, что интересен случай ipv4, где многие узлы могут делить один адрес.
В этом случае всё разруоивается при помощи NAT.
1. Когда через поутер проходит какой-то запрос во внешнюю сеть - он подменяет адрес отправителя на свой, а также прописывает в порт отправителя какой-нибудь ещё не занятый порт, чтобы можно было отличить одного клиента от другого.
2. При этом он у себя в памяти сохраняет, кто на самом деле отправил запрос и с каким изначально портом, чтобы можно было отправить обратно.
3. Когда приходит ответ от сервера - в адрес назначения и порт подсовывается то, что было заранее сохранено.
4. При закрытии соединения - запись убирается.
Он работает полностью автономно и по пути следования таких может быть много.
Из описания можно понять, что NAT будет нормально работать только с TCP, тк только у него есть явно прописанное время жизни пакета и явный процесс закрытия.
Также есть проброс портов - по факту то же самое, но настраивается заранее либо при помощи upnp.