為何 windows remote desktop connecton (RDC) 速度這麼快?
RDC 又稱為『遠端桌面』(在 NT 時代也叫做 terminal service),多年來我心中一直有個疑惑就是,為何平平是遠端遙控,RDC 的速度就是比 VNC 快上一大截,而且即使在慢速網路下,它仍然能有非常好的表現。
最近開始準備替換掉家裏最後一台 windows server,因此跟同事借了台 mac mini 回來想玩玩遠端遙控,實驗結果讓人非常非常失望,基本上 mac 的遙控只有兩種方法
1. screen sharing
2. Apple Remote Desktop (ADC)
但不論是哪一種,骨子裏其實都是 VNC,因此它的做法仍然是 pixel by pixel 抓下來後高度壓縮再送出去,資料量顯然無法小到哪去,耗用的頻寬就更不用說了。
也由於這兩天失敗的結果,讓我再度開始好奇到底 RDC 是何方神聖怎麼會表現這麼好,這次終於專心爬完所有資料也得到一個滿意的結論了,簡單整理如下。
上面這些 references 中以第二篇最重要,而該篇文章中最精華的一段如下:
On the server, RDP uses its own video driver to render display output by constructing the rendering information into network packets by using RDP protocol and sending them over the network to the client. On the client, RDP receives rendering data and interprets the packets into corresponding Microsoft Win32 graphics device interface (GDI) API calls. For the input path, client mouse and keyboard events are redirected from the client to the server. On the server, RDP uses its own on-screen keyboard and mouse driver to receive these keyboard and mouse events.
中文解釋如下(這裏我們假想的劇情是:從辦公室中想遠端遙控家裏的電腦)
RDC 被控端(Server,想像為家裏電腦)做的事:
1. 自備 video driver 將原本要經由顯示卡畫在螢幕上的資料,encode 成封包
2. 自備 on-screen 鍵盤與滑鼠 driver 來接收並回應遠端傳來的 keyboard/mouse event
RDC 遙控端(Client,想像為辦公室電腦)做的事:
1. 接收網路傳來的封包(內含 rendering data)然後用標準的 win32 GDI API 畫在螢幕上
2. 將滑鼠與鍵盤事件傳回 Server
這裏面我個人覺得最重要,也是為何 RDC 能這麼快的關鍵,就在於紅色那項,它不是像 VNC 透過網路在傳 compressed pixel data,而只是傳 rendering data,然後在 client 端自備 win32 GDI API 依這些 rendering data 再畫出來,這樣做要來回傳遞的資料量就變的非常小(我沒有實際的數據,但猜測大概只有1/5),然後再加上高度的壓縮與資料cache(有些甚至是直接針對 mem 做處理),就達成了驚人的速率啊!
由此也可推知,mac 版的 RDC client 必然是將部份 win32 GDI API port 過去了,因此才能在 mac 上也提供相同神速的遙控服務。
接下來的問題就是:那為何 mac 不能做相同的事呢?理論上 RDC 是一個 based on ITU T.128 的協定,任何平台都可以實作出 server/client 才對,但奇怪的是 mac 上就是只有提供 VNC-based solution。
我好奇稍微查了一下是否有 RDC server for *nix,結果還真的有( dao of mac 有一整頁的列表 ):
xrdp: An open source remote desktop protocol(rdp) server for Linux
但目前的進度看來頗淒慘,其實這種結果也不難想像,畢竟玩 *nix 的人大概都只需 shell 一枚即夠,誰管你 x window 啊…(只是 apple 就應該比較有動力去做這件事吧?)
最後同場加映好康一枚:
目前 windows xp 上的 RDC 只能允許單一的 session, 也就是說如果 John 登入了,原本在用的 Mary 就會被登出,一次只能一個人用,這個神密的 Terminal Server Patch 則可以解除這迷般的封印,允許一台 xp 多人同時連線,有圖有真相:
至此終於解開心中多年的疑惑,不過最重要的是,我仍然需要一個快速好用的 mac 遙控方案啊啊啊~



10 Comments Add your own
1. IrishBAM&hellip | June 20th, 2008 at 12:09 am
UltraVNC 有內附並支援 video mirror driver
2. crazylion&hellip | June 20th, 2008 at 1:03 am
不過我裝了 video mirror driver 之後,看影片就不太正常了…@@
會一片黑
3. wingchw&hellip | June 20th, 2008 at 9:40 am
UltraVNC 那個只是在 kernel level 處理 screen copy 進 frame buffer 的動作, 減少由 user level 處理的損耗。與 RDC 所用的方案完全不同。
4. augustinus&hellip | June 20th, 2008 at 12:09 pm
http://www.jinx.de/JollysFastVNC.html 據說是目前 Mac OS X 上最快的 VNC client.
5. admin&hellip | June 20th, 2008 at 1:01 pm
可惜還是 vnc-based solution,不過他的那個 ScreenRecyler 產品到是挺有趣,如果傳輸速度夠快的話。
http://www.screenrecycler.com/video.html
6. Tim Wu&hellip | June 21st, 2008 at 7:02 pm
照這樣聽起來rdp 快是因為實作方式? 公司頻寬不快, 我的感覺是跟VNC差不多.
我在公司 & 家裡都用Linux(ubuntu 8.04), 家裡的ubuntu 裡還用virtualbox跑個winxp
virtualbox 支援RDP, ubuntu 裡面也有整好的rdesktop, 我在公司都下rdesktop這個指令連回家裡windows下單…速度上還可以, 記得要開 dither。
7. Eric Tsai&hellip | June 22nd, 2008 at 6:09 pm
那個patch是SP2版的,SP3記得去Google(xp sp3 multiple remote desktop)
8. admin&hellip | June 22nd, 2008 at 9:06 pm
謝謝 Eric 提醒,相關資訊在這裏:
http://tinyurl.com/3fkcrv
不過我的 xp 大概永遠不需要再升級了,下一步就是直接換成 mac mini 永遠跟 windows 說再見 XD
9. augustinus&hellip | June 26th, 2008 at 3:28 pm
我昨天才注意到,Leopard 內建的 VNC (Screen Sharing/Apple Remote Desktop) protocol 版本不夠新,強迫使用 full color depth (所以 Windows VNC client 都要特地改這個才能連上),當然也就很… 慢…
勉強改善的方法是,裝別的 VNC server.
10. Sylvian&hellip | October 3rd, 2008 at 11:03 pm
如果對 RDP 有興趣,可以去查一下 “Reverse Engineering RDP” 相關文章。
RDP 是 Citrix metaframe 的 subset,並非 M$ 自家開發的。
經過我測試的結論是 RDP 在看影片的資料傳輸量會很大
,而 VNC 則是在有 Scrolling 的情況下資料傳輸量會很大
如果你覺的 VNC 不好用,就去自已動手改程式
Trackback this post | Subscribe to the comments via RSS Feed