协议格式¶
X 协议格式主要分为四种:
请求格式(Request Format)
响应格式(Reply Format)
错误信息格式(Error Format)
事件格式(Event Format)
请求格式¶
每个请求包含一个8位(1byte)主操作码和一个以4字节为单位表示的16位长度字段。
每个请求由四个字节的头(包含主操作码、长度字段和一个数据字节)和零个或多个附加字节的数据组成。
length字段定义了请求的总长度,包括报头。请求中的长度字段必须等于包含请求所需的最小长度。如果指定的长度小于或大于要求的长度,则会产生错误。请求中未使用的字节不必为零。
主要操作码128到255是为扩展保留的。扩展旨在包含多个请求,因此扩展请求通常在请求头的第二个数据字节中编码一个额外的小操作码。然而,这个次要操作码和扩展请求中所有其他字段的位置和解释不是由核心协议定义的。给定连接上的每个请求都隐式地分配了一个序列号,从1开始,用于应答、错误和事件。
请求头(4字节,32位) + 请求体(附加字节数据):
+--------------------+-----------------------------+----------------+---------------
| Major Opcode(8bit) | Length(16bit) | data (8bit) | others .....
+--------------------+-----------------------------+----------------+---------------
Major Opcode(操作码):$2^{8} = 256$ 因此 操作码是 1 - 128,而 128 - 255 保留。
Length: 定义请求的总长度(必须与实际相符,否则出错)
data:1 个数据字节
others:0个或多个附加数据字节
响应格式¶
每个响应包含一个32位长度的字段,以四个字节为单位表示。
每个响应由32字节组成,后面跟着零个或多个额外字节的数据,在长度字段中指定。应答中未使用的字节不能保证为零。每个应答还包含相应请求序列号中最低有效的16位。
+----------------------+------------------------+------------
| Response Type(8bit) | sequence Number(16bit) | body ...
+----------------------+------------------------+------------
响应类型:表示响应的类型。字节
序列号:表示请求的序列号,用于与请求进行关联。2字节
响应体
错误信息格式¶
错误报告长度为32字节。
每个错误都包含一个8位的错误码。错误码128到255保留给扩展使用。
每个错误还包括失败请求的主要和次要操作码以及请求序列号的最低有效16位。
对于以下错误,也会返回失败的资源ID: Colormap, Cursor, Drawable, Font, GContext, IDChoice, Pixmap和Window。
对于Atom错误,将返回失败的Atom。对于Value错误,返回失败的value值。其他核心错误不返回额外的数据。错误中未使用的字节不能保证为零。
+---------------------+------------------+---------------------------+---------------------+--------------------+--------------------+---------------+---------------
| Response Type(8bit) | Error Code(8bit) | Sequence Number ID(16bit) | Resource ID (32bit) | Minor opcode(8bit) | Major Opcode(8bit) | Length(16bit) | Error Data ...
+---------------------+------------------+---------------------------+---------------------+--------------------+--------------------+---------------+---------------
响应类型:表示响应的类型,错误响应表示 0x00,占用 1 字节
错误码:表示错误的类型,占用1字节
序列号:表示与错误相关联的请求的序列号。占用2字节
次要操作码:表示与错误相关的次要操作码。占用 1 字节
主要操作码:表示与错误相关的主要操作码。占用 1 字节
长度:表示错误数据的长度,占用 2 字节。
错误数据:包含了错误相关的额外数据,占用字节数长度不确定。
事件格式¶
事件长度为32字节。事件中未使用的字节不能保证为零。
每个事件包含一个8位类型代码。如果事件是从SendEvent请求生成的,则设置此代码中的最高有效位。事件码64到127是为扩展保留的,尽管核心协议没有定义对这些事件选择兴趣的机制。
每个核心事件(KeymapNotify除外)还包含客户端发出的(或当前正在)由服务器处理的)最后一个请求序列号的最低有效16位。
下列只是一种形态
+------------------+--------------------+-------------------------+
| Event Type(8bit) | EventDetail (8bit) | Sequence Number (16Bit) |
+------------------+--------------------+-------------------------+