打印设备和主机的连接方式(printer interface)形态多样,从历史悠久的串口并口到现在流行的网络打印和USB连接,另类的红外连接和蓝牙技术,还有超炫的火线连接(IEEE 1394)。
我这篇文章试着探讨一下网络打印两个基本端口(LPD和9100)的相关知识。

网络打印最大的好处就是空间上不受限制,不被串口线/并口线/USB线的长度所禁锢,北京办公室的员工可以直接把文件打印到上海办公室老板身边的打印机,这要感谢TCP/IP协议族建立的强大的通讯基础设施。

在速度上,网络打印只能处于中等水平,这倒不是它的强项。

技术 变化形式 速度
并行(1284) (Centronics) 250 Kbps
ECP/EPP 35 Mbps
TCP/IP   100 Mbps
IrDA   4 Mbps
火线(FireWire)(1394) (最多63个设备) 400 Mbps
USB 1.0 12 Mbps
2.0 480 Mbps
蓝牙(Bluetooth)   23 Mbps

伴随着TCP/IP的诞生和发展,人们立即把这项技术应用到打印领域,比较早形成标准的就是 Line Printer Daemon Protocol,通称为 LPR 协议,记录在 RFC1179 文档中。LPR 协议在Unix系统上广泛应用和实现(那时候还没有Windows)。LPR协议规定发送方的端口从721到731,接收方端口是515。

当HP公司推出JetDirect打印机系列的时候,他们没有在他们的打印服务器上采用LPD协议,而是开发了一种新的网络打印协议,这个新协议被称为 RAW 打印协议或 Socket API。打印设备上开启的TCP端口是9100,这个端口提供到打印引擎(print engine)的直接连接,类似于以前的串口或并口,这也就是它被称为 RAW 的原因。这个连接通常是全双工的,并在打印时提供错误报告和状态信息。

花开两朵,各表一枝。我们回头再谈LPR和9100传输的细节问题,先看一下网络打印技术在Windows操作系统上的发展。

我这里只讲Win OS作为打印客户端的情况,Win OS作为打印服务器的情况不在讨论之列。

我们编辑/查看文档的应用程序,比如MS Word/Excel/PPT,Notepad,Adobe Acrobat等,不会直接跟网络打印设备建立连接。当我们从这些程序打印文档的时候,操作系统上有一类叫做端口监视器(Port Monitor)的程序在运行,它们把客户端连接到对应的打印机上。在Win2000之前,端口和port monitor的种类比较多也比较乱,因为那时打印行业标准还不统一。每个打印设备生产商如果定义了自己的接口,就要有相应的端口类型和port monitor。比如安装在WinNT4上的Digital Network port monitor,Hewlett-Packard JetAdmin,和Lexmark Port Monitors。我们可以通过打印机属性页看到自己电脑上安装的端口类型,每个类型都有自己的port monitor。

从Win2000起,微软推出了Standard TCP/IP Port Monitor(SPM),SPM跟打印设备建立TCP连接。SPM是一种服务,而不是一个协议。SPM可以使用 RAW 或 LPR 协议向打印机发送作业。对大多数打印设备来说,RAW是默认的协议。如果在端口配置中选择了LPR 协议,SPM 就用LPR协议发送作业。

我们在Win2k和WinXP上还可以看到LPR Port和LPR Port Monitor,请不要把LPR Port和LPR 协议混淆在一起,虽然它们是有联系的。LPR Port默认情况下不会安装,需要在“添加/删除Windows组件”中选择“Other Network File and Print Services”——>“Print Services for Unix”。从细节上讲,LPR Port是由lprmon.dll来管理的,而SPM是由tcpmon.dll来执行的。

SPM中实现的LPR协议跟标准的LPR协议还是有所不同的。标准的LPR协议使用端口 721到731来发送数据,Windows SPM在使用LPR协议时则使用>1023的未保留的端口。另外一个不同是,SPM向spooler发送打印作业时无需确定作业的大小,而标准的LPR协议规定打印作业必须包含作业大小的信息。这样的话,标准的LPR Port Monitor就要 spool 作业两次 — 一次确定作业大小,一次把作业发给spooler。相比之下,SPM Spool作业一次,提高了打印效率。
 
我们可以比较一下网络上抓下来的标准LPR包和SPM实现的LPR包。

标准LPR包:
Tcp: SrcPort=XSRP(721), DstPort=LPD(515)  //注:源端口在721-731之间

SPM实现的LPR包:
Tcp: SrcPort=1844, DstPort=LPD(515)  //注:源端口>1023

它们的源端口差别如上文所述,目标端口是一致的,另外,我这里没贴出来的,LPR协议本身携带的数据在两种情况下是一致的。

再回过头来看9100端口和LPD端口配置的不同。

LPR协议因为起源的原因,规定了line printer daemon客户端和服务端交互的一系列命令,大概的内容如下:

switch(command code){
case 01:
            Print any waiting jobs;
case 02:
            //Receive a printer job;
            //second level commands
            Send positive acknowledgement;
            switch(subcommands code)
             {
             case 01:
                          Abort job;
             case 02:
                          Send positive acknowledgement;
                          Receive control file;
             case 03:
                          Send positive acknowledgement;
                          Receive data file;
             }
case 03:
             Send queue state (short);
case 04:
             Send queue state (long);
case 05:
             Remove jobs;
}

LPR协议规定的一套逻辑细节请参看RFC1179。

我们可以看到,这些命令对我们现在打印的要求来说似乎有些繁琐,HP当年设立9100端口的意思大概也是跳过这些命令来往,直接把准备好的PDL(page description language)数据扔给打印引擎,RAW数据就是PDL用的数据类型,PCL和PostScript都是RAW数据,打印引擎可以直接处理。

