Эта ссылка объясняет методику «дырокола» более подробно:
http://www.brynosaurus.com/pub/net/p2pnat/
Отрывок:
3.2 Создание одноранговых сеансов
Предположим, что клиент "A" хочет установить сеанс UDP напрямую с клиентом "B".Перфорация отверстий происходит следующим образом:
«A» изначально не знает, как достичь «B», поэтому «A» просит «S» помочь установить сеанс UDP с «B».
«S» отвечает на «A» сообщением, содержащим открытые и закрытые конечные точки «B».В то же время «S» использует свой UDP-сеанс с «B» для отправки «B» сообщения запроса соединения, содержащего открытые и закрытые конечные точки «A».Как только эти сообщения получены, «A» и «B» знают общие и частные конечные точки друг друга.
Когда «A» получает открытые и частные конечные точки «B» от «S», запускается «A»отправка пакетов UDP на обе эти конечные точки, а затем «блокировка» в зависимости от того, какая конечная точка сначала выдает действительный ответ от «B».Точно так же, когда «B» получает открытые и частные конечные точки «A» в перенаправленном запросе соединения, «B» начинает отправку пакетов UDP на «A» в каждой из известных конечных точек «A», блокируя в первой конечной точке, котораяработает.Порядок и время этих сообщений не являются критическими, если они асинхронные.