Internet Printing Protocol/1.1: Encoding and Transport 前三章翻译

来源:互联网 发布:python使用手册 编辑:程序博客网 时间:2024/06/06 10:59

1 引言

本文档包含IPP编码操作规则及传输层和操作层的描述。传输层由HTTP/1.1请求或响应组成。HTTP/1.1RFC2616RFC2616】描述。本文档定义了IPP实现支持的HTTP

操作层包括一个HTTP请求或响应中的消息主体。该文件“Internet打印协议/1.1:模型和语义”【RFC2911】定义了一个消息主体的语义和支持的值。该文件定义了IPP操作的编码。上述文件【RFC2911】此后称为“IPP模型文档”或简称“模型文档”。

注意:IPP1.1)和HTTP1.1)的版本号没有联系,它们版本号只是恰好都是1.1

2 一致性术语

关键词"MUST""MUST NOT""REQUIRED""SHOULD""SHOULD NOT""RECOMMENDED""MAY""OPTIONAL"在文档RFC2119RFC2119】中定义。

3 操作层编码

操作层是HTTP请求或者响应的消息主体的一部分,它必须包含一个单一的IPP操作请求或者操作响应。每个请求或响应由一个序列的值和属性组组成。属性组由一系列的属性组成,每一个属性包含名称和值。名称和值是最终的字节序列。

该编码由八位字节作为最原始的类型。有很多类型的八位字节编码,其中三种极为重要:整数,字符串,字节串,其它类型的编码都是基于它们。此编码中的每个字符串必须是这样一种字符序列,字符序列中的字符应该与一些字符集和自然语言相关联。字符串必须和值中的第一个字符(根据阅读顺序)放在编码的第一个字符位置。字符串符合美式英语的US-ASCII编码,称为US-ASCII-STRING。字符串相关联的字符集和自然语言在一个请求或响应中被指定,以后称为LOCALIZED-STRING。在“IPP模式文档顺序的字符串必须和值中的第一个字节(根据IPP模式文档顺序)变成编码中的第一个字节。在编码中的每一个整数符号必须被编码为用大端格式二进制补码表示的有符号整数。根据使用中的协议,八字节的整数的数量必须是12,或4。这样一个字节的整数此后称为SIGNED-BYTE,被使用于版本号和标签领域。两个字节的整数,此后称为SIGNED-SHORT,用于操作ID,状态码和长度。四字节的整数此后称为SIGNED-INTEGER,用于值字段和请求ID

后续两节以两种方式表示了操作层的编码:

    -形式化地通过图形和描述

    -形式化地通过增强的巴克斯-瑙尔范式(ABNF),(RFC2234RFC2234文档定义了ABNF

    一个操作的请求或响应必须使用后续两节所描述的方式进行编码。

3.1编码的图形表示

3.1.1请求和响应

操作请求或响应应如下编码:

-------------------------------------------------

|            版本号              |  要求2个字节

-------------------------------------------------

|        操作ID(请求)  或      

|        状态代码(响应)        |  要求2个字节

-------------------------------------------------

|         请求ID                |  要求4个字节

-------------------------------------------------

|         属性组                 |  n字节(0或更多)

-------------------------------------------------

|         属性结束标签           |  1字节

-------------------------------------------------

|         数据                   |  q字节(可选)

-------------------------------------------------

 

上图中的前三个字段包含的属性的值在模型文档的3.1.1节描述。

第四字段是属性组字段,它允许出现0或多次。每个属性组字段表示单组属性,如一个操作属性组或一个作业属性组(见文档模型)。该IPP模型文件规定所需的属性组和他们的顺序为每个操作请求和响应。

结束标签字段总是存在的,即使当数据不存在。模型文档指定了每个操作请求和响应的数据字段是否存在。

3.1.2属性组

每个属性组字段如下:

-------------------------------------------------

|          属性组开始标签        |  1个字节

-------------------------------------------------

|             属性               |   p字节(0或更多) 

-------------------------------------------------

 

属性组开始标签字段标志着一个属性组的开始,它的值标识属性组的类型。如一个操作属性组与作业属性组。属性组开始标签标记了前一个属性组的结尾除非它是在请求或响应的第一个属性组中。属性开始标签字段作为一个属性组的终止,因为属性组字段不能嵌套在另一个属性组字段。

一个属性组字段包含零个或多个属性字段。

注意:属性开始标签字段和属性结束标签字段被称为分隔符标签

3.1.3属性

属性字段编码如下:

-------------------------------------------------

|            单值属性            |  q字节

-------------------------------------------------

|             附加值             |  r字节(0或更多)

-------------------------------------------------

 

当一个属性是单值的(如复制的值10) 或者是多值的但只取一个值(如“多方支持”只用值‘单方’),这时它只用“单值属性”字段编码。当一个属性是多值的且取n个值(例如“多方支持”取值‘单方’和‘双方长边界’),它编码有一个属性单值字段 ,后跟n-1“附加值字段。

3.1.4 “单值属性编码的图形表示

每个单值属性字段编码如下:

-------------------------------------------------

|            值标签              |  1个字节

-------------------------------------------------

|          名称长度(单位u)     |  1个字节

-------------------------------------------------

|             名称               |  u字节

-------------------------------------------------

|          值长度(单位v)       |  2个字节

-------------------------------------------------

|             值                 |  v字节

-------------------------------------------------         

 

单值属性由五个字域编码:

值标签字段指定属性的语法,比如用0x44表示属性语法“keyword”

名称长度字段以字节为单位指定名称字段的长度,例如上图中的u15表示名称为多方支持

名称字段包含文本名属性,如双边支持

值长度字段以字节为单位指定字段的长度,如上图中的v9表示值单方

字段包含值的属性,如文本值单边

3.1.5附加值

每一个附加值字段编码如下:

-------------------------------------------------

|            值标签              |  1个字节

-------------------------------------------------

|        名称长度(单位0x0000  |  2个字节 

-------------------------------------------------

|         值长度(单位w       |  2个字节

------------------------------------------------

|             值                |  w字节

------------------------------------------------

 

附加值使用4个字域编码:

值标签字段规定属性语法,比如0x44表示属性语法“keyword”

名称长度字段可取0值以表示这是一个附加值名称长度字段的值把“附加值字段(名称长度是0和“单值属性字段(名称长度不是0)区分了开来。

 “值长度字段以字节为单位规定了字段的长度,如上图中的w19表示值方长边界”

字段包含值的属性,如文本值方长边界”

3.16 一个请求或响应中图片的编码

从解析器的角度来看,其基于一个一个动作

   “标签的值,编码包括:

-------------------------------------------------

|            版本号              |  要求2个字节

-------------------------------------------------

|           操作ID(请求) 或   |  要求2个字节

|           状态码(响应)       |

-------------------------------------------------

|           请求ID              |  要求4个字节

-------------------------------------------------

|    标签(分隔符标签或值标签)  |  1个字节(0或更多)

-------------------------------------------------

|           空或剩余属性         |  x字节(0或更多)

-------------------------------------------------

|           结束的属性标签       |  要求1个字节

-------------------------------------------------

|          数据                  |  y字节(可选)

-------------------------------------------------

 

下面展示解析器期望在每种标签后出现的字段:

-“属性组开始标签”:期望零个或多个“属性”字段

-“值”标签:期望一个“单值属性”或“附加值”的剩余字段

-“属性结束标签”:期望“属性”字段完成且有可选的“数据”

3.2编码语法

下面的语法是ABNF[RFC2234],除了“文字串”必须区分大小写。例如“a”表示小写'a',而不是大写'A'。此外,SIGNED-BYTESIGNED-SHORT字段被表示为展示值范围的“%x”值。

IPP消息 = IPP请求/IPP响应

IPP请求 版本号 操作ID 请求ID *属性组 属性结束标签 数据

IPP响应 版本号 状态码 请求ID *属性组 属性结束标签 数据

属性组 属性开始标签 *属性

版本号 主版本号 次版本号

主版本号 = SIGNED-BYTE

次版本号 = SIGNED-BYTE

操作ID = SIGNED-SHORT

状态码 = SIGNED-SHORT

请求ID = SIGNED-INTEGER;值大于0

属性 单值属性 *附加值

单值属性 值标签 名称长度 名称 值长度 值

附加值 值标签 空名称长度 值长度 值

名称长度 = SIGNED-SHORT;“名称”的字节数

名称 = LALPHA*(LALPHA/DIGIT/”-”/”_””.”)

值长度 = SIGNED-SHORT;值的字节数

值 字节串

数据 字节串

空名称长度 = %x00.00

值标签 = %x10-FF;参见3.7.2

属性组开始标签 = %x00-02/%04-0F;参见3.7.1

属性结束标签 = %x03

SIGNED-BYTE = BYTE

SIGNED-SHORT = 2BYTE

SIGNED-INTEGER = 4BYTE

DIGIT = %x30-39   ;  "0" 到"9"

LALPHA = %x61-7A ;  "a" 到 "z"

BYTE = %x00-FF

字节串 = *BYTE

下面的语法定义了在此文档中引用的附加条款。此语法提供的间隔分组标签。

分组标签 属性组开始标签 属性组结束标签

分组标签 = %x00-0F

属性组开始标签 = %x00 / 操作属性标签 作业属性标签 打印机属性标签 不支持的属性标签 / %06-0F 

操作属性标签 = %x01;标签1

作业属性标签 = %x02;标签2

打印机属性标签 = %x04;标签4

不支持的属性标签= %x05;标签5

3.3属性组

每个“属性组”字段编码必须以“属性组开始”字段开始,后跟零个或多个“属性”子域。

下表中映射了模型文档组名到“属性组开始标签”值字段:

模型文档组  “属性组开始标签”字段值

操作属性       “操作属性标签

作业模板属性   “作业属性标签”

作业对象属性  “作业属性标签”

不支持的属性   “不支持属性标签”

请求属性   “作业属性标签”

(得到作业属性)

请求属性   “打印机属性标签”

(得到打印机属性)

文档内容    在上述特殊位置

对每个操作请求和响应,模型文档规定了必需和可选的属性组以及它们的顺序。对每个属性组,模型文档规定了必需和可选的属性以及它们的顺序。

当模型文档需要一个请求或响应中的一个属性组并且此属性组包含零个属性,请求或响应对该属性组的编码应该以“属性组开始标签”字段开始,后面跟随零个“属性”字段。例如,如果客户端使用“得到打印机属性”操作请求一个单独的不支持的属性,打印机不能返回“属性”字段,应该为打印机属性组返回“属性组开始标签”。不支持的属性组不属于这种情形。根据模型文档,不支持的属性组仅当该属性组包含至少一个属性时才存在。

请求的接收者必需能处理下面的相当于空的属性组:

a)在“属性组开始标签”后没有“属性”字段。

b)缺少“属性组开始标签”字段。

当模型文档要求一个包含数目未知、类型相同的属性组的序列时,编码必须为每一个属性组包含一个“属性组开始标签”字段,即便“属性组”字段不包含任何“属性”子域。例如,“得到作业”操作对某些作业可以返回零个属性。“属性组开始标签”字段后面跟零个“属性”字段的含义是告诉接收者有作业在队列中,但是除了“该作业在队列中”这一信息之外没有其他更多信息可以获得。

0 0