In Pre-Vista OS's, printing (Spooler service running over RPC) over WAN networks is generally slow especially when there's a delay in the WAN links. This mainly stems from the fact that Pre-Vista OS's (Windows NT, Windows 2000, Windows XP, and Windows server 2003) use the printing RPC interface which runs on top of named pipes over SMB. In such OS's, RPC over named pipe is limited to 4280 bytes. Hence while printing a document, spooler client needs to send a new RPC (over named pipe over SMB) request every 4280 bytes and this must be ACK'ed at SMB layer by the remote party (with an SMB Write AndX request) before the client sends the next RPC request. This behavior exists when older printing RPC interface used as it works over named pipes (and SMB in result).
RPC over named pipe buffer is still hardcoded to 4280 bytes in Windows Vista and Windows Server 2008 systems. But Windows Vista and Windows Server 2008 systems use the newer printing RPC interface when communicating with the remote Windows Vista and Windows Server 2008 systems (not Windows NT, Windows 2000, Windows XP, and Windows server 2003 systems � Windows Vista and Windows Server 2008 will still keep using the older printing RPC interface while communicating with down-level platforms)
The new printing RPC interface directly runs on top of TCP (named pipe over SMB is eliminated in the new interface). Hence spooler client doesn't have to wait for any SMB layer acknowledgements. All spooler related RPC traffic will be sent over TCP and this will improve the printing performance over WAN networks.
Example 1
The following typical flow is seen while spooling to Windows Vista or Windows Server 2008 from a Windows Vista or Windows Server 2008 system
Notes- 192.168.1.101 is Windows Vista or Windows Vista SP1 client
- 192.168.1.1 is Windows Server 2008 server�������
.
.
1958� 0.011479 192.168.1.101� 192.168.1.1��� DCERPC�� Request: call_id: 64 opnum: 12 ctx_id: 0 [DCE/RPC first fragment]
1962� 0.000252 192.168.1.101� 192.168.1.1��� DCERPC�� Request: call_id: 64 opnum: 12 ctx_id: 0 [DCE/RPC middle fragment]
1966� 0.000136 192.168.1.101� 192.168.1.1��� DCERPC�� Request: call_id: 64 opnum: 12 ctx_id: 0 [DCE/RPC middle fragment]
1970� 0.000128 192.168.1.101� 192.168.1.1��� DCERPC�� Request: call_id: 64 opnum: 12 ctx_id: 0 [DCE/RPC middle fragment]
1974� 0.000238 192.168.1.101 �192.168.1.1��� DCERPC�� Request: call_id: 64 opnum: 12 ctx_id: 0 [DCE/RPC middle fragment]
1978� 0.000132 192.168.1.101� 192.168.1.1��� DCERPC�� Request: call_id: 64 opnum: 12 ctx_id: 0 [DCE/RPC middle fragment]
1982� 0.000129 192.168.1.101� 192.168.1.1� ��DCERPC�� Request: call_id: 64 opnum: 12 ctx_id: 0 [DCE/RPC middle fragment]
1986� 0.000128 192.168.1.101� 192.168.1.1��� DCERPC�� Request: call_id: 64 opnum: 12 ctx_id: 0 [DCE/RPC middle fragment]
1990� 0.000128 192.168.1.101� 192.168.1.1��� DCERPC�� Request: call_id: 64 opnum: 12 ctx_id: 0 [DCE/RPC middle fragment]
1997� 0.000123 192.168.1.101� 192.168.1.1��� DCERPC�� Request: call_id: 64 opnum: 12 ctx_id: 0 [DCE/RPC middle fragment]
2001� 0.000137 192.168.1.101� 192.168.1.1��� DCERPC�� Request: call_id: 64 opnum: 12 ctx_id: 0 [DCE/RPC middle fragment]
2005� 0.000116 192.168.1.101� 192.168.1.1��� DCERPC�� Request: call_id: 64 opnum: 12 ctx_id: 0 [DCE/RPC last fragment]
2009� 0.005823 192.168.1.1��� 192.168.1.101� DCERPC�� Response: call_id: 64 ctx_id: 0 76f03f96-cdfd-44fc-a22c-64950a001209 V1
.
.
Note Opnum 12 is RpcAsyncWritePrinter() as per the new printing RPC interface IDL:
http://msdn.microsoft.com/en-us/library/cc238131(PROT.10).aspxExample 2
The following typical flow is seen while spooling to a Windows Server 2003 system from a Windows Vista or Windows Server 2008 system.
Notes- 192.168.1.101 is Windows Vista or Windows Vista SP1 client
- 192.168.1.3 is Windows Server 2003 or Windows Server SP2 server
.
.
449��� 0.039921�� 192.168.1.101� 192.168.1.3��� DCERPC��� Request: call_id: 9 opnum: 19 ctx_id: 0
453��� 0.000011�� 192.168.1.3��� 192.168.1.101� SMB������ Write AndX Response, FID: 0x0004, 4280 bytes
454��� 0.000330�� 192.168.1.101� 192.168.1.3��� DCERPC��� Request: call_id: 9 opnum: 19 ctx_id: 0
458��� 0.000011�� 192.168.1.3��� 192.168.1.101� SMB� �����Write AndX Response, FID: 0x0004, 4280 bytes
459��� 0.000296�� 192.168.1.101� 192.168.1.3��� DCERPC��� Request: call_id: 9 opnum: 19 ctx_id: 0
463��� 0.000015�� 192.168.1.3��� 192.168.1.101� SMB������ Write AndX Response, FID: 0x0004, 4280 bytes
464��� 0.000332�� 192.168.1.101� 192.168.1.3��� DCERPC��� Request: call_id: 9 opnum: 19 ctx_id: 0
468��� 0.000011�� 192.168.1.3��� 192.168.1.101� SMB������ Write AndX Response, FID: 0x0004, 4280 bytes
469��� 0.000398�� 192.168.1.101� 192.168.1.3��� DCERPC ���Request: call_id: 9 opnum: 19 ctx_id: 0
473��� 0.000011�� 192.168.1.3��� 192.168.1.101� SMB������ Write AndX Response, FID: 0x0004, 4280 bytes
474��� 0.000291�� 192.168.1.101� 192.168.1.3��� DCERPC��� Request: call_id: 9 opnum: 19 ctx_id: 0
478��� 0.000011�� 192.168.1.3��� 192.168.1.101� SMB������ Write AndX Response, FID: 0x0004, 4280 bytes
479��� 0.000364�� 192.168.1.101� 192.168.1.3��� DCERPC��� Request: call_id: 9 opnum: 19 ctx_id: 0
483��� 0.000011�� 192.168.1.3��� 192.168.1.101� SMB������ Write AndX Response, FID: 0x0004, 4280 bytes
484��� 0.000325�� 192.168.1.101� 192.168.1.3��� DCERPC��� Request: call_id: 9 opnum: 19 ctx_id: 0
488��� 0.000012�� 192.168.1.3��� 192.168.1.101� SMB������ Write AndX Response, FID: 0x0004, 4280 bytes
489��� 0.000532�� 192.168.1.101� 192.168.1.3��� DCERPC��� Request: call_id: 9 opnum: 19 ctx_id: 0
493��� 0.000011�� 192.168.1.3��� 192.168.1.101� SMB������ Write AndX Response, FID: 0x0004, 4280 bytes
494��� 0.000299�� 192.168.1.101� 192.168.1.3��� DCERPC��� Request: call_id: 9 opnum: 19 ctx_id: 0
498��� 0.000012�� 192.168.1.3��� 192.168.1.101� SMB������ Write AndX Response, FID: 0x0004, 4280 bytes
499��� 0.000415�� 192.168.1.101� 192.168.1.3��� DCERPC��� Request: call_id: 9 opnum: 19 ctx_id: 0
503��� 0.000011�� 192.168.1.3��� 192.168.1.101� SMB������ Write AndX Response, FID: 0x0004, 4280 bytes
504��� 0.000291�� 192.168.1.101� 192.168.1.3��� DCERPC��� Request: call_id: 9 opnum: 19 ctx_id: 0
508��� 0.000012�� 192.168.1.3��� 192.168.1.101� SMB������ Write AndX Response, FID: 0x0004, 4280 bytes
509��� 0.000469�� 192.168.1.101� 192.168.1.3��� DCERPC��� Request: call_id: 9 opnum: 19 ctx_id: 0
513��� 0.000011�� 192.168.1.3��� 192.168.1.101� SMB� �����Write AndX Response, FID: 0x0004, 4280 bytes
514��� 0.000266�� 192.168.1.101� 192.168.1.3��� DCERPC��� Request: call_id: 9 opnum: 19 ctx_id: 0
517��� 0.000079�� 192.168.1.3��� 192.168.1.101� SPOOLSS�� WritePrinter response, 57344 bytes written
.
.
Note Opnum 19 is RpcWritePrinter() as per the RPC interface IDL:
http://msdn.microsoft.com/en-us/library/cc244649(PROT.10).aspx�
References�
Old printing RPC interface (NT/2000/XP/2003)
http://msdn.microsoft.com/en-us/library/cc244528(PROT.10).aspx
Transport used by the old printing RPC interface
http://msdn.microsoft.com/en-us/library/cc244535(PROT.10).aspx
New printing RPC interface (Vista/2008/Windows 7/Windows 2008 R2)
http://msdn.microsoft.com/en-us/library/cc238080(PROT.10).aspx
Transport used by the new printing RPC interface�
http://msdn.microsoft.com/en-us/library/cc238087(PROT.10).aspx