Мне нужно установить соединение между сервером и клиентами, которые могут находиться за любым типом NAT. Для этого у меня есть выделенный хост в Интернете с чистым IP для размещения сервера STUN / TURN. Я не собираюсь использовать WebRTC, я просто хочу использовать сервер STUN / TURN для обмена сообщениями между клиентами и сервером. После прочтения RFC, SO и т. Д. У меня остались неясные вопросы:
- В каком случае используется STUN? Насколько я понимаю, STUN используется только для Full-cone NAT. Во всех остальных случаях необходимо использовать сервер TURN из-за ограничений хоста и / или порта. Это верно?
- Кажется, мне нужен сигнальный сервер, чтобы уведомлять клиентов об адресе сервера и наоборот. Но как только клиент / сервер отправляет сообщение на сервер сигнализации, я узнаю их внешний host: port, поэтому я сообщаю каждой стороне информацию о host: port другой стороны, каждая сторона может отправлять сообщения на этот сигнальный сервер, содержащий данные host: port. , который сервер сигнализации может использовать, чтобы определить, для какого однорангового узла предназначено это сообщение, и переслать его соответствующему одноранговому узлу. На первый взгляд эта логика кажется мне довольно простой, и мой сигнальный сервер становится TURN-сервером - так ли реализован TURN-сервер? Но если это так, я не понимаю, зачем мне нужен сервер TURN, такой как «coturn», «reTurn» и т. Д.? Я знаю, что они реализуют ICE, но как этот ICE будет работать, если мой сервер сигнализации получил сообщение от конкретного хоста: порт однорангового узла, так что это единственный кандидат, который может использоваться для соединения с одноранговым узлом?
- В случае ограниченного NAT (порт, адрес или симметричный), как долго внешний (общедоступный) порт клиента открыт на маршрутизаторе для приема дейтаграмм UDP? Я читал, что клиент TURN отправляет на сервер сообщения с обновлением, чтобы канал оставался открытым. Таким образом клиент также предотвращает закрытие портов?