互联网打印机协议IPP分析 |
您所在的位置:网站首页 › 打印机RAW协议什么意思 › 互联网打印机协议IPP分析 |
wireshark抓取数据包分析,并解析出打印文件名、文件、IP端口、用户名;
互联网打印协议(IPP;InternetPrintingProtocol)是一个在互联网上打印的标准网络协议,它容许用户可以透过互联网作遥距打印及管理打印工作等工作。用户可以透过相关界面来控制打印品所使用的纸张种类、分辨率等各种参数; IPP采用的超文本传输协议HTTP的POST方法在客户端和打印服务器之间进行会话。在IPP协议中涉及的对象模型来描述,共有3种对象: 打印机对象,该对象封装了打印机设备,所有实际的打印服务都由该对象完成。作业对象,该对象封装了一个或多个文件组成的打印作业。预定对象封装了通知机制,在作业和打印机对象的状态发生改变时,将出发通知。对于客户端而言,可以通过IPP协议发送2种类型的报文;查询打印机状态的报文和提交打印机作业的报文,同时,客户端也可以接收来自打印服务器的通知; 1.1 通讯方式TCP协议,HTTP协议; 传输层是HTTP请求和响应组成,操作层是一个HTTP请求或响应中的消息主体; 服务器端口:631 客户端端口:任意 Content-Type:application/ipp 1.2 参考文档[RFC2910] Internet Printing Protocol/1.1: Encoding and Transport 链接:http://rfc.ac.cn/html/rfc2910.html [RFC8011] Internet Printing Protocol/1.1: Model and Semantics 链接:http://rfc.ac.cn/html/rfc2911.html 二、TCP数据流分析客户端与服务器端都是依附HTTP协议传输,操作层是以HTTP请求和响应的消息体的固有格式(详细见3消息结构)交互; (1)单个文档打印 print-job:客户机要提交一个仅包含单个文档的打印作业。文档数据将随请求一起发送。 (2)多个文档打印 Create-job:客户机要提交一个包含多个文档的打印作业。文档是使用 send-document 和 send-uri 操作发送的。 Send-document:客户机要将文档添加到使用 print-job 操作创建的打印作业中。文档数据将随请求一起发送。 print-job:客户机要提交一个仅包含单个文档的打印作业。文档数据将随请求一起发送。 三、消息结构 3.1 操作请求和响应编码------------------------------------------------------ | 版本号 | 要求2个字节 ------------------------------------------------------ | 操作ID(请求) 或 | | 状态代码(响应) | 要求2个字节 ------------------------------------------------------ | 请求ID | 要求4个字节 ------------------------------------------------------ | 属性组 | n字节(0或更多) ------------------------------------------------------ | 属性结束标签 | 1字节 ------------------------------------------------------ | 数据 | q字节(可选) ------------------------------------------------------ 第四个字段是“属性组”字段,它允许出现0或者多次。每个“属性组”字段表示单组属性,如一个操作属性组或者一个作业属性组(见文档模型)。该IPP模型文件规定所需的属性组和他们的顺序为每个操作请求和响应。 “结束标签”字段总是存在的,即使当“数据”不存在。模型文档指定了每个操作请求和响应的“数据”字段是否存在。 3.2 属性组------------------------------------------------------ | 属性组开始标签 | 1个字节 ------------------------------------------------------ | 属性 | p字节(0或更多) ------------------------------------------------------ “属性组开始标签”字段标志着一个属性组的开始,它的值标识属性组的类型。如一个操作属性组与作业属性组。“属性组开始标签”也标记了前一个属性组的结尾除非它是在请求或响应的第一个属性组中。“属性开始标签”字段作为一个“属性组”的终止,因为“属性组”字段不能嵌套在另一个“属性组”字段。 一个属性组字段包含零个或多个“属性”字段。 注意:“属性组开始标签”字段和“属性组结束标签”字段被称为“分隔符标签”。 3.3 属性“属性”字段编码如下: ------------------------------------------------------ | 单值属性 | q字节 ------------------------------------------------------ | 附加值 | r字节(0或更多) ------------------------------------------------------ 当一个属性是单值的(如“复制”的值10) 或者是多值的但只取一个值(如“多方支持”只用值‘单方’),这时它只用“单值属性”字段编码。当一个属性是多值的且取n个值(例如“多方支持”取值‘单方’和‘双方长边界’),它编码有一个“属性单值”字段 ,后跟n-1“附加值”字段。 3.4 单值属性(key value)------------------------------------------------------ | 值标签 | 1个字节 ------------------------------------------------------ | key名称长度(单位u) | 2个字节 ------------------------------------------------------ | 名称 | u字节 ------------------------------------------------------ | value值长度(单位v) | 2个字节 ------------------------------------------------------ | 值 | v字节 ------------------------------------------------------ “单值属性”由五个字域编码: “值标签”字段指定属性的语法,比如用0x44表示属性语法“keyword”。 “名称长度”字段以字节为单位指定“名称”字段的长度,例如上图中的u或15表示名称为“多方支持”。 “名称”字段包含文本名属性,如“双边支持”。 “值长度”字段以字节为单位指定“值”字段的长度,如上图中的v或9表示值“单方”。 “值”字段包含值的属性,如文本值“单边”。 3.5 附加值------------------------------------------------------ | 值标签 | 1个字节 ------------------------------------------------------ | 名称长度(单位0x0000) | 2个字节 ------------------------------------------------------ | 值长度(单位w) | 2个字节 ------------------------------------------------------ | 值 | w字节 ------------------------------------------------------ 附加值使用4个字域编码: “值标签”字段规定属性语法,比如0x44表示属性语法“keyword”。 “名称长度”字段可取0值以表示这是一个“附加值”。“名称长度”字段的值把“附加值”字段(“名称长度”是0)和“单值属性”字段(“名称长度”不是0)区分了开来。 “值长度”字段以字节为单位规定了“值”字段的长度,如上图中的w或19表示值“双方长边界”。 “值”字段包含值的属性,如文本值“双方长边界”。 四、结构体参数//属性值; struct _ipp_attr_value{ char type;//属性类型 short len;//值长度 std::string value;//值内容 }; //一个属性包括一个属性名name,零个或者多个属性值; typedef struct _ipp_attr{ std::string name;//属性名称 std::vector values;//一个或者多个属性值 }IPP_ATTR; //一个属性组包括一个组TAG,零个或者多个属性; struct _ipp_attr_seq{ char seq;//属性组类型 std::vector attr;//一个或者多个属性 }; typedef struct _ipp{ int data_left;//移动剩下的数据长度 short version;//版本号 union{ short int operation;//操作码 short int response;//响应码 }; int request_id;//请求ID //零个或者多个属性组 std::vector seqs;// 一个或者多个属性组 }IPP; IPP *m_ipp;//IPP结构 short int m_bufptr;//记录buf移动位置 五、宏定义 5.1 Request operations ID#define IPP_PRINT_JOB 0x0002 此标识开始打印数据 #define IPP_PRINT_URI 0x0003 #define IPP_VALIDATE_JOB 0x0004 #define IPP_CREATE_JOB 0x0005 #define IPP_SEND_DOC 0x0006 #define IPP_SEND_URI 0x0007 #define IPP_CANCEL_JOB 0x0008 #define IPP_GET_JOB_ATTR 0x0009 #define IPP_GET_JOBS 0x000A #define IPP_GET_PRINTER_ATTR 0x000B 5.2 Response status Code#define IPP_SUCCESS 0x0000 #define IPP_SUCCESS_IGN 0x0001 #define IPP_SUCCESS_CONFLICT 0x0002 5.3 属性组Tag#define IPP_TAG_OPERATIONS 0x01 #define IPP_TAG_JOBS 0x02 #define IPP_TAG_END 0x03 #define IPP_TAG_PRINTER 0x04 #define IPP_TAG_UNSUPPORTED 0x05 5.4 属性类型/* Integer tags */ #define IPP_TAG_INTEGERS 0x20 #define IPP_TAG_INT 0x21 #define IPP_TAG_BOOL 0x22 #define IPP_TAG_ENUM 0x23 // #define IPP_TAG_RESERVED 0x24-0x2F /* Octet-string tags */ #define IPP_TAG_OCTET_STRING 0x30 #define IPP_TAG_DATETIME 0x31 #define IPP_TAG_RESOLUTION 0x32 #define IPP_TAG_RANGE_INT 0x33 // #define IPP_TAG_RESERVED 0x34 for collection (in future) #define IPP_TAG_TEXT_W_LANG 0x35 #define IPP_TAG_NAME_W_LANG 0x36 /* Character-string tags */ #define IPP_TAG_CHAR_STRING 0x40 #define IPP_TAG_TEXT_WO_LANG 0x41 #define IPP_TAG_NAME_WO_LANG 0x42 // #define IPP_TAG_RESERVED 0x43 #define IPP_TAG_KEYWORD 0x44 #define IPP_TAG_URI 0x45 #define IPP_TAG_URI_SCHEME 0x46 #define IPP_TAG_CHARSET 0x47 #define IPP_TAG_NATURAL_LANG 0x48 #define IPP_TAG_MIME_MEDIA 0x49 5.5 错误状态码(响应)// IPP response codes - Client errors #define IPP_ERR_BAD_REQUEST 0x0400 #define IPP_ERR_FORBIDDEN 0x0401 #define IPP_ERR_NOT_AUTHENTICATED 0x0402 #define IPP_ERR_NOT_AUTHORIZED 0x0403 #define IPP_ERR_NOT_POSSIBLE 0x0404 #define IPP_ERR_TIMEOUT 0x0405 #define IPP_ERR_NOT_FOUND 0x0406 #define IPP_ERR_GONE 0x0407 #define IPP_ERR_REQUEST_TOO_LARGE 0x0408 #define IPP_ERR_VALUE_TOO_LONG 0x0409 #define IPP_ERR_FORMAT_NOT_SUPPORTED 0x040A #define IPP_ERR_ATTR_NOT_SUPPORTED 0x040B #define IPP_ERR_VAL_NOT_SUPPORTED 0x040B #define IPP_ERR_URISCHEME_UNSUPPORTED 0x040C #define IPP_ERR_CHARSET_NOT_SUPPORTED 0x040D #define IPP_ERR_CONFLICTING_ATTR 0x040E // IPP response codes - Server errors #define IPP_ERR_INTERNAL_ERROR 0x0500 #define IPP_ERR_OPERATION_UNSUPPORTED 0x0501 #define IPP_ERR_SERVICE_UNAVAILABLE 0x0502 #define IPP_ERR_VERSION_UNSUPPORTED 0x0503 #define IPP_ERR_DEVICE_ERROR 0x0504 #define IPP_ERR_TEMP_ERROR 0x0505 #define IPP_ERR_NOT_ACCEPTING_JOBS 0x0506 #define IPP_ERR_BUSY 0x0507 #define IPP_ERR_JOB_CANCELLED 0x0508 // Printer state enum #define IPP_PRINTER_IDLE 0x03 #define IPP_PRINTER_PROCESSING 0x04 #define IPP_PRINTER_STOPPED 0x05 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |