Closed timzaak closed 3 years ago
WebRTC 在 Go 生态有 Pion 库实现,Rust 生态零星实现了一些单一功能,例如 rusturn 实现了turn 服务。 目前重心要先放 stable 的Webrtc 实现,老的 WebRTC 开源项目有三个,目前先拣选 kurento 看起,顺着这个库,又能找到 GStream multimedia 框架,以及 libnice ICE 实现。
而编译环境,有的只支持 Ubuntu,编译工具甚至都得下载 deb 包。我这 OpenSUSE 的电脑,有点麻烦。
libnice 简单看了看后(只看源码,搞不定Debug)。又找到了 IPFS,想看看这种分布式存储怎么做的,底层一定会用到p2p通讯,果不其然,找到了 libp2p 这个有 Go\Rust\Python\Javascript\C++ 实现的库。 这个世界,在没有技术大跃进的时候,我能想到的东西都已经有了。只看有没有耐心一点点找了。幸好,没把时间过多地花在如何跑 libnice 上。
Rust 版本的 libp2p 并没有实现Nat 穿透,都是 TCP 协议。 需要额外的 p2p 框架补充实现。
找来找去,没想到是眼下黑, ZeroTier 才是我想要的网络层实现。特别棒的开源项目!剩下的就是需要潜心学习了。
还有很多代码以外的东西,无法了解,例如:框架的选型、当前这套代码是否有啥问题等。假如我用 rust 重写,也顶多是依赖可能的 rust 特定框架,思路、架构上,不会有啥提升。
zerotier 在国内网络环境下,必须有relay。否则跨地区跨网络,丢包十分严重。慢慢的有些理解 libp2p 的定位,更多的不是面向组网,而是互通,以及 数据mixer 传输。
简单总结一下, nat 穿透在国内的网络环境下,其实是伪命题。需要中继 relay。 libp2p 更多的是面向多个编码(视频音频之类)混合数据传输,但由于走TCP,所以走普通的数据流也没问题。
anydesk 的数据流量 是1Mb/s, vnc 则就需要到 7~8 Mb/s 。需要好好研究一下如何解决压缩问题
最近对远程协助比较感兴趣,故专门研究了一下,主要是思考 Teamviewer 如何实现。
网络层 p2p通信
由于 NAT 机制原因,纯靠 p2p 打洞通信,不行,需要涉及通过公网服务器周转。 目前解决此类问题并产品化的有 Zerotier、WebRTC。
WebRTC 更重要的一点是 chrome 浏览器本身支持 ,方便后续客户端拓展。
Media 传输
第一种方案是沿用老的,比如要被远程协助的机器是Linux,那就用VNC协议,Windows10则是RDP协议,至于 Mac, 目前还没研究。后续开发上,只需要在这两个协议上,做用户体验一致性兼容即可。相关源码有 TigerVPN,FreeRDP。
第二种就比较通用一些,截屏,然后对不不同点,进行 diff 推送,再在客户端还原回来,缺点就是资源消耗严重。
现在有些显卡能直接获取桌面视频流,不需要消耗大量的cpu进行截屏。
以上两种方法,都只适合远程协助,如果是远程看视频啥的,就崩掉了。