互联网打印机协议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<_ipp_attr_value *> values;//一个或者多个属性值
}IPP_ATTR;
//一个属性组包括一个组TAG,零个或者多个属性;
struct _ipp_attr_seq{
char seq;//属性组类型
std::vector<IPP_ATTR *> attr;//一个或者多个属性
};
typedef struct _ipp{
int data_left;//移动剩下的数据长度
short version;//版本号
union{
short int operation;//操作码
short int response;//响应码
};
int request_id;//请求ID
//零个或者多个属性组
std::vector<_ipp_attr_seq *> 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
互联网打印机协议IPP分析相关推荐
- Linux下hp打印机驱动hplip分析
Hplip分析 版本号是2.14,源代码位置:http://hplipopensource.com. 图的来源:http://hplipopensource.com/node/128. 实践中使用的打 ...
- 扫描40亿可路由的 IPv4 地址后发现这些打印机的 IPP 端口遭暴露
聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 多年来,安全研究员就一直警告称被暴露在互联网上的未受防火墙保护的设备都是一个攻击面.黑客能够部署 exploit,强制接管设备或者在无 ...
- HTTPS协议原理分析
HTTPS协议原理分析 HTTPS协议需要解决的问题 HTTPS作为安全协议而诞生,那么就不得不面对以下两大安全问题: 身份验证 确保通信双方身份的真实性.直白一些,A希望与B通信,A如何确认B的身份 ...
- FTP协议的分析和扩展
2019独角兽企业重金招聘Python工程师标准>>> FTP协议的分析和扩展 出处: http://elly.blogdriver.com/index.jsp >> 1 ...
- 互联网医疗行业PEST分析实践
Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...
- 2023互联网行业发展趋势前景分析
2023互联网行业发展趋势前景分析 从智能手机到电商,从本地生活服务到社区团购,从共享出行到互联网金融,从在线音乐到长视频平台.无一例外,互联网产业已经渗透至我们生活的各个领域,可以说360行,行行都 ...
- [RFC5996 翻译二] IKEv2 互联网密钥交换协议版本2
rfc5996 (ietf.org) 接上篇blog (59条消息) [RFC5996 翻译一] IKEv2 互联网密钥交换协议版本2_羊羊洒洒_Blog的博客-CSDN博客 3.15.配置负载 Co ...
- python爬虫最为核心的HTTP协议解析,及自定义协议的分析
机器之间的协议就是机器通信的语法,只有按照这种语法发来的信息,机器之间才能相互理解内容,也可以理解为信息的一种格式. HTTP/IP协议是互联网最为重要的协议,没有HTTP/IP协议,也就没有互联跟不 ...
- Linux内核网络数据包发送(三)——IP协议层分析
Linux内核网络数据包发送(三)--IP协议层分析 1. 前言 2. `ip_send_skb` 3. `ip_local_out` and `__ip_local_out` 3.1 netfilt ...
最新文章
- 实战:手把手教你实现用语音智能控制电脑 | 附完整代码
- #模拟触手机屏幕_从操作系统的改变谈手机设计进化,单手并不是最终的便捷...
- MySQL利用xtrabackup进行增量备份详细过程汇总
- dosbox更新加载的文件夹
- 【JavaSE04】Java中循环语句for,while,do···while
- Android Treble 计划技术文档
- Opencms安装和配置
- 指定路径_Workbench中如何创建指定路径分析的变形曲线
- git 命令 clone分支的代码
- SAP License:Ecc6.0和R/3 有什么区别?
- 库克回应 iPhone 11 系列不支持 5G;哈啰 App 被下架;Flutter 1.9 稳定版发布 | 极客头条...
- 漫画:如何求图的最短路径? | 技术头条
- Centos 进入单入口模式
- 第五次作业11111
- 批处理顺序执行多条命令
- TM16xx LED驱动和键盘扫描芯片使用
- bootstrap树节点如何设置默认不展开_GraPhlAn:最美进化树或层级分类树学习笔记
- 以nba球员数据学习聚类算法
- Java使用Imageio拆分gif图片时保存的图片变为黑色
- linux 驱动 device,driver ,bus 关系