分享

大家讨论下windows自带的远程桌面是怎样高效实现的

 quasiceo 2016-11-10
微软的RDP 是一个公开的协议,是在协议级别的远程控制传输,变化了哪点传哪点,有时候传的是描述数据,比如显示一个框,RDP远程桌面并不真的传输一个窗口图像,而是传输一个窗口的属性,然后由客户端绘制,其它控制软件都是把图像传过来, 只能压缩图片等试工提高速度 ,但JPG本来就是经过压缩的所有提高速度不明显,而远程桌面这织需要输入一个窗口属性 如 大小 颜色,位置等,这些数据很少,客户端通过这些数据再绘制窗口,而不需要把它当图片传输,当然有些还是需要传输图片的,如果桌面背景图等,所有远程桌面在默认设置时,会自动禁止显示远式桌面背景
Windows 自带的远程连接,使用的RDP协议,这个只有微软玩的转了。。再下来性能次点的使用MIRROR驱动,再下来就是GDI扫描方式了

pc anywhere的GDI方式传屏很烂的,速度超慢。。。远程控制屏幕算法比较牛的是RADMIN,你可以去他的官方下个试试,RADMIN3.X版本应该都换成MIRROR驱动了。。。2.2以下的全是GDI方式,MIRROR驱动好像只能在2000以上的系统用。 GDI方式的屏幕传输不外乎追求的就是,使用最快的速度,捕获到最精准的变化区域,然后只传输变化的区域,当然还有CPU有占用率问题。。

WINDOWS下屏幕传输大概可分为四种方式:
RDP远程控制协议  这个记得在codeproject网站上有一个C#的应用版本,可以参考下
GDI扫描,什么隔行啊,分块啊什么的。。。这个网上也有不少源码的
HOOK绘图消息,这个可以参考下各种版本的VNC源码,他有使用,
MIRROR驱动,这种是除了RDP协议外最快的方式了,CPU占用率还很低。。也可以参考下VNC不过,MIRROR驱动的源码是不公开的

光有协议是不够的。远程终端的高效在于它是驱动级的,你可以在设备管理器里选择查看隐藏设备。就能找到有终端服务器的键盘驱动程序、设备重定向器和鼠标驱动程序。
很多简单的远程控制程序并没有深入内核,而是简单地采用Bitblt等截图方式,所以要等到本地GDI组件绘制显示出结果才行,也就是只能实时控制,而不能实现多用户登录,而且很多无法截DirectX等图。而且使用兼容DirectX的话性能会更低,因为直接写屏的图像是位于显存的,所以可能需要从显存回传内存(某些情况下Bitblt也是),这样就需要额外的AGP、PCI-E操作,比纯内存操作慢多了。
GDI产生的所有绘图调用都会直接被虚拟的监视器驱动接收直接通过网络转发,不走显卡驱动。而且图像可以是经过退色(色深减小到16位等)和差分压缩(不传输不动区域)的。比很多那些直接传全屏JPEG的显然快很多,如果用的JPEG库不高效(如GDI+),更是如此。
键盘、鼠标输入的请求也是直接从键盘驱动输入后就直接转发,比钩子函数要高效,因为少了DPI调整、加速、键盘映射等等。

WINDOWS远程控制,远程登录后,不会影响本地正在使用的桌面?远程连接后本地桌面会被锁掉,怎么会没有影响呢?

那不是技术问题,是许可证限制和为了安全考虑。XP不允许同时两个用户同时进行控制桌面,如果一个用户远程登录,另外的如果接受,就会被踢掉。XP SP2早期的远程控制是允许同时两个用户控制的,但是后来在正式版被取消了。可以通过破解补丁取消这个限制。
如果是Server版,是可以多人远程登录的,但是最大人数不能超过购买的许可证限制,默认带的是5个。如果不这样,一个服务器就可以带大量瘦客户机,如果硬件允许,普通使用就和单机无异,那样企业用户就没人买单机板了。



像这种多用户同时登录的问题,就跟RDP协议一样的,只有微软玩的转,毕竟WINDOWS系统内核只有他知道,现WINDOWS下效果最好的就是MIRROR驱动了。。WIN7下使用MIRROR驱动,需要关闭DWM的,GDI方式也一样需要,不然卡的动都不动 .

windows远程桌面的的确是驱动级的.打开设备管理器,把显示隐藏设备选上,可以看到有个叫"RDPCDD"的驱动.
以前好像不是这个名字,好像是叫TERMINAL SERVICE
估计是跟MIRROR驱动差不多.

vnc,radmin装了MIRROR驱动,性能也跟远程桌面差不多.


RDP远程连接微软有直接提供控件的,你可以自己用这个控件写啊。。。

UBUNTU的远程桌面也支持RDP

微软的RDP协议在Win7 SP1中更新到7.1了,支持RemoteFX,客户端现在可以运行服务端的3D和视频应用了,比如在瘦客户端可以登录到服务端看高清视频或者玩大型3D游戏。

RDP7.1还支持USB Redirection,这些都是驱动级别的实现,效率相当高。其实主要原理都是一样的,就是绘制都在客户端执行,以节省带宽。为了支持RemoteFX,客户端要有DX10的硬加速以支持高速渲染

还有远程帧缓存:RFB协议
适用于所有窗口系统,如:X11,Windows, Mac。。
VNC就是用这个协议

Netmeeting的远程协助是应用级的,和QQ远程控制等实现是类似的,效率是比不上驱动级的远程桌面(远程终端)服务。远程协助对网络要求较低,比如更容易过防火墙和NAT,不需要开3389端口,用户间是对等的,也就是谁都可以连接别人(只要对方允许)。而远程桌面,一般是要打开相应服务并打开端口,属于C/S结构的。

还有从winnt 时代使用的ICA 协议, 那效果比RPD协议牛叉。 特别是端口映射方面, 比rpd 协议好用多了。 可惜, 现在歇菜了

windows的远程桌面有没有可供其他程序调用的接口?


当然有,可以看,有很多API可以进行会话控制什么的:
http://msdn.microsoft.com/en-us/library/bb892075(v=VS.85).aspx
但是这还是不能超越其设计的C/S框架限制。远程桌面更类似Linux/UNIX那种多用户体系,就是用户直接登录以后,可以当作本地系统来用,之间互不影响。对于微软来说,就相当于每个瘦客户机实际在运行一个Windows版本,所以需要按客户机数量购买许可证。
而且对于Terminal Services/Remote Desktop Services来说,在服务器版系统上需要作为一个服务模块单独安装和设置,对于个人用户来说比较复杂,而且如果配置错误,就相当于开了一个豪华级木马给别人了。所以Netmeeting从个人用户的需求来,开发了另一套更灵活也更安全的对等方案,也无需许可证,代价就是效率低了。
现在的CPU由于已经有虚拟化技术,所以可以更高效的实现远程桌面。

pc anywhere的GDI方式传屏很烂的,速度超慢。。。远程控制屏幕算法比较牛的是RADMIN,你可以去他的官方下个试试,RADMIN3.X版本应该都换成MIRROR驱动了。。。2.2以下的全是GDI方式,MIRROR驱动好像只能在2000以上的系统用。 GDI方式的屏幕传输不外乎追求的就……

Citrix使用的ICA协议比RDP协议更好。

UBUNTU的远程桌面也支持RDP


恩,那个叫rdesktop,可以连接windows的远程桌面

给LZ贴下链接:
http://www./
http:///archives/rdesktop.html

是开源的,估计能用上

http://www./KB/cs/RemoteDesktop_CSharpNET.aspx
这里有一个C#写的远程桌面程序,可以试试


Windows NT 6.0 + 的操作系统 提供了 Windows Desktop Share API,  远程桌面和 Netmeeting用的是一套东西.都是RDP协议。

而且Windows远程桌面都是采用镜像驱动的方式。你看它的API就可以发现可以指定镜像驱动的加载方式 -- 静态加载 和 动态加载。

用过N种远程控制软件,最好用的就是系统自带的远程桌面和RADMIN这两款,延迟率很低。

很早之前我也做过猜想,后来经过思考得出以下结论:

  1、Win的远程桌面并不像QQ远程控制那样传输图像。这一点非常容易判断,因为远程桌面和本地桌面的分辨率可以不同,当分辨率不同时,同一个文件的文字排列也不同。比如同一个TXT文件,在1024×768分辨率下窗口中显示需要2行,在800×600分辨率下的窗口中可能需要5行(均将窗口最大化)。

  2、Win是根据某协议传输变化数据。如楼上所述。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多