通过比较同一个作业分别用9100和LPR端口发的数据包,我们可以看到,LPR子命令发送的“Data File”的内容跟TCP协议9100端口发出去的数据内容是一样的。这个数据内容,我们可以用具体打印机的“Print to file”方式得到。

SPM用9100端口向打印设备发送打印数据,作业完成后就关闭连接。对打印机的管理则遵照RFC 1759(Printer MIB)用SNMP协议来进行,LPR端口则是数据和控制信息都在一个连接上处理。打个比方,9100端口是双车道,数据和控制信息分开走,LPR则是单车道。

简而言之,9100端口打印更加高效快捷,更具有扩展性。

参考文档:Windows 2000及后续版本的打印机连接技术概述

网络打印两个基本端口(LPD和9100)的相关知识相关推荐

  1. 事务管理基础:两段锁协议、活锁、死锁相关知识整理

    1.两段锁协议(Two-phase Locking Protocol)  两段锁协议是指对任何数据进行读写之前必须对数据进行加锁:在释放一个封锁之后,事务不再申请和获得任何其他封锁. 两段锁协议中两段 ...

  2. jmx为啥开了额外两个随机端口?

    2019独角兽企业重金招聘Python工程师标准>>> jmx为啥开了额外两个随机端口? 博客分类: java 通常配置的是registry port: -Dcom.sun.mana ...

  3. 复习Java第二个项目仿QQ聊天系统 03(两种通信类、登录以及注册功能完善) Java面试题并发编程相关知识生活【记录一个咸鱼大学生三个月的奋进生活】025

    记录一个咸鱼大学生三个月的奋进生活025 复习Java(仿QQ聊天系统03两种通信类.登录以及注册功能完善) TcpSocket类(与服务器进行通信) Server类(服务器类) TcpMessage ...

  4. 基于VS2010MFC平台使用C++编写的上位机源程序(可在虚拟机下实现两个com端口的数据传输)

    程序下载链接 https://download.csdn.net/download/qq_37619928/10616006 运行后的界面如下图所示: 由于没有硬件伺服驱动系统的支持,故而对串口通信的 ...

  5. activemq ActiveMQ 两个默认端口 8161和61616的区别

    8161是后台管理系统(url中访问后台管理页用此端口),61616是给java用的tcp端口

  6. appium开启两个服务端口链接两个模拟机,但每次都只运行一台设备。终于解决。

    appium启动了2个,端口分别设置为了4723 4725, 在测试类中也分别指定了设备和端口,用device来指定.然而每次都是运行一个设备. 后来添加了udid这个来指定才发现可以.deviceN ...

  7. 端口被占用?两步解决端口占用问题

    第一步:Win+R 打开命令提示符,输入netstat -ano|findstr 端口号 找到占用端口的进程 第二步: 杀死使用该端口的进程,输入taskkill /t /f /im 进程号( !!! ...

  8. 两步解决端口冲突(超高效)

  9. 串口发送tcp数据 源端口号_三分钟基础知识:用动画给面试官解释 TCP 三次握手过程...

    作者 |  小鹿 来源 |  小鹿动画学编程 写在前边 TCP 三次握手过程对于面试是必考的一个,所以不但要掌握 TCP 整个握手的过程,其中有些小细节也更受到面试官的青睐. 对于这部分掌握以及 TC ...

最新文章

  1. 论文《一种金融市场预测的深度学习模型:FEPA》(2)----有效市场假说,预测原则概念及自己的思考
  2. 常用特征工程方法总结
  3. 【排序算法】图解桶排序
  4. mc服务器玩家无限掉线怎么办,服务器频繁掉线 求解
  5. 笨办法学 Python · 续 练习 24:URL 快速路由
  6. Atitit  Uncaught (in promise) SyntaxError Unexpected token in JSON at position 0
  7. python制作自动交易软件-Python语言之一位程序员写了一个自动化交易程序,躺着玩,两年就挣了两百万!...
  8. 计算机论文研究思路怎么写,论文的研究思路怎么写
  9. 全国哀悼日,网站变成黑白色
  10. 360抢票 网站维护中 你的登录被踢了!
  11. snownlp抛出错误_网易云评论爬虫及情感分析
  12. 疫情之下春运人口回流“硬核”预测:往返这些超级网络节点城市有更大感染风险
  13. 电脑文档误删除怎么恢复,恢复误删除电脑文档的方法
  14. 如何查看电脑有几个内存条插槽
  15. python 协程库_python 协程库gevent学习--gevent数据结构及实战(四)
  16. kali wifi破解(多种方式)
  17. Weight the Tree CodeForces - 1646D
  18. 无人驾驶汽车是如何进行行为决策的?
  19. MVVM架构module配置
  20. 西藏2020年计算机二级报名时间,西藏2020年3月计算机二级考试时间安排

热门文章

  1. 专接本计算机与科学技术,计算机科学与技术专业专接本考什么
  2. 思科全球副总裁、大中华区首席技术官曹图强:网络安全不是奢侈品,而是必需品...
  3. Dancing Link --- 模板题 HUST 1017 - Exact cover
  4. jQuery源码分析-10事件处理-Event-事件绑定与删除-bind/unbind+live/die+delegat/undelegate
  5. 51nod初学者习题(一)
  6. Treble 架构下的 Android Camera 框架
  7. 射影几何----射影坐标系下点(1,0,1)的位置
  8. requests.session()会话保持
  9. Microelectronic学习章节总结(1)-- 计算机架构复习
  10. 【OR】YALMIP Sum of squares(SOS)规划