В общих чертах p2p строится так:
Есть 2 клиента А и Б, которые хотят установить между собой соеденение и есть сервер С, к которому оба подключены.
клиент А отправляет на сервер С запрос "хочу соединиться с Б"
сервер С отправляет на клиент Б "клиент А хочет соединиться"
клиент Б может отказаться от соединения, уведомив об этом А через сервер
клиент Б может принять соеденение, тогда он начинает слушать произвольный порт и отправляет на сервер "принимаю А, мой порт: ХХХХ, моя подпись: УУУУ"
сервер отправляет А "клиент Б принял соеденение, IP адрес, порт, подпись"
А соеденяется с Б и отправляет подпись
Если подпись корректна Б перестает слушать порт, соеденение установлено
При некоректной подписи Б рвет соеденение (подключился не А)