timzaak / blog

8 stars 1 forks source link

远程协助 技术研究 #57

Closed timzaak closed 3 years ago

timzaak commented 4 years ago

最近对远程协助比较感兴趣,故专门研究了一下,主要是思考 Teamviewer 如何实现。

网络层 p2p通信

由于 NAT 机制原因,纯靠 p2p 打洞通信,不行,需要涉及通过公网服务器周转。 目前解决此类问题并产品化的有 Zerotier、WebRTC。

WebRTC 更重要的一点是 chrome 浏览器本身支持 ,方便后续客户端拓展。

Media 传输

第一种方案是沿用老的,比如要被远程协助的机器是Linux,那就用VNC协议,Windows10则是RDP协议,至于 Mac, 目前还没研究。后续开发上,只需要在这两个协议上,做用户体验一致性兼容即可。相关源码有 TigerVPN,FreeRDP。

第二种就比较通用一些,截屏,然后对不不同点,进行 diff 推送,再在客户端还原回来,缺点就是资源消耗严重。

现在有些显卡能直接获取桌面视频流,不需要消耗大量的cpu进行截屏。

以上两种方法,都只适合远程协助,如果是远程看视频啥的,就崩掉了。

timzaak commented 3 years ago

WebRTC 在 Go 生态有 Pion 库实现,Rust 生态零星实现了一些单一功能,例如 rusturn 实现了turn 服务。 目前重心要先放 stable 的Webrtc 实现,老的 WebRTC 开源项目有三个,目前先拣选 kurento 看起,顺着这个库,又能找到 GStream multimedia 框架,以及 libnice ICE 实现。

而编译环境,有的只支持 Ubuntu,编译工具甚至都得下载 deb 包。我这 OpenSUSE 的电脑,有点麻烦。

timzaak commented 3 years ago

libnice 简单看了看后(只看源码,搞不定Debug)。又找到了 IPFS,想看看这种分布式存储怎么做的,底层一定会用到p2p通讯,果不其然,找到了 libp2p 这个有 Go\Rust\Python\Javascript\C++ 实现的库。 这个世界,在没有技术大跃进的时候,我能想到的东西都已经有了。只看有没有耐心一点点找了。幸好,没把时间过多地花在如何跑 libnice 上。

Rust 版本的 libp2p 并没有实现Nat 穿透,都是 TCP 协议。 需要额外的 p2p 框架补充实现。

timzaak commented 3 years ago

找来找去,没想到是眼下黑, ZeroTier 才是我想要的网络层实现。特别棒的开源项目!剩下的就是需要潜心学习了。

drawio for ZeroTier One

还有很多代码以外的东西,无法了解,例如:框架的选型、当前这套代码是否有啥问题等。假如我用 rust 重写,也顶多是依赖可能的 rust 特定框架,思路、架构上,不会有啥提升。

zeroTier-drawio

timzaak commented 3 years ago

zerotier 在国内网络环境下,必须有relay。否则跨地区跨网络,丢包十分严重。慢慢的有些理解 libp2p 的定位,更多的不是面向组网,而是互通,以及 数据mixer 传输。

简单总结一下, nat 穿透在国内的网络环境下,其实是伪命题。需要中继 relay。 libp2p 更多的是面向多个编码(视频音频之类)混合数据传输,但由于走TCP,所以走普通的数据流也没问题。

timzaak commented 3 years ago

anydesk 的数据流量 是1Mb/s, vnc 则就需要到 7~8 Mb/s 。需要好好研究一下如何解决压缩问题

timzaak commented 2 years ago

78

timzaak commented 2 months ago

KasmVNC 这个客户端专注于浏览器