==相关的文档:==
三种场景的终极对比:为什么绝不冲突
| 场景 | DISPLAY 变量 | X Server 实例 | 通信方式 | 详细通信过程 | |
| 本地物理登录 | :0 | 运行在物理显卡上的 主 Xorg 实例 | GUI 程序 → /tmp/.X11-unix/X0 → 物理 Xorg | 启动程序:运行 GUI 程序(例如 Firefox)。这个程序就成了一个 X Client。建立连接:程序启动后,会立刻去寻找并连接到正在运行的 X Server (也就是 Xorg)。发送请求:程序会向 X Server 发送一系列请求。服务器响应:X Server 收到这些请求后,开始工作。 • 它调用显卡驱动,在屏幕上把窗口和按钮画出来。 • 它监听鼠标和键盘的动作。当你点击那个按钮时,X Server 会捕捉到这个事件。事件通知:X Server 随后会把这个“点击事件”打包,发送回给你的程序(X Client)。程序处理:你的程序收到这个事件后,就会执行相应的代码逻辑(比如提交一个表单)。 | |
| SSH with -X | localhost:10.0(或类似) | 不创建新实例,依赖连接端(您本地电脑)的 Xorg (:0) | GUI 程序 (远程) → SSH 隧道 (TCP) → 本地 SSH 客户端 → 本地物理 Xorg | GUI 程序尝试连接 localhost:10.0,而这个地址正好被 SSH 服务端监听着。SSH 将所有发往这个“假”地址的图形指令,通过加密的 SSH 隧道,安全地转发(Forward)回你的 LocalPC。你 LocalPC 上的 SSH 客户端收到这些指令后,再把它们交给 LocalPC 上真正LOCK_PLACEHOLDER} (或类似) | XRDP 启动的一个回你的 :0。你 LocalPC 上的 SSH 客户端收到这些指令后,再把它们交给 :10 上 Xorg-for-xrdp |
回你的 :0。你 :10 上的 SSH 客户端收到这些指令后,再把它们交给 Xorg 上
-
回你的
X0。你X10上的 SSH 客户端收到这些指令后,再把它们交给DISPLAY上:本地登录的DISPLAY=:10和 XRDP 的/tmp/.X11-unix/X10是两个**核心区别与无冲突的原因:**的DISPLAY=localhost:10.0进程,它们各自管理各自的资源,使用不同的 Socket 文件 (6010vs10),因此在进程和文件层面是完全隔离的。 -
10回你的X10。你 {INLINE_CODE_BLOCK_PLACEHOLDER} 上的 SSH 客户端收到这些指令后,再把它们交给 {INLINE_CODE_BLOCK_PLACEHOLDER} 上:这是最关键的一点!- {INLINE_CODE_BLOCK_PLACEHOLDER} (XRDP 场景) 指的是一个XRDP 连接:{INLINE_CODE_BLOCK_PLACEHOLDER}。这是一种基于文件系统的、非常高效的进程间通信方式。
- {INLINE_CODE_BLOCK_PLACEHOLDER} (SSH 场景) 指的是一个全新的、独立的 Xorg 实例,称之为:端口号为 {INLINE_CODE_BLOCK_PLACEHOLDER} (6000 + 10)。这是一种基于网络的通信方式。
虽然数字都是 {INLINE_CODE_BLOCK_PLACEHOLDER},但一个是 Unix Socket,另一个是 TCP 端口,它们在操作系统层面是两种完全不同的东西,所以即便在同一台机器上,SSH X11 转发恰好也想用 {INLINE_CODE_BLOCK_PLACEHOLDER} 号端口,也和 XRDP 的 {INLINE_CODE_BLOCK_PLACEHOLDER} Socket 毫无关系。
-
X Server 实例的独立性:从这里您也可以看出,XRDP 会更消耗服务器资源,因为它为每一个连接的用户都运行了一个完整的桌面环境和 Xorg 实例。而 SSH X11 转发则轻量得多,它仅仅是转发了绘图指令,计算和渲染最终是在您自己的本地电脑上完成的。
附录
X Server 和 Xorg 的关系
- X Server 是框架,是抽象。
- Xorg 是实现,是具体。