Вы почти правы в своем описании NAT.Единственная ошибка, которую вы допустили, это то, что указал Питер: клиент всегда является тем, кто инициирует соединение.
Теперь, если обе стороны имеют публичные IP-адреса, все в порядке, и любая сторона может быть сервером.
Если одна сторона находится за NAT, а другая имеет публичный IP-адрес, то все в порядке, если сторона, находящаяся за NAT, инициирует соединение.В этом случае маршрутизатор NAT запоминает, куда отправлять ответы с сервера.
И, наконец, если обе стороны находятся за NAT, создается впечатление, что установить соединение невозможно, но на самом деле это не всегда так.,Есть одна хитрость, которая называется " дырокол ".Это разновидность белой магии, и она не всегда работает, но работает достаточно часто, чтобы ее можно было успешно использовать, например, в Skype.