Я провел дни, выискивая проблему с подключением без какой-либо удачи. Я пытаюсь реализовать относительно простой one2one Call с Kurento.
Ниже вы найдете журнал отладки Куренто для случая, когда соединение могло быть установлено, и случая, когда соединение не удалось.
Если вам нужны дополнительные журналы (например, клиенты, сервер сигнализации, tcpdumps или журналы трассировки Kurento, просто дайте мне знать, и я предоставлю!)
Любая помощь или новый вклад приветствуется!
Описание проблемы:
Примерно в 30% случаев соединение WebRTC не может быть установлено. К сожалению, мне не хватает какого-либо паттерна, когда Соединение может быть установлено, а когда нет, оно кажется совершенно случайным. Я нахожусь в той же сети, использую те же устройства, использую тот же сервер TURN, использую тот же протокол сигнализации, но в 30% случаев соединение не может быть установлено.
Когда я запускаю приложение локально, кажется, что оно работает намного надежнее, соединение может быть установлено почти в 100% случаев (или, может быть, даже в 100% случаев, я столько раз тестировал, что терял трек). Я настроил инфраструктуру локально с помощью Docker и запускаю различные контейнеры (TURN, Kurento, Signaling) в отдельных сетях, чтобы имитировать производственное развертывание.
Мы наблюдаем такое же поведение в нашей среде разработки и производства. В нашей среде разработки у нас абсолютно нет брандмауэров, так что, похоже, это не проблема.
Что я пытался найти причину проблемы:
В основном я сравнивал журналы дел, которые работали, и дел, которые не работали, но я не смог найти какой-либо существенной разницы между ними, которая могла бы указать мне на проблему.
Я протестировал соединение WebRTC через сервер TURN (с Firefox и флагом force_relay) и напрямую через Kurento, но в обоих случаях соединение не удается в ~ 30% случаев.
Я попытался отфильтровать всех кандидатов ICE, которые не являются кандидатами на ретрансляцию.
Я прослушал трафик между нашим сигнальным сервером (который также контролирует Kurento) и Kurento, чтобы увидеть какие-либо различия в обмене сообщениями JSON RPS, но они, по сути, одинаковы.
Я проверил наш сервер STUN и TURN с помощью этого инструмента: https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/, и я получил как серверные рефлексивные, так и ретрансляционные кандидаты, которые выглядят правильно
Я обнаружил трафик от клиентов по успешному и неудачному соединению, но смог заметить существенную разницу
Я упростил медиа-конвейер Kurento (без записи, без хабов), но поведение такое же
Я использовал разные браузеры (Chrome, Firefox и нативная реализация iOS), но поведение такое же
Kurento отладки журналов случая, когда соединение может быть установлено:
https://gist.github.com/omnibrain/2bc7ad54f626d278d3c8bac29767ac4c
Журналы отладки Куренто для случая, когда соединение НЕ МОЖЕТ быть установлено:
https://gist.github.com/omnibrain/f7caee04a5c6d77ea22a9ccfa95dd825