`
mars5337
  • 浏览: 89741 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论
阅读更多

X Window System Protocol
X Version 11, Release 6.7

Protocol是X11众多文档规范里最重要的一份,它规定了X的Server和Client之间的通信规则。

X Window System的重要特点之一是它具有网络通透性,client与server的连接是“松散”的,图形设备和输入输出设备在server端,而应用程序在client端,通过网络,client向server发送请求,比如创建窗口、读取属性、绘制文本等等,server向client发送回复以及事件通知。
Server和client并不关心对方的实现,它们各自只需要向通信协议负责即可。只要符合通信协议,它们甚至可以是由不同的编程语言来书写的。这样的灵活性和多样性是X的特点之一。

Protocol这篇文档规定了X11通信的格式以及内容。

1 协议格式
请求格式(Request Format)
每一个请求由请求头和请求体组成。
在每一个请求的最前面,有一个4字节的请求头,其中第一个字节是8位的主操作码(major opcode),接下来的两字节是16位的请求长度(这个长度值也包括头在内),最后的一个字节在本协议里暂时不用。
跟在头后面的是请求体,格式是不固定的,依请求种类而不同。如果实际的请求体内容长度小于头里说明的长度,不必用0来补位。
++++++++ | ++++++++ ++++++++ | ++++++++ | ++++++++++++++++++++++++
m-opcode | length of request |  blank   |  request content ...
++++++++ | ++++++++ ++++++++ | ++++++++ | ++++++++++++++++++++++++
(每个"+"代表一位)
在本核心协议中,主操作码在0~127之间。128~255保留做扩展用。很多情况下,扩展的请求里可能包含多个操作码,这时请求的结构会有一些改变。比如,一种典型的用法是,在头的第二个字节里存放一个副操作码(minor opcode),把长度值移到后面两个字节去。

响应格式(Reply Format)
每一个响应由三部分组成:响应头,响应体以及扩展部分
响应头由4字节的组成,并没有特殊的标识,这4个字节中的内容是整个响应的长度。
接下来是32个字节的响应体。
如果响应的内容比较长,超过了32字节,可继续在响应体后接续,这是响应体的扩展部分,长度向字节对齐。
在响应体和扩展部分中如果有空位的话,server并不保证把空位置0。
在响应的内容中还包含所对应请求的序列号。(但协议没有指明哪几个字节是这一内容。)

错误报告格式(Error Format)
每一个错误报告的长度是固定的32字节。其中包含一个字节的错误码(error code)。本规范中错误码在0~127之间,128~255保留做扩展用。
在错误报告中还包含所对应请求的主操作码、副操作码和序列号。
对于以下几种资源方面的错误,报告中还包含资源ID:
Colormap, Cursor, Drawable, Font, GContext, IDChoice, Pixmap, Window.
如果出错的是atom,原atom也会被包含在报告中;如果出错的是value,其实会被包含。其它类型的错误报告不再包含更多的信息。
同样,报告中如果有空位的话,server并不保证把空位置0。

事件通知格式(Event Format)
事件通知的长度也是固定的32字节。
其中前8位是类型码。在这8位中,会有一位用于标识该事件是否是由客户端发起的,即如果这一事件是因响应客户端的SendEvent请求而发出的,这将被置位。
类型码的64~127段保留用于扩展。
除KeymapNotify之外的所有事件通知中还将包含此前最后一个来自client的请求序列号。


2 建立连接
X的server与client之间的连接是通过网络进行的,面向字节流。它们之间的通信不依赖特定的平台,也不依赖特定网络。
2.1 连接初始化
首先,client需要向server发送一个字节来指明字节序,这个字节的内容称为“字节序位”(byte-order byte)。这个字节是一个ASCII字符,只可能是两个值,要么是"B"(8进制102),要么是"l"(8进制154)。前者表明在接下来的通信中,如果数据大于一个字节的话,高字节在前,低字节在后;后者相反,表明低字节在前,高字节在后。Client和server双方都需要遵守这一协定。
在字节序位之后,client发送以下内容:
协议主版本号(protocol-major-version) - 16位无符号数(CARD16)
协议副版本号(protocol-minor-version) - 16位无符号数(CARD16)
认证协议名(authorization-protocol-name) - 字符串(STRING8)
认证协议数据(authorization-protocol-data) - 字符串(STRING8)
认证协议名/数据是出于安全性考虑,client可以请求server使用某种安全认证协议,但这并不是必须的,如果server不支持client所申请的认证协议,只需简单地简略即可。认证协议数据也可为空。
2.2 服务器的响应
Client发送完以上初始化数据以后,server应该给出如下的响应:
success: {Failed, Success, Authenticate}
Failed表明连接失败,接下来会收到以下附加信息:
 protocol-major-version: CARD16
 protocol-minor-version: CARD16
 reason: STRING8
Authenticate表明连接因认证原因而失败,接下来会收到以下附加信息:
 reason: STRING8
Success表明连接已成功建立,并附带以下信息:
 protocol-major-version: CARD16
 protocol-minor-version: CARD16
 vendor: STRING8
 release-number: CARD32
 resource-id-base, resource-id-mask: CARD32
 image-byte-order: {LSBFirst, MSBFirst}
 bitmap-scanline-unit: {8, 16, 32}
 bitmap-scanline-pad: {8, 16, 32}
 bitmap-bit-order: {LeastSignificant, MostSignificant}
 pixmap-formats: LISTofFORMAT
 roots: LISTofSCREEN
 motion-buffer-size: CARD32
 maximum-request-length: CARD16
 min-keycode, max-keycode: KEYCODE
其中出现4种特殊的数据类型:FORMAT, SCREEN, DEPTH, VISUALTYPE解释如下:
 FORMAT: 
  [depth: CARD8,
  bits-per-pixel: {1, 4, 8, 16, 24, 32}
  scanline-pad: {8, 16, 32}]
 SCREEN: 
  [root: WINDOW
  width-in-pixels, height-in-pixels: CARD16
  width-in-millimeters, height-in-millimeters: CARD16
  allowed-depths: LISTofDEPTH
  root-depth: CARD8
  root-visual: VISUALID
  default-colormap: COLORMAP
  white-pixel, black-pixel: CARD32
  min-installed-maps, max-installed-maps: CARD16
  backing-stores: {Never, WhenMapped, Always}
  save-unders: BOOL
  current-input-masks: SETofEVENT]
 DEPTH: 
  [depth: CARD8
  visuals: LISTofVISUALTYPE]
 VISUALTYPE: 
  [visual-id: VISUALID
  class: {StaticGray, StaticColor, TrueColor, GrayScale,
  PseudoColor, DirectColor}
  red-mask, green-mask, blue-mask: CARD32
  bits-per-rgb-value: CARD8
  colormap-entries: CARD16]
2.3 Server信息
如果连接建立成功的话,server在Success之后返回给client的附加信息表明server的能力。
协议号:
协议号即server支持的协议版本,目前最新为11。版本号具有向下兼容的特性,即高版本兼容低版本。一般来说,server会返回与client的请求相同的版本号,但由于向下兼容性,版本号不同的情况也时有发生,client的版本号可以比server小。

Resource-id-mask包含一个连续的比特序列(至少18位)。Client为WINDOW, PIXMAP, CURSOR, FONT, GCONTEXT和COLORMAP这些资源申请ID时,需要以它做为掩码,即ID值需要与resource-id-mask做“与”运算;然后再与resource-id-base做“或”运算,其结果才是有效的ID值。资源ID的前三位总是0;资源ID的分布并不保证是线性依次分配的,一旦一个ID被释放,即可马上重用。
各种不同种类的资源ID,它们的分配空间是相同的,但不同的资源ID不需要处于不同的段,可以混在一起的,因为它们最终是被不同种类的句柄来索引,不会因为分配空间相同而造成混乱。所以,一个ID不但是在所有同类资源中是唯一的,在所有种类的资源中也必须是唯一的。

在连接的初始化时,client可以指定字节序,server要遵守client的“建议”;但是对于图像数据来说就是另外一回事,图像数据的字节序是由server在image-byte-order中指定的。

接下来的几行内容是关于位图(bitmap)的。位图是以扫描线(scanline)的形式描述的。扫描线的长度通常是要向若干比特数对齐的,不足的用0补位,这个数字即在bitmap-scanline-pad定义,是固定的。扫描线也有自己的最小构成单位,即bitmap-scanline-unit,bitmap-scanline-unit小于或等于bitmap-scanline-pad。在扫描线的每个最小单位(unit)里,存放的数据是高字节在前还是低字节在前,由bitmap-bit-order规定。
如果一个像素图(pixmap)是以XY格式描述的,它的每一个“小块”(plane)就是一个位图,每个plane内的位图数据都是高字节数据在前,低字节在后;在各plane之间不需加0填充。

Pixmap-formats数据是一个列表,列表的每一项对应于一种色深,描述的是在相应色深下像素图的Z格式。在Z格式下,像素是以扫描线的形式表示的,一个像素即是一条从左到右的扫描线。Bits-per-pixel定义了一个像素有多少位组成。理论上说,一个像素的位数应该与深度相同,但由于需要向字节对齐,bits-per-pixel可能会比depth更大,如果是这样的话,pixel的低位是真实数据,高位不用,也无需置0。

指针设备如何在屏幕上及屏幕间移动是由server的实现来决定的,本协议不做要求。
Server可以保存指针设备移动的历史记录并发出MotionNotify事件。Client可以通过GetMotionEvents请求来取得这些历史记录。Motion-buffer-size指的就是用来存储移动历史记录的缓冲区的大小。

Maximum-request-length表明的是server可以接受的请求的最大长度,单位是4字节。也就是说,maximum-request-length是client的请求数据头中“长度”的最大值,如果超过了这个值,就会产生一个Length错误,server将乎略这个请求。
Maximum-request-length不会太小,至少是4096,也就是说,server能处理的请求长度至少要达到4096*4=16384字节。

Min-keycode和maz-keycode定义了server支持的最小和最大的键值,最小不能小于8,最大不能大于255,在这个区间内,也并不是所有的值都有对应的键,可以有空位。

与屏幕有关的信息有:
Allowed-depth指明像素图(pixmap)和窗口支持哪些深度。对于pixmap,任何一种深度都要支持;而对于窗口来说,只要支持那些有对应“视”(visual)类型的就可以了。深度为1的像素图一定要支持,但深度为1的窗口可以不支持。
Root-depth和root-visual指明根窗口的深度和视类型;Width-in-pixels和height-in-pixels指明根窗口的大小,这个值是固定的,不能改。Width-in-millimeters和height-in-millimeters指明了根窗口的物理尺寸大小。

Default-colormap是根窗口使用的初始色彩表,也是色彩的最低配置。如果client在色彩方面的请求非常低的话,将使用这一配置。

Black-pixel和white-pixel可以用来实现黑白两色的应用,它们分别是黑白两色的像素值。它们一定会存在于default-colormap色彩表中。在有些情况下,黑白两色可能使用比较多,而且比较典型,所以把它们单独列出来,比如根窗口的边缘就是由black-pixel指定的黑色填充的,根窗口的默认背景也是由这两种色彩来组成的。

Min-installed-maps指的是server最少可以保证能够同时安装的色彩表数量;Max-installed-maps是与之相应的最大值,但并不保证每一次都能安装这么多的数量,还要看内存空间的情况,只是可能的最大值,可以达不到。

Backing-stores可以取三个值:Never, WhenMapped, Always。表明server在什么时候会在后台缓存窗口的图像。可能永远也不缓存,可能只在map的时候缓存,也可能总是会缓存。即使缓存的话,也要视内存的占用情况而定,并不能保证每次都能缓存成功。

视觉(visual)信息
前面提到的有关颜色的数据都是有关颜色衡量尺度的,比如色深等。这一部分(视觉/visual)是有关颜色与人的感观之间关系的。这些内存存放在VISUALTYPE信息下面。
Class的几种类型{StaticGray, StaticColor, TrueColor, GrayScale, PseudoColor, DirectColor}定义的是色彩描述的类型,

分享到:
评论

相关推荐

    MobaXterm-Portable-v24 是一款多功能远程管理工具,支持SSH、X11、SFTP等协议,适用于Windows、Linux和Unix系统

    内容概要:MobaXterm_Portable_v24 是一款集成SSH、X11、SFTP等功能的多协议远程管理工具,支持终端仿真、文件传输和远程桌面等功能,Portable版本无需安装,便于随时携带和使用。 适用人群:适用于IT运维人员、...

    MobaXterm: 强大的多协议远程计算机管理工具

    内容概要:MobaXterm 是一款多协议的远程计算机管理工具,支持多种连接方式(SSH、Telnet、RDP、VNC等),提供终端仿真、多标签界面、X11服务器、文件传输、会话管理和插件支持等核心功能,满足用户多任务操作和远程...

    MobaXterm纯绿色免费免安装包 全能终端连接工具

    内容概要: MobaXterm 是一款集成了终端模拟器、远程连接工具和X11服务器的远程计算机管理工具。它提供了图形用户界面,并包含了常用的Unix命令和工具,同时支持SSH、Telnet、RDP等协议。此外,MobaXterm 还内置了...

    POP-C-Client:POP协议的客户端,可以检索邮件(包括邮件服务器模拟器)

    POP-C-客户端要求X11库根据其在系统上的路径将makefile链接更改为X11库Python执行使用以下命令编译文件: make现在首先启动服务器: python pop-server.py host:port messagesDirmessagesDir在哪里模拟将邮件存储在...

    MobaXterm终极指南:从零开始玩转全能终端神器

    内容概要:本文详细介绍了MobaXterm这款全能终端工具的功能和使用方法,涵盖其基本特点、快速安装步骤以及丰富的进阶技巧。文章首先介绍了MobaXterm作为一个集成了SSH客户端、X11服务器等多种工具的强大终端的特点...

    AIX6.1环境下WAS7.0安装配置步骤(多图)

    - `X11.dt` 3. **安装 AIX 中文字符集** - 为了确保 WAS 7.0 能够在中文环境下顺利运行,需要安装 AIX 的中文字符集。 - 查看当前安装的字符集:`locale -a` - 安装中文字符集:通过 `smitty` 工具进行安装。 ...

    机器人操作系统ROS2在Docker环境下的安装与应用实例解析

    内容概要:本文详细介绍如何在Docker环境下安装和使用机器人操作系统ROS2。具体涵盖RO S的历史背景与版本演变、ROS 1和ROS 2的主要区别,重点讲解使用Docker安装ROS2的优势及步骤。特别介绍了基于Ubuntu 22.04 LTS...

    Fvwm中文手册 fvwm入门教程

    - **文档许可**:鼓励用户引用文档内容,但必须标注来源,并确保引用部分所在的文档同样遵循自由文档许可协议。 #### 三、Fvwm基础操作 - **名称**: Fvwm (F Virtual Window Manager for X11) - **概要**: - **...

    关于SMFL简介

    * 窗口处理:可以创建多个渲染窗口,集成到现有的 Qt/MFC/wxWidgets/Win32/X11 等接口上。 * 图形处理:提供了一个非常简明的 OpenGL 接口,支持 alpha 融合、旋转、着色器等特效。 * 图像处理:可以加载和保存标准...

    Ubuntu VNC服务器及客户端安装配置手册.doc

    VNC(Virtual Network Computing)是一种远程桌面协议,允许用户通过网络访问并控制远程计算机的图形用户界面。 一、系统概要 操作系统平台为Ubuntu Server 10.04 32位,主机名为GIT-SERVER,IP地址为172.17.92.125...

Global site tag (gtag.js) - Google Analytics