Два браузера Chrome: Алиса (A), Боб (B). Разные сети, поэтому я использую сервер Coturn (свой).

Проблема в том, что когда А создает оффер - все в порядке, ледяное соединение переходит в состояние «подключен», все работает нормально. Но если B создает предложение - каждый партнер получает одинаковых кандидатов Ice, но состояние ледового соединения через 10 секунд «проверка» переходит в «отключено». Это зависит от того, в какой сети находится B. Только в некоторых сетях есть такая проблема.

Вот подробности:

Не рабочий случай:

B создает предложение. Его дескриптор:

v=0  
o=- 8029235411980231901 2 IN IP4 127.0.0.1  
s=-  
t=0 0  
a=group:BUNDLE 0 1  
a=msid-semantic: WMS ZX5bxsJkF64NCyKHSLQyIbHoU0nLjkjehVPE  
m=audio 9 UDP\/TLS\/RTP\/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126  
c=IN IP4 0.0.0.0  
a=rtcp:9 IN IP4 0.0.0.0  
a=ice-ufrag:L8TQ  
a=ice-pwd:sQx1uSKfnmvUAsXBrzRlLJzw  
a=ice-options:trickle  
a=fingerprint:sha-256 25:12:9F:F2:50:A7:68:F0:73:C9:E7:87:C5:44:CD:CE:7E:14:12:3D:BF:E0:52:2F:3B:5C:7E:1B:29:35:DF:77  
a=setup:actpass  
a=mid:0  
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level  
a=extmap:2 http:\/\/www.webrtc.org\/experiments\/rtp-hdrext\/abs-send-time  
a=extmap:3 http:\/\/www.ietf.org\/id\/draft-holmer-rmcat-transport-wide-cc-extensions-01  
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid  
a=extmap:5 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id  
a=extmap:6 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id  
a=sendrecv  
a=msid:ZX5bxsJkF64NCyKHSLQyIbHoU0nLjkjehVPE 4f8d8244-9ed8-4128-b4bd-3cdaaeb31ef3  
a=rtcp-mux  
a=rtpmap:111 opus\/48000\/2  
a=rtcp-fb:111 transport-cc  
a=fmtp:111 minptime=10;useinbandfec=1  
a=rtpmap:103 ISAC\/16000  
a=rtpmap:104 ISAC\/32000  
a=rtpmap:9 G722\/8000  
a=rtpmap:0 PCMU\/8000  
a=rtpmap:8 PCMA\/8000  
a=rtpmap:106 CN\/32000  
a=rtpmap:105 CN\/16000  
a=rtpmap:13 CN\/8000  
a=rtpmap:110 telephone-event\/48000  
a=rtpmap:112 telephone-event\/32000  
a=rtpmap:113 telephone-event\/16000  
a=rtpmap:126 telephone-event\/8000  
a=ssrc:2775790640 cname:yRYToPhoe5nm5Lkn  
a=ssrc:2775790640 msid:ZX5bxsJkF64NCyKHSLQyIbHoU0nLjkjehVPE 4f8d8244-9ed8-4128-b4bd-3cdaaeb31ef3  
a=ssrc:2775790640 mslabel:ZX5bxsJkF64NCyKHSLQyIbHoU0nLjkjehVPE  
a=ssrc:2775790640 label:4f8d8244-9ed8-4128-b4bd-3cdaaeb31ef3  
m=video 9 UDP\/TLS\/RTP\/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 124 119 123
c=IN IP4 0.0.0.0  
a=rtcp:9 IN IP4 0.0.0.0  
a=ice-ufrag:L8TQ  
a=ice-pwd:sQx1uSKfnmvUAsXBrzRlLJzw  
a=ice-options:trickle  
a=fingerprint:sha-256 25:12:9F:F2:50:A7:68:F0:73:C9:E7:87:C5:44:CD:CE:7E:14:12:3D:BF:E0:52:2F:3B:5C:7E:1B:29:35:DF:77  
c  
a=mid:1  
a=extmap:14 urn:ietf:params:rtp-hdrext:toffset  
a=extmap:2 http:\/\/www.webrtc.org\/experiments\/rtp-hdrext\/abs-send-time  
a=extmap:13 urn:3gpp:video-orientation  
a=extmap:3 http:\/\/www.ietf.org\/id\/draft-holmer-rmcat-transport-wide-cc-extensions-01  
a=extmap:12 http:\/\/www.webrtc.org\/experiments\/rtp-hdrext\/playout-delay  
a=extmap:11 http:\/\/www.webrtc.org\/experiments\/rtp-hdrext\/video-content-type  
a=extmap:7 http:\/\/www.webrtc.org\/experiments\/rtp-hdrext\/video-timing  
a=extmap:8 http:\/\/www.webrtc.org\/experiments\/rtp-hdrext\/color-space  
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid  
a=extmap:5 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id  
a=extmap:6 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id  
a=sendrecv  
a=msid:ZX5bxsJkF64NCyKHSLQyIbHoU0nLjkjehVPE 65e0c0d9-234e-41ec-ba90-0bde346b97f7  
a=rtcp-mux  
a=rtcp-rsize  
a=rtpmap:96 VP8\/90000  
a=rtcp-fb:96 goog-remb  
a=rtcp-fb:96 transport-cc  
a=rtcp-fb:96 ccm fir  
a=rtcp-fb:96 nack  
a=rtcp-fb:96 nack pli  
a=rtpmap:97 rtx\/90000  
a=fmtp:97 apt=96  
a=rtpmap:98 VP9\/90000  
a=rtcp-fb:98 goog-remb  
a=rtcp-fb:98 transport-cc  
a=rtcp-fb:98 ccm fir  
a=rtcp-fb:98 nack  
a=rtcp-fb:98 nack pli  
a=fmtp:98 profile-id=0  
a=rtpmap:99 rtx\/90000  
a=fmtp:99 apt=98  
a=rtpmap:100 VP9\/90000  
a=rtcp-fb:100 goog-remb  
a=rtcp-fb:100 transport-cc  
a=rtcp-fb:100 ccm fir  
a=rtcp-fb:100 nack  
a=rtcp-fb:100 nack pli  
a=fmtp:100 profile-id=2  
a=rtpmap:101 rtx\/90000  
a=fmtp:101 apt=100  
a=rtpmap:102 H264\/90000  
a=rtcp-fb:102 goog-remb  
a=rtcp-fb:102 transport-cc  
a=rtcp-fb:102 ccm fir  
a=rtcp-fb:102 nack  
a=rtcp-fb:102 nack pli  
a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f  
a=rtpmap:121 rtx\/90000  
a=fmtp:121 apt=102  
a=rtpmap:127 H264\/90000  
a=rtcp-fb:127 goog-remb  
a=rtcp-fb:127 transport-cc  
a=rtcp-fb:127 ccm fir  
a=rtcp-fb:127 nack  
a=rtcp-fb:127 nack pli  
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f  
a=rtpmap:120 rtx\/90000  
a=fmtp:120 apt=127  
a=rtpmap:125 H264\/90000  
a=rtcp-fb:125 goog-remb  
a=rtcp-fb:125 transport-cc  
a=rtcp-fb:125 ccm fir  
a=rtcp-fb:125 nack  
a=rtcp-fb:125 nack pli  
a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d001f  
a=rtpmap:107 rtx\/90000  
a=fmtp:107 apt=125  
a=rtpmap:108 H264\/90000  
a=rtcp-fb:108 goog-remb  
a=rtcp-fb:108 transport-cc  
a=rtcp-fb:108 ccm fir  
a=rtcp-fb:108 nack  
a=rtcp-fb:108 nack pli  
a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=64001f  
a=rtpmap:109 rtx\/90000  
a=fmtp:109 apt=108  
a=rtpmap:124 red\/90000  
a=rtpmap:119 rtx\/90000  
a=fmtp:119 apt=124  
a=rtpmap:123 ulpfec\/90000  
a=ssrc-group:FID 2392484040 323248106  
a=ssrc:2392484040 cname:yRYToPhoe5nm5Lkn  
a=ssrc:2392484040 msid:ZX5bxsJkF64NCyKHSLQyIbHoU0nLjkjehVPE 65e0c0d9-234e-41ec-ba90-0bde346b97f7  
a=ssrc:2392484040 mslabel:ZX5bxsJkF64NCyKHSLQyIbHoU0nLjkjehVPE  
a=ssrc:2392484040 label:65e0c0d9-234e-41ec-ba90-0bde346b97f7  
a=ssrc:323248106 cname:yRYToPhoe5nm5Lkn  
a=ssrc:323248106 msid:ZX5bxsJkF64NCyKHSLQyIbHoU0nLjkjehVPE 65e0c0d9-234e-41ec-ba90-0bde346b97f7  
a=ssrc:323248106 mslabel:ZX5bxsJkF64NCyKHSLQyIbHoU0nLjkjehVPE  
a=ssrc:323248106 label:65e0c0d9-234e-41ec-ba90-0bde346b97f7 

