【发布时间】:2012-03-18 22:11:21
【问题描述】:
抱歉篇幅太长,有点必要。
简介
我正在为 Windows Vista/7 使用 C# 4.0 开发远程桌面软件(只是为了好玩)。我已经克服了一些基本障碍:我有一个强大的 UDP 消息传递系统,相对干净的程序设计,我有一个镜像驱动程序(来自 DemoForge 的免费 DFMirage 镜像驱动程序)启动并运行,我已经为所有人实现了 NAT 遍历NAT 类型,除了对称 NAT(存在于公司防火墙情况中)。
关于屏幕传输/共享,多亏了镜像驱动程序,我会自动收到更改屏幕区域的通知,我可以简单地将镜像驱动程序不断变化的屏幕位图编组为我自己的位图。然后我将屏幕区域压缩为 PNG 并将其从服务器发送到我的客户端。事情看起来不错,但速度还不够快。它和 VNC 一样慢(顺便说一句,我不使用 VNC 协议,只是自定义的业余协议)。
从最慢的远程桌面软件到最快的,该列表通常从所有类似 VNC 的实现开始,然后上升到 Microsoft Windows 远程桌面......然后......TeamViewer。不太确定 CrossLoop、LogMeIn - 我没有使用过它们,但 TeamViewer 非常快。这简直就是活生生的。我在命令提示符上运行了tree 命令,它以 20 毫秒的延迟更新。我浏览网页的速度只比笔记本电脑慢几毫秒。在 Visual Studio 中垂直滚动代码有 50 毫秒的延迟时间。想一想 TeamViewer 的屏幕传输解决方案必须有多强大才能完成这一切。
VNC 使用基于轮询的挂钩来检测屏幕变化,并在最糟糕的情况下进行暴力屏幕捕获/比较。在他们最好的情况下,他们使用像 DFMirage 这样的镜像驱动程序。我就是这个水平。他们使用一种叫做 RFB 协议的东西。
Microsoft Windows 远程桌面显然比 VNC 高出一步。我从 StackOverflow 的某个地方听说 Windows 远程桌面不发送屏幕位图,而是发送实际的绘图命令。这非常棒,因为它可以只发送简单的文本(在这个坐标处绘制这个矩形并用这个渐变着色)!远程桌面确实非常快 - 它是在家工作的标准方式。它使用称为 RDP 协议的东西。
现在 TeamViewer 对我来说完全是个谜。显然,他们发布了版本 2 的源代码(截至 2012 年 2 月,TeamViewer 是版本 7)。人们读过它并说第 2 版毫无用处 - 它只是对具有自动 NAT 遍历的 VNC 的一些改进。
但是第 7 版……现在速度快得离谱了。我的意思是,它实际上比 Windows 远程桌面更快。我已经使用 TeamViewer 流式传输 DirectX 3D 游戏(速度为 1 fps,但 Windows 远程桌面甚至不允许 DirectX 运行)。
顺便说一下,TeamViewer在没有镜像驱动程序的情况下完成了所有这些工作。有一个安装选项,它会更快一点。
问题
我的问题是,TeamViewer 怎么这么快? 一定不可能。如果您在 24 位深度下获得 1920 x 1080 分辨率(16 位深度会明显难看),那仍然是 6,220,800 字节的原始数据。即使使用 libjpeg-turbo(大公司使用的最快的 JPG 压缩库之一),将其压缩到 30KB(让我们非常慷慨),通过 TeamViewer 的服务器路由也需要时间(TeamViewer 通过简单地代理流量绕过公司对称 NAT他们的服务器)。并且 libjpeg-turbo 压缩需要时间来压缩。对我来说,高质量的 JPG 压缩需要 175 毫秒才能获得完整的 1920 x 1080 屏幕截图。如果主机的计算机运行 Atom 处理器,这个数字就会上升。我只是不明白 TeamViewer 是如何将屏幕传输优化得如此出色的。同样,小尺寸图像可能会被高度压缩,但压缩至少需要几十毫秒。大尺寸的图像不需要时间来压缩,但需要很长时间才能通过。不知何故,TeamViewer 完成了整个过程以获得大约 20-25 帧每秒。我使用了网络监视器,TeamViewer 在 500 Kbps 和 1 Mbps 的速度下仍然没有延迟(在该传输速率下,VNC 软件延迟了几秒钟)。在我的tree 命令提示符测试期间,TeamViewer 以 1 Mbps 的速率接收入站数据,并且仍以 5-6 fps 的速度运行。 VNC 和远程桌面不这样做。那么,如何?
答案会有些复杂和错综复杂,所以如果你只想说这是因为他们使用 UDP 而不是 TCP,请不要发布你的 0.02 美元(你相信他们真的会这样做吗?使用 TCP 也一样成功)。
我希望 StackOverflow 上的某个地方有 TeamViewer 开发人员。
可能的答案
有人回复后会更新。
- 我的想法是,首先,TeamViewer 具有非常精细的网络控制。例如,他们将大数据包拆分为刚好低于 MTU 大小,并且从不浪费行程。他们可能有各种花哨的钩子来检测屏幕变化以及极快的 XOR 图像比较。
【问题讨论】:
-
您是否尝试过对协议进行逆向工程? (似乎他们使用 PKI 进行会话设置,所以如果可行的话,这可能并不容易)
-
期待这个问题的答案取决于公司是否愿意分享他们的商业秘密。他们的首要任务,就是让他们继续营业的那个。你有一个强烈的不,得到一个是的唯一方法就是打电话给他们。我想问问他们的专利。
-
这很奇怪。我自己并不觉得它比远程桌面快 - 远非如此! RDP 对我来说 WAY 更快 - 更像是使用本地虚拟机。您实际上是通过 Internet 还是在某种本地设置上进行测试?您是否打开了防火墙以允许直接连接 teamviewer?
-
似乎您只是在本地网络上进行测试。根据我的经验,TeamViewer 似乎使用了有损压缩(通过慢速连接,质量有时真的很差)。会不会是 VNC 比 TeamViewer 使用更多的处理时间和更少的带宽,反之亦然?然后根据您的环境(两台机器上的处理器能力和网络链接的质量),有时 VNC 可能会更快,有时 TeamViewer。
-
不,我不只是在本地网络上测试。
标签: performance network-programming operating-system udp remote-desktop