【问题标题】:Does X11 have a lifesign or constant stream?X11 有生命标志还是恒流?
【发布时间】:2018-12-17 13:35:48
【问题描述】:

我有一个容错应用程序,其中 X 服务器请求在远程客户端上启动应用程序(通过某种其他机制)并接收并显示其 X 窗口。容错意味着服务器需要检测到客户端的连接丢失,然后调用不同的备份客户端并在那里启动应用程序并显示窗口。

我的问题是 X11 协议中是否存在允许在 X11-Server 中可靠地检测连接是否已断开的机制。

实验表明,在拔出电缆连接时,它需要一些 TCP-Timeout 来检测套接字级别的连接丢失。这非常依赖于操作系统。在我们的例子中,大约 30 分钟后 X-Server 最终关闭了窗口。

所以另一个假设可能是 X11-stream 不断地传递一些命令并且服务器可以实现一些这样的逻辑:如果 X11-stream 在超时 y(例如 3 秒)内没有传递任何 X11 流量,我们假设连接丢失并主动关闭窗口并建立与回退客户端的连接。

这个假设是真的吗?我在X11-protocol 中没有看到任何关于如何检测连接丢失的声明。是否有任何明确的生命迹象定期传播?或者假设有持续的流量是有效的?或者在连接完全启动并运行时,是否有更长的不活动时间,根本没有传输任何内容?

来自客户端的NoOperation 命令可用于此目的。但是客户通常会实施类似的东西作为生命标志吗?

【问题讨论】:

  • 您是否正在编写启动远程客户端的应用程序(在本地运行,在 X11 服务器上)?你能在里面放点东西吗?

标签: linux x11


【解决方案1】:

我有一个容错应用程序,其中一个 X 服务器需要启动一个应用程序...

我不认为 X 服务器可以“启动应用程序”。可能是某些设置允许类似的东西,但通常不是这样。

...X11 协议中是否存在允许在 X11-Server 中可靠地检测连接是否断开的机制。

不,它不存在。 X11 协议基于 TCP/IP,不直接提供这个“心跳”。我认为假设是,如果您单击或以其他方式刺激 X11 窗口,如果客户端应用程序消失,TCP 层将超时或抛出另一个错误。

我在 X11 协议中没有看到任何关于如何检测连接丢失的声明。

有一个来自客户端的 NoOperation 命令可用于此目的。但是客户通常会实施类似的东西作为生命标志吗?

也许某些应用程序使用该 NoOperation,但目的与您需要的不同。我的意思是,从应用程序的角度来看,X11 服务器就像一个扩展;应用程序可能有兴趣知道服务器是否正常工作,但事实并非如此。而且,无论如何,即使服务器可以检测到应用程序已消失,也可能无法告诉服务器启动另一个应用程序。

可能会部署一个特殊的代理;它可以启动应用程序并监视连接(以两种方式)并采取必要的步骤以防应用程序消失。但话又说回来,谁来监控代理应用程序?

【讨论】:

  • 谢谢;服务器通过其他方式启动应用程序,例如通过其他消息传递中间件的 ssh 命令或某些专有电报。所以实际上我们通过颠倒客户端和服务器的想法来滥用X11协议。那么服务器是否可以在窗口中触发任何事件,保证客户端以任何方式(甚至仅由 NoOperation 确认)回答?所以我们可以自己在服务器中通过一些常规事件添加“心跳”......
  • @Hauke:嗯,“X11 服务器”和“运行 X11 显示器的服务器机器”这两个术语是不一样的。您用来启动远程应用程序的应用程序可以作为一个简单的代理,并对任何断开连接作出反应。我认为这是可行的。
  • @Hauke:干扰X11服务器是有可能的,即使不容易,但总体上并不能保证。代理会更容易,因为从应用程序到代理的连接将是完全可代理监控的。代理可以是十行 C 代码。
【解决方案2】:

首先,X 协议完全依赖 TCP 来发送/接收信息。

您不能安全地放置具有超时功能的事务来检测 TCP 中的超时。 TCP 旨在仅重新传输已发送但未确认的那些段。它是完全异步的,在您发送命令的意义上,您可以在收到响应之前收到许多与该命令无关的响应或事件。 XProtocol 上没有心跳机制(除了发送 NOOP 命令以与服务器同步操作,并且您会收到它的响应,但不能过度使用它,因为这会严重减慢 X 连接,只需启动任何客户端-synchronous 选项以查看它,请参阅 X(7))。您甚至可以在不交换单个数据包的情况下让 TCP 连接存活数年。有一些机制,由选项SO_KEEPALIVE 激活,使 tcp 在 TCP 上为没有数据传输的连接使用这种心跳,但 X11 协议通常不使用它。您没有发布任何代码,也没有描述系统的配置方式。标准 XServer从不自行启动连接,除非专门启动以与 XDMCP 服务器协商(这是在 UDP 协议上完成的)以充当 XTerminal。

从你的话可能你不知道服务器和客户端的角色是在X协议中交换的(客户端是连接到服务器以显示其输出的远程应用程序,而服务器是控制你的应用程序显示器、鼠标和键盘)服务器无法创建新客户端,因此您需要通过其他方式(可能通过 SSH,但未描述)创建此连接。

顺便说一句,当你说:

实验表明,在拔出电缆连接时,它需要一些 TCP 超时来检测套接字级别的连接丢失。这非常依赖于操作系统。在我们的例子中,大约 30 分钟后 X-Server 最终关闭了窗口。

这与操作系统无关。当您没有要发送的流量时,这正是标准行为,没有交换数据包,因此不会进行检测(除非您的客户端---请记住,这是远程应用程序想要在您的本地服务器 --- 激活 SO_KEEPALIVE 选项,在声明丢失连接之前需要多次丢失)在您的情况下,时间量是可变的,因为计时器直到有一些数据通过拔出连接,这使得它可变(不依赖于操作系统)

另一方面,您不能假装服务器会打开您的显示器,以防您离开办公室并意外或意外将其关闭。这种情况下的容错规范是什么?

恕我直言,关于表示协议,应用程序应该准备好在您激活连接后立即向您显示有关系统的尽可能多的信息(但连接必须允许失败)。重要的是您为应用程序开发的容错方法,即使在您不在那里看显示的情况下也是如此。有人会被告知没有人在看屏幕吗?在这种情况下,您是否要检测运营商的缺席?不要把它当作火焰,但在这种情况下,常识应该是不可抗拒的。

如果您需要确保与远程主机的连接可用,则需要使用其他方法进行检查。我建议您使用一个简单的应用程序 ping 远程主机并发出警报,以防您没有得到肯定的结果。或者您可以打开与服务器的连接,然后在收到服务器的肯定响应后立即关闭它(例如第一个数据包)。这将引导我们进入下一步,即确保有人正在查看在显示器的(打开的)屏幕上:)

例如,您可以与您感兴趣的客户端并行运行一个客户端,并通过在一个循环中请求一些服务器原子名称(或根窗口属性值)来强制执行心跳,并有一定的延迟。这将导致连接失败,或者您的客户端会发出警报,以防它在某个可配置的时间内没有收到答案。

【讨论】:

    猜你喜欢
    • 2011-03-21
    • 2017-12-25
    • 2012-09-02
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多