Маршрутизатор (работает NAT) отслеживает все исходящие пакеты, а затем разрешает входящие пакеты, которые являются ответами на эти исходящие пакеты.
Так что, если вы создадите исходящее TCP-соединение с google.com:80, это позволитпакеты обратно (в ответ) от google.com:80.Если два внутренних хоста устанавливают соединение с одним и тем же портом, они могут различать их, поскольку локальный порт отличается, например:
1) Хост A устанавливает соединение с Google, а маршрутизатор использует свой собственный локальный порт 10001 дляTCP-соединение
2) Хост B устанавливает аналогичное соединение, и маршрутизатор использует собственный локальный порт 10002 для TCP-соединения
Если пакет приходит с google.com:80 и его адресдля порта 10001 на IP-адресе WAN маршрутизатора знает, что маршрутизатор знает, чтобы отправить его на хост A. Если он адресован для порта 10002, маршрутизатор знает, чтобы отправить его на хост B.
Если у вас есть два одноранговых хостаза маршрутизаторами (два NAT) тогда нет никакого способа установить соединение, за исключением того, что если есть что-то для передачи информации о IP-адресах друг друга (то есть сервера, который они оба могут использовать для обмена информацией), они могут попытаться угадать, какой порт будет маршрутизаторвыберите в качестве локального порта, а затем начните отправлять друг другу данные по этому порту на маршрутизаторы WAN IP.Поскольку оба маршрутизатора видят, что данные выходят из строя, они устанавливают правило, разрешающее ввод данных.Если порты угаданы правильно, пакеты с каждой стороны могут пройти, потому что оба маршрутизатора имеют настроенное правило.Это называется UDP / TCP Hole Punching.
http://en.wikipedia.org/wiki/UDP_hole_punching
Я считаю, что Skype является примером приложения, которое использует UDP и выполняет дырокол.