ICE собирает список потенциальных IP-адресов / портов назначения, к которым необходимо подключиться.Каждый пир собирает их, а затем каждый запускает проверку соединения для каждого из кандидатов по порядку, пока либо проверка не пройдет, либо проверка не пройдет.
Когда Алиса пытается соединиться с Бобом, она каким-то образом получает списоквозможные пути - определенные Бобом - она может соединиться с Бобом.ICE называет этих кандидатов.Боб мог бы сказать, например: «мой локальный сокет 192.168.1.1:1024/udp, моя внешняя привязка NAT (найденная через STUN) - 196.25.1.1:4454/udp, и вы можете вызвать медиасервер (промежуточное окно) на уровне 1.2.3.4: 6675 / УДП».Боб помещает это в пакет SDP (описание этих различных кандидатов) и каким-то образом отправляет это Алисе.(В SIP, исходном сценарии использования для ICE, SDP переносятся при обмене SIP INVITE / 200 / ACK, устанавливая сеанс SIP.)
ICE является подключаемым, и вы можете настроить точный характер / числокандидатов.Вы можете попробовать прямую ссылку, а затем запросить привязку у сервера STUN (это пробивает дыру в вашем NAT и сообщает вам внешний IP / порт этой дыры, который вы вставили в описание сеанса.) и обратился к серверу TURN с просьбой передать ваши данные.
Недостатком ICE является то, что ваши коллеги обмениваются описаниями SDP , которые вы можете или можете использоватьне как.Другая причина заключается в том, что поддержка TCP все еще находится в черновой форме 1016 *, что может быть или не быть проблемой для вас.[ОБНОВЛЕНИЕ: ICE теперь официально RFC 6544 .]
Игры часто используют UDP, потому что старые данные бесполезны.(Вот почему RTP обычно работает по протоколу UDP.) Некоторые приложения P2P часто используют промежуточные или сети промежуточных ячеек.
IRC использует сеть промежуточных ящиков: серверы IRC образуют сети, а клиенты подключаются к ближайшему серверу.Сообщения от одного клиента другому могут проходить через сеть серверов.
Если все это не удастся, вы можете взглянуть на архитектуру BitTorrent и посмотреть, как они решают проблему NAT.Как указывает CodeShadow в комментариях ниже, BitTorrent полагается на достижимые одноранговые узлы в сети: в некотором смысле некоторые одноранговые узлы образуют сеть промежуточных ящиков.Если эти промежуточные блоки могут выступать в роли реле, у вас будет IRC-подобная архитектура, но настроенная динамически.