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

打印设备和主机的连接方式(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及后续版本的打印机连接技术概述

你可能感兴趣的:(Windows,网络,作业,windows,postscript,file,文档)