Internet Printing Protocol/1.1: Encoding and Transport 前三章翻译
2015-10-09 10:35
169 查看
1 引言
本文档包含IPP编码操作规则及传输层和操作层的描述。传输层由HTTP/1.1请求或响应组成。HTTP/1.1由RFC2616【RFC2616】描述。本文档定义了IPP实现支持的HTTP头。操作层包括一个HTTP请求或响应中的消息主体。该文件“Internet打印协议/1.1:模型和语义”【RFC2911】定义了一个消息主体的语义和支持的值。该文件定义了IPP操作的编码。上述文件【RFC2911】此后称为“IPP模型文档”或简称“模型文档”。
注意:IPP(1.1)和HTTP(1.1)的版本号没有联系,它们版本号只是恰好都是1.1。
2 一致性术语
关键词"MUST","MUST NOT","REQUIRED","SHOULD","SHOULD NOT","RECOMMENDED","MAY","OPTIONAL"在文档RFC2119【RFC2119】中定义。3 操作层编码
操作层是HTTP请求或者响应的消息主体的一部分,它必须包含一个单一的IPP操作请求或者操作响应。每个请求或响应由一个序列的值和属性组组成。属性组由一系列的属性组成,每一个属性包含名称和值。名称和值是最终的字节序列。该编码由八位字节作为最原始的类型。有很多类型的八位字节编码,其中三种极为重要:整数,字符串,字节串,其它类型的编码都是基于它们。此编码中的每个字符串必须是这样一种字符序列,字符序列中的字符应该与一些字符集和自然语言相关联。字符串必须和值中的第一个字符(根据阅读顺序)放在编码的第一个字符位置。字符串符合美式英语的US-ASCII编码,称为US-ASCII-STRING。字符串相关联的字符集和自然语言在一个请求或响应中被指定,以后称为LOCALIZED-STRING。在“IPP模式文档顺序”的字符串必须和值中的第一个字节(根据IPP模式文档顺序)变成编码中的第一个字节。在编码中的每一个整数符号必须被编码为用大端格式二进制补码表示的有符号整数。根据使用中的协议,八字节的整数的数量必须是1,2,或4。这样一个字节的整数此后称为SIGNED-BYTE,被使用于版本号和标签领域。两个字节的整数,此后称为SIGNED-SHORT,用于操作ID,状态码和长度。四字节的整数此后称为SIGNED-INTEGER,用于值字段和请求ID。
后续两节以两种方式表示了操作层的编码:
-非形式化地通过图形和描述
-形式化地通过增强的巴克斯-瑙尔范式(ABNF),(RFC2234【RFC2234】文档定义了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”。
“名称长度”字段以字节为单位指定“名称”字段的长度,例如上图中的u或15表示名称为“多方支持”。
“名称”字段包含文本名属性,如“双边支持”。
“值长度”字段以字节为单位指定“值”字段的长度,如上图中的v或9表示值“单方”。
“值”字段包含值的属性,如文本值“单边”。
3.1.5附加值
每一个“附加值”字段编码如下:
-------------------------------------------------
| 值标签 | 1个字节
-------------------------------------------------
| 名称长度(单位0x0000) | 2个字节
-------------------------------------------------
| 值长度(单位w) | 2个字节
------------------------------------------------
| 值 | w字节
------------------------------------------------
附加值使用4个字域编码:
“值标签”字段规定属性语法,比如0x44表示属性语法“keyword”。
“名称长度”字段可取0值以表示这是一个“附加值”。“名称长度”字段的值把“附加值”字段(“名称长度”是0)和“单值属性”字段(“名称长度”不是0)区分了开来。
“值长度”字段以字节为单位规定了“值”字段的长度,如上图中的w或19表示值“双方长边界”。
“值”字段包含值的属性,如文本值“双方长边界”。
3.16 一个请求或响应中图片的编码
从解析器的角度来看,其基于一个一个动作
“标签”的值,编码包括:
-------------------------------------------------
| 版本号 | 要求2个字节
-------------------------------------------------
| 操作ID(请求) 或 | 要求2个字节
| 状态码(响应) |
-------------------------------------------------
| 请求ID | 要求4个字节
-------------------------------------------------
| 标签(分隔符标签或值标签) | 1个字节(0或更多)
-------------------------------------------------
| 空或剩余属性 | x字节(0或更多)
-------------------------------------------------
| 结束的属性标签 | 要求1个字节
-------------------------------------------------
| 数据 | y字节(可选)
-------------------------------------------------
下面展示解析器期望在每种标签后出现的字段:
-“属性组开始标签”:期望零个或多个“属性”字段
-“值”标签:期望一个“单值属性”或“附加值”的剩余字段
-“属性结束标签”:期望“属性”字段完成且有可选的“数据”
3.2编码语法
下面的语法是ABNF[RFC2234],除了“文字串”必须区分大小写。例如“a”表示小写'a',而不是大写'A'。此外,SIGNED-BYTE和SIGNED-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)缺少“属性组开始标签”字段。
当模型文档要求一个包含数目未知、类型相同的属性组的序列时,编码必须为每一个属性组包含一个“属性组开始标签”字段,即便“属性组”字段不包含任何“属性”子域。例如,“得到作业”操作对某些作业可以返回零个属性。“属性组开始标签”字段后面跟零个“属性”字段的含义是告诉接收者有作业在队列中,但是除了“该作业在队列中”这一信息之外没有其他更多信息可以获得。
相关文章推荐
- 向ContentProvider中添加媒体文件
- 【Java】 集合类概述-List、Map、Set
- 性能测试步骤及分析
- 在VS2010的环境下,给mfc下的对话框添加启动画面
- MySql 查询一周内最近7天记录
- Java数组定义学习的一些随笔
- 解决虚拟机提示VMware Workstation cannot connect to the virtual machine的问题
- android studio 安装
- iOS模拟器中点击UITextField不弹出软键盘问题
- 字符设备驱动函数
- JetBrains KegGen
- Linux中的正则表达式
- WCF服务端与使用HttpURLConnection的Android客户端简单示例
- 如何给物体添加阴影效果
- mongodb的查询语句学习摘要
- <%@page contentType="text/html;charset=gbk"%>与<meta http-equiv="Content-Type" content="text/html; charset=GBK">区别
- java例子4:简单的圆
- 缩减Oracle的UNDOTBS01.DBF文件大小
- word2vec中关于词向量的阐述
- TOP命令详解