webrtc candidate xxx.local mDNS ip地址问题
版权声明:转载请附上原文出处链接及本声明。 原文链接:https://www.cnblogs.com/mangshe0/p/12108400.html
如果你也遇到了类似 这种问题:
后面都是自个原因分析的小记,没啥用不用看。
————————————————– 起因:
最近用jssip开发个小demo,用来自己测试使用。
遇到了 web-发起invite时候 sdp中
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=candidate:89174025 1 udp 2113937151 50c6594a-c1f8-43dd-9370-01b8976daa4c.local 49997 typ host generation 0 network-cost 999
语音通讯地址 IPV4是0, ice-candidate中使用 ipv6.
我就无语了 前端时间用还好使。
chrome.exe -disable-ipv6 也不行.
暂时先在onSDP事件时候 sdp.replace 手动修改ip地址 解决该问题.
————————————————– 原因分析
终于解决了 之前遗留的问题,困扰我好久,用了好几天的时间,有时间有点思路就分析 找找.
首先之前的分析是正确的,就是手欠升级chrome导致的,
IP4地址是0.0.0.0, 说明媒体通讯时不使用这里,而是使用candidate中描述的地址,
这里candidate描述的地址为 50c6594a-c1f8-43dd-9370-01b8976daa4c.local,
我当初一直误以为是IPV6的地址,这个误区里挣扎了好久.
尝试将fs配置成IPV6与之进行通讯,发现仍然不行,这根本就不是个IP地址。
翻了翻历史版本的数据抓包, sdp描述的相关信息都差不多,唯独以前写IP地址的地方被换成了xxx.local 这个鬼玩应。
本地环境测试 我还可以重写sdp来绕过去,但是生产环境 nat穿个几层,那怎么搞? 所以必须得把这个问题解决了。
回退chrome虽然可以暂时解决,但是这个技术盲点,将来迟早要遇到的,啥也不说了继续研究吧。
搜索引擎检索的信息都几乎不沾边,没有捷径 前人的帮助,只能一点点翻ietf官方标准了。
https://tools.ietf.org/html/draft-wang-mmusic-encrypted-ice-candidates-00#ref-MdnsCandidate
果不其然,在IETF的草案当中 draft-wang-mmusic-encrypted-ice-candidates,终于找到了encoded_encrypted_address.local
这种结构地址的描述。
太着急了没有仔细看,误以为是IP地址被加密导致,
https://www.w3.org/TR/webrtc/#rtcicecandidate-interface 根据RTCPeerConnection candidate接口
又返回到jssip中去查设置ip地址加密的相关属性,结果肯定是没有。。。
https://jssip.net/documentation/3.3.x/api/session/#event_icecandidate
再回到ietf草案当中 定睛一看, 加密后的IP地址都是.encrypted这种格式的,
.local是属于mDNS, mDNS 这事个什么鬼,跟dns有啥关系啊?
https://tools.ietf.org/html/rfc6762 Multicast DNS
mDNS用于处理本地网络中机器名称,而不需要DNS服务器,
大致意思就是 本地网络中的机器会随机产生唯一名字类似 50c6594a-c1f8-43dd-9370-01b8976daa4c.local,
网络中其他的机器想要与之通讯 会进行mDNS广播查询, 这个名称的机器收到后会回复其IP地址.
新版本的webrtc,我目前是 79.0.3945.88(正式版本), NND就是用了这个功能,替代了原有IP地址。
因为google webrtc 的ip地址之前是直接暴漏的,一直被大家吐槽, 现在用了这个mDNS功能,将IP给隐藏起来了。。
想必很多不支持这个mDNS功能的webrtcServer都被这个功能给搞的不能通讯。
并且目前W3C webrtc接口中没有这方面的设置,
https://www.w3.org/TR/webrtc/#rtcicecandidate-interface
https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/addIceCandidate
虽然google强制开启使用mDNS功能, 还好有个开关,
chrome://flags/#enable-webrtc-hide-local-ips-with-mdns
折腾了我好几天, 就是这么一个配置。 我一个做服务器的就为了搞个测试demo, 太不容易了。。。