Простейший и надежный способ (хотя и не всегда самый эффективный) состоит в том, чтобы каждый клиент выполнял исходящее TCP-соединение с известным сервером и открывал это соединение. Пока TCP-соединение открыто, данные могут передавать это TCP-соединение в любом направлении в любое время. Похоже, что и LogMeIn, и TeamViewer используют этот метод, по крайней мере, как спад. Основными недостатками этого метода являются то, что все данные должны проходить через сервер компании TeamViewer/LogMeIn (что может стать узким местом), и что TCP не обрабатывает упавшие пакеты очень хорошо - он остановится и дождитесь отбрасываемых пакетов чтобы быть возмущенными, вместо того, чтобы отказываться от них и отправлять новые данные.
Другая техника, которую они могут иногда использовать (для повышения производительности) - UDP hole-punching. Этот метод основывается на том факте, что многие брандмауэры будут принимать входящие UDP-пакеты от удаленных хостов, которые недавно установили брандмауэр-хост для исходящего UDP-пакета. Учитывая, что сервер TeamViewer/LogMeIn может сказать, что оба клиента отправляют исходящий пакет на IP-адрес брандмауэра другого клиента, а после этого (надеюсь) каждый брандмауэр будет принимать пакеты UDP с IP-адреса другого клиента. Это не всегда работает, поскольку различные брандмауэры работают по-разному и могут не включать в себя вышеупомянутую логику UDP-разрешения.
Если вы голосуете, чтобы закрыть вопрос, то, по крайней мере, скажите мне, почему! – parsley72