Кандидат Ice, который получает B от A и добавляет к своему одноранговому соединению:

candidate:3596738868 1 udp 2122260223 192.168.1.16 60011 typ host generation 0 ufrag UxdQ network-id 1  
candidate:544315616 1 udp 1686052607 {A ip here} 60011 typ srflx raddr 192.168.1.16 rport 60011 generation 0 ufrag UxdQ network-id 1  
candidate:2564955588 1 tcp 1518280447 192.168.1.16 9 typ host tcptype active generation 0 ufrag UxdQ network-id 1

Ледяные кандидаты, которые получают A от B и добавляют к своему одноранговому соединению:

candidate:211156821 1 udp 2122260223 192.168.1.5 57710 typ host generation 0 ufrag L8TQ network-id 1 network-cost 10  
candidate:211156821 1 udp 2122260223 192.168.1.5 57711 typ host generation 0 ufrag L8TQ network-id 1 network-cost 10  
candidate:2781507712 1 udp 1686052607 {B ip here} 8101 typ srflx raddr 192.168.1.5 rport 57710 generation 0 ufrag L8TQ network-id 1 network-cost 10  
candidate:2781507712 1 udp 1686052607 {B ip here} 8102 typ srflx raddr 192.168.1.5 rport 57711 generation 0 ufrag L8TQ network-id 1 network-cost 10  
candidate:1108738981 1 tcp 1518280447 192.168.1.5 9 typ host tcptype active generation 0 ufrag L8TQ network-id 1 network-cost 10  
candidate:1108738981 1 tcp 1518280447 192.168.1.5 9 typ host tcptype active generation 0 ufrag L8TQ network-id 1 network-cost 10  

После этого оба одноранговых соединения переходят в состояние «проверка» (я имею в виду состояние ледяного соединения). Через ~ 15 сек они переходят в состояние "отключен"

Рабочий кейс:
Иногда одноранговые узлы подключаются даже тогда, когда B создает предложение, но довольно редко. Итак, вот 2 случая - когда B создает предложение, и когда A.
Я не буду вставлять сюда SDP, потому что он всегда один и тот же (отличается от a = setup: actpass | active).

B создает предложение (но теперь работает!):

Кандидат Ice, который получает B от A и добавляет к своему одноранговому соединению:

candidate:3596738868 1 udp 2122260223 192.168.1.16 58234 typ host generation 0 ufrag kplj network-id 1  
candidate:544315616 1 udp 1686052607 {A ip here} 58234 typ srflx raddr 192.168.1.16 rport 58234 generation 0 ufrag kplj network-id 1  
candidate:2564955588 1 tcp 1518280447 192.168.1.16 9 typ host tcptype active generation 0 ufrag kplj network-id 1  

Ледяные кандидаты, которые получают A от B и добавляют к своему одноранговому соединению:

candidate:211156821 1 udp 2122260223 192.168.1.5 55597 typ host generation 0 ufrag THyF network-id 1 network-cost 10  
candidate:211156821 1 udp 2122260223 192.168.1.5 55598 typ host generation 0 ufrag THyF network-id 1 network-cost 10  
candidate:2781507712 1 udp 1686052607 {B ip here} 10637 typ srflx raddr 192.168.1.5 rport 55597 generation 0 ufrag THyF network-id 1 network-cost 10  
candidate:2781507712 1 udp 1686052607 {B ip here} 10646 typ srflx raddr 192.168.1.5 rport 55598 generation 0 ufrag THyF network-id 1 network-cost 10  
candidate:1108738981 1 tcp 1518280447 192.168.1.5 9 typ host tcptype active generation 0 ufrag THyF network-id 1 network-cost 10  
candidate:1108738981 1 tcp 1518280447 192.168.1.5 9 typ host tcptype active generation 0 ufrag THyF network-id 1 network-cost 10 

A создает предложение (работает всегда):

Кандидат Ice, который получает B от A и добавляет к своему одноранговому соединению:

candidate:3596738868 1 udp 2122260223 192.168.1.16 60034 typ host generation 0 ufrag WGEW network-id 1  
candidate:3596738868 1 udp 2122260223 192.168.1.16 60035 typ host generation 0 ufrag WGEW network-id 1  
candidate:544315616 1 udp 1686052607 {A ip here} 60034 typ srflx raddr 192.168.1.16 rport 60034 generation 0 ufrag WGEW network-id 1  
candidate:544315616 1 udp 1686052607 {A ip here} 60035 typ srflx raddr 192.168.1.16 rport 60035 generation 0 ufrag WGEW network-id 1  
candidate:2564955588 1 tcp 1518280447 192.168.1.16 9 typ host tcptype active generation 0 ufrag WGEW network-id 1  
candidate:2564955588 1 tcp 1518280447 192.168.1.16 9 typ host tcptype active generation 0 ufrag WGEW network-id 1  

Кандидат Ice, который получает A от B и добавляет к своему одноранговому соединению:

candidate:211156821 1 udp 2122260223 192.168.1.5 49288 typ host generation 0 ufrag QIgM network-id 1 network-cost 10  
candidate:2781507712 1 udp 1686052607 {B ip here} 13932 typ srflx raddr 192.168.1.5 rport 49288 generation 0 ufrag QIgM network-id 1 network-cost 10  
candidate:1108738981 1 tcp 1518280447 192.168.1.5 9 typ host tcptype active generation 0 ufrag QIgM network-id 1 network-cost 10 

Итак, единственная разница с портом srflx - может быть, когда он ниже 10000, он блокирует пакеты UDP? Но что с этим делать - мы не контролируем эти порты, а процесс обнаружения ICE Coturn. Второе - может быть, какие-то проблемы с асинхронными процессами на стороне клиента (менее гладко, но все же) - но почему только в некоторых сетях?

0
Skolopednra 12 Фев 2021 в 01:35

1 ответ

Лучший ответ

Вы не получаете кандидатов с typ relay, что означает, что вы используете свой TURN-сервер только в качестве STUN-сервера. Есть несколько NAT, где это может привести к сбою в установлении соединения в зависимости от того, кто предлагает. Уже несколько лет существует открытая ошибка в реализации webrtc в Chrome. здесь

Работающий сервер TURN позволяет избежать этой проблемы.

1
Philipp Hancke 12 Фев 2021 в 14:12