RFC 2565

Internet Printing Protocol/1.0: Encoding and Transport

๐Ÿ“… published April 1999, from ietf

Internet Printing Protocol/1.0: Encoding and Transport ๐ŸŽ€

Part 1 of 8 ๐Ÿฆ‹

Okay bestie, this is the RFC for Internet Printing Protocol/1.0: Encoding and Transport ๐Ÿ–จ๏ธโœจ. It's RFC 2565 and it's giving experimental energy ๐Ÿงช. It was published in April 1999 in the Network Working Group, and it's Category: Experimental. The authors are R. Herriot, Ed. (Xerox Corporation), S. Butler (Hewlett-Packard), P. Moore (Microsoft), and R. Turner (Sharp Labs) ๐Ÿ‘‘. The title block doesn't list anything it obsoletes or updates, so there's no drama there ๐Ÿ™ˆ.

Status of This Memo โœจ

This memo defines an Experimental Protocol for the Internet community ๐Ÿงช. It's not an Internet standard of any kind, so don't go calling it one ๐Ÿ’…. Discussion and suggestions for improvement are welcome ๐Ÿซถ. Distribution of this memo is unlimited ๐ŸŒˆ.

Copyright (C) The Internet Society (1999). All Rights Reserved.

IESG Note ๐Ÿ”ฅ

Okay so this document defines an Experimental protocol for the Internet community ๐Ÿงช. The IESG expects that a revised version will eventually be published as a Proposed Standard protocol ๐ŸŒŸ. That future version is expected to change from what's in this memo, especially because it'll likely bring in strong authentication and privacy features, plus an "ipp:" URL type that supports those security measures ๐Ÿ”. Other changes are possible too ๐Ÿฆ‹.

Implementors, be warned! Future versions of this protocol may not interoperate with the version of IPP defined in this document ๐Ÿ’€. Even if they do interoperate, some protocol features may not be available ๐Ÿ˜ญ.

The IESG encourages experimentation with this protocol, especially in combination with Transport Layer Security (TLS) [RFC 2246] โœจ. The goal is to figure out how TLS can be used effectively as a security layer for IPP ๐Ÿ”๐Ÿ’œ.

Abstract ๐Ÿ’œ

This document is one piece of a set that together describes every aspect of a new Internet Printing Protocol (IPP) ๐Ÿ–จ๏ธ. IPP is an application level protocol for distributed printing using Internet tools and technologies ๐ŸŒˆ. This document is the one that defines the rules for encoding IPP operations and IPP attributes into a new Internet MIME media type called "application/ipp" ๐ŸŽ€. It also defines how to transport a message body whose Content-Type is "application/ipp" over HTTP ๐Ÿš€.

The full set of IPP documents includes:

  • Design Goals for an Internet Printing Protocol [RFC2567]
  • Rationale for the Structure and Model and Protocol for the Internet Printing Protocol [RFC2568]
  • Internet Printing Protocol/1.0: Model and Semantics [RFC2566]
  • Internet Printing Protocol/1.0: Encoding and Transport (this document)
  • Internet Printing Protocol/1.0: Implementer's Guide [ipp-iig]
  • Mapping between LPD and IPP Protocols [RFC2569]

Here's the vibe for each one ๐Ÿ’…. "Design Goals for an Internet Printing Protocol" takes a broad look at distributed printing and lists real-life scenarios that clarify which features a printing protocol for the Internet needs ๐Ÿงš. It identifies requirements for three types of users: end users, operators, and administrators ๐Ÿ‘‘. It calls out a subset of end user requirements that IPP/1.0 satisfies, and operator and administrator requirements are out of scope for version 1.0 ๐Ÿ™ˆ.

"Rationale for the Structure and Model and Protocol for the Internet Printing Protocol" describes IPP from a high-level view ๐Ÿฆ‹. It maps out the roadmap for the documents that make up the IPP suite, and it gives background and reasoning for the IETF working group's major decisions ๐ŸŒธ.

"Internet Printing Protocol/1.0: Model and Semantics" describes a simplified model with abstract objects, their attributes, and their operations, all independent of encoding and transport ๐Ÿ’–. It introduces a Printer and a Job object, and the Job object optionally supports multiple documents per Job ๐Ÿ“„. It also covers security, internationalization, and directory issues ๐ŸŒ.

This document, "Internet Printing Protocol/1.0: Implementer's Guide", gives advice to implementers of IPP clients and IPP objects ๐Ÿ› ๏ธ.

"Mapping between LPD and IPP Protocols" gives some advice to implementers of gateways between IPP and LPD (Line Printer Daemon) implementations ๐Ÿงฉ.

Table of Contents ๐Ÿ“š

1. Introduction.....................................................4
2. Conformance Terminology..........................................4
3. Encoding of  the Operation Layer.................................4
   3.1  Picture of the Encoding.....................................5
   3.2  Syntax of Encoding..........................................7
   3.3  Version-number..............................................9
   3.4  Operation-id................................................9
   3.5  Status-code.................................................9
   3.6  Request-id..................................................9
   3.7  Tags.......................................................10
      3.7.1 Delimiter Tags.........................................10
      3.7.2 Value Tags.............................................11
   3.8  Name-Length................................................13
   3.9  (Attribute) Name...........................................13
   3.10 Value Length...............................................16
   3.11 (Attribute) Value..........................................16
   3.12 Data.......................................................18
4. Encoding of Transport Layer.....................................18
5. Security Considerations.........................................19
   5.1  Using IPP with SSL3........................................19
6. References......................................................20
7. Authors' Addresses..............................................22
8. Other Participants:.............................................24
9. Appendix A: Protocol Examples...................................25
   9.1  Print-Job Request..........................................25
   9.2  Print-Job Response (successful)............................26
   9.3  Print-Job Response (failure)...............................27
   9.4  Print-Job Response (success with attributes ignored).......28
   9.5  Print-URI Request..........................................30
   9.6  Create-Job Request.........................................31
   9.7  Get-Jobs Request...........................................31
   9.8  Get-Jobs Response..........................................32
10. Appendix C: Registration of MIME Media Type Information for
    "application/ipp"..............................................35
11. Full Copyright Statement.......................................37

1. Introduction โœจ

Okay so this document holds the rules for encoding IPP operations, and it describes two layers: the transport layer and the operation layer ๐ŸŽ€.

The transport layer is an HTTP/1.1 request or response ๐Ÿš€. RFC 2068 [RFC2068] describes HTTP/1.1 ๐Ÿ“–. This document specifies the HTTP headers that an IPP implementation supports ๐Ÿ’….

The operation layer is a message body in an HTTP request or response ๐Ÿ’Œ. The document "Internet Printing Protocol/1.0: Model and Semantics" [RFC2566] defines what that message body means and which values are supported ๐Ÿง . This document covers how an IPP operation gets encoded ๐Ÿ”ค. From here on, the aforementioned document [RFC2566] is referred to as the "IPP model document" ๐Ÿ“„.

2. Conformance Terminology ๐Ÿ”ฅ

Here's the BCP 14 key word situation. The key words "MUST", "MUST NOT", "REQUIRED", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 [RFC2119] ๐Ÿ’–.

3. Encoding of the Operation Layer ๐Ÿงš

Bestie, the operation layer MUST contain a single operation request or operation response ๐Ÿ’…. Each request or response is made of a sequence of values and attribute groups ๐Ÿงฉ. Attribute groups are a sequence of attributes, and each attribute is a name and a value ๐Ÿฆ‹. Names and values end up being sequences of octets ๐Ÿ”ข.

The encoding is built out of octets, which are the most primitive type ๐Ÿ”ข. Several types are built from octets, but three matter most: integers, character strings, and octet strings. Most other data types are built on top of those ๐ŸŒธ. Every character string in this encoding MUST be a sequence of characters, and each character is associated with some charset and some natural language ๐ŸŒ. A character string MUST be in "reading order", so the first character in the value (according to reading order) is the first character in the encoding โœ๏ธ. A character string whose associated charset is US-ASCII and whose associated natural language is US English is called a US-ASCII-STRING ๐Ÿ‡บ๐Ÿ‡ธ. A character string whose associated charset and natural language are specified in a request or response, as described in the model document, is called a LOCALIZED-STRING ๐ŸŒˆ. An octet string MUST be in "IPP model document order", so the first octet in the value (according to the IPP model document order) is the first octet in the encoding ๐Ÿงพ. Every integer in this encoding MUST be encoded as a signed integer, using two's-complement binary encoding with big-endian format (also known as "network order" and "most significant byte first") ๐Ÿ’œ. The number of octets for an integer MUST be 1, 2 or 4, depending on how it's used in the protocol ๐Ÿ”ข.

Here's the size breakdown, periodt ๐Ÿ’…. One-octet integers, called SIGNED-BYTE, are used for the version-number and tag fields ๐ŸŽ€. Two-byte integers, called SIGNED-SHORT, are used for the operation-id, status-code, and length fields โœจ. Four-byte integers, called SIGNED-INTEGER, are used for value fields and the sequence number ๐Ÿ”ฅ.

The next two sections show the operation layer in two ways ๐Ÿ‘‘:

  • informally, through pictures and description ๐ŸŽจ
  • formally, through Augmented Backus-Naur Form (ABNF), as specified by RFC 2234 [RFC2234] ๐Ÿง 

3.1 Picture of the Encoding โœจ

okay so bestie, this is the whole vibe of an operation request or response ๐Ÿ’… It's basically a stack of fields, and the diagram below shows what sits where:

  -----------------------------------------------
  |                  version-number             |   2 bytes  - required
  -----------------------------------------------
  |               operation-id (request)        |
  |                      or                     |   2 bytes  - required
  |               status-code (response)        |
  -----------------------------------------------
  |                   request-id                |   4 bytes  - required
  -----------------------------------------------------------
  |               xxx-attributes-tag            |   1 byte  |
  -----------------------------------------------           |-0 or more
  |             xxx-attribute-sequence          |   n bytes |
  -----------------------------------------------------------
  |              end-of-attributes-tag          |   1 byte   - required
  -----------------------------------------------
  |                     data                    |   q bytes  - optional
  -----------------------------------------------

The xxx-attributes-tag and xxx-attribute-sequence pair can be any one of four values for "xxx": operation, job, printer and unsupported ๐ŸŽ€. Together, each pair represents an attribute group from the model document. The xxx-attributes-tag tells you which group it is, and the xxx-attribute-sequence holds the attributes themselves ๐Ÿฆ‹

The order of those tag and sequence pairs is spelled out in the IPP model document for every operation request and operation response, so check there for the exact sequence ๐Ÿ“–

A request or response SHOULD contain each xxx-attributes-tag defined for that request or response, even if there are no attributes ๐ŸŒธ The one exception is the unsupported-attributes-tag, which SHOULD only show up if the unsupported-attribute-sequence is non-empty. A receiver of a request MUST be able to treat these two things as equivalent empty attribute groups:

  • a) an xxx-attributes-tag with an empty xxx-attribute-sequence,
  • b) an expected but missing xxx-attributes-tag.

Ngl, this is the kind of rule that keeps everyone chill ๐Ÿซถ

The data gets left out of some operations, but the end-of-attributes-tag is still there even when the data is omitted ๐Ÿ’œ Quick note: the xxx-attributes-tag and the end-of-attributes-tag are called 'delimiter-tags'. Also, the xxx-attribute-sequence shown above may consist of 0 bytes, according to the rule below ๐Ÿงš

An xxx-attributes-sequence is made up of zero or more compound-attributes:

  -----------------------------------------------
  |              compound-attribute             |   s bytes - 0 or more
  -----------------------------------------------

A compound-attribute is one attribute with a single value, followed by zero or more additional values ๐Ÿ’–

Note: a 'compound-attribute' represents a single attribute in the model document. The 'additional value' syntax is for attributes with 2 or more values. It's giving clean organisation fr fr โœจ

Each attribute has this layout:

  -----------------------------------------------
  |                   value-tag                 |   1 byte
  -----------------------------------------------
  |               name-length  (value is u)     |   2 bytes
  -----------------------------------------------
  |                     name                    |   u bytes
  -----------------------------------------------
  |              value-length  (value is v)     |   2 bytes
  -----------------------------------------------
  |                     value                   |   v bytes
  -----------------------------------------------

And an additional value looks like this:

  -----------------------------------------------------------
  |                   value-tag                 |   1 byte  |
  -----------------------------------------------           |
  |            name-length  (value is 0x0000)   |   2 bytes |
  -----------------------------------------------           |-0 or more
  |              value-length (value is w)      |   2 bytes |
  -----------------------------------------------           |
  |                     value                   |   w bytes |
  -----------------------------------------------------------

Note: an additional value is like an attribute whose name-length is 0. Iconic behaviour, honestly ๐Ÿ‘‘

If you're writing a parsing loop, the encoding looks like this instead:

  -----------------------------------------------
  |                  version-number             |   2 bytes  - required
  -----------------------------------------------
  |               operation-id (request)        |
  |                      or                     |   2 bytes  - required
  |               status-code (response)        |
  -----------------------------------------------
  |                   request-id                |   4 bytes  - required
  -----------------------------------------------------------
  |        tag (delimiter-tag or value-tag)     |   1 byte  |
  -----------------------------------------------           |-0 or more
  |           empty or rest of attribute        |   x bytes |
  -----------------------------------------------------------
  |              end-of-attributes-tag          |   2 bytes  - required
  -----------------------------------------------
  |                     data                    |   y bytes  - optional
  -----------------------------------------------

The value of the tag decides what the bytes after it are. They could be:

  • attributes
  • data
  • the remainder of a single attribute, where the tag specifies the type of the value

3.2 Syntax of Encoding ๐ŸŽ€

Here's the ABNF [RFC2234] for the syntax. The one twist is that 'strings of literals' MUST be case sensitive ๐Ÿ™ˆ So 'a' means lower case 'a' and not upper case 'A'. On top of that, SIGNED-BYTE and SIGNED-SHORT fields are written as '%x' values that show their range of values.

  ipp-message = ipp-request / ipp-response
  ipp-request = version-number operation-id request-id
           *(xxx-attributes-tag  xxx-attribute-sequence)
           end-of-attributes-tag data
  ipp-response = version-number status-code request-id
           *(xxx-attributes-tag xxx-attribute-sequence)
           end-of-attributes-tag data
  xxx-attribute-sequence = *compound-attribute

  xxx-attributes-tag = operation-attributes-tag / job-attributes-tag /
        printer-attributes-tag / unsupported-attributes-tag

  version-number = major-version-number minor-version-number
  major-version-number = SIGNED-BYTE  ; initially %d1
  minor-version-number = SIGNED-BYTE  ; initially %d0

  operation-id = SIGNED-SHORT    ; mapping from model defined below
  status-code = SIGNED-SHORT  ; mapping from model defined below
  request-id = SIGNED-INTEGER ; whose value is > 0

  compound-attribute = attribute *additional-values
  attribute = value-tag name-length name value-length value
  additional-values = value-tag zero-name-length value-length value

  name-length = SIGNED-SHORT    ; number of octets of 'name'
  name = LALPHA *( LALPHA / DIGIT / "-" / "_" / "." )
  value-length = SIGNED-SHORT  ; number of octets of 'value'
  value = OCTET-STRING

  data = OCTET-STRING

  zero-name-length = %x00.00           ; name-length of 0
  operation-attributes-tag =  %x01             ; tag of 1
  job-attributes-tag   =  %x02                 ; tag of 2
  printer-attributes-tag =  %x04               ; tag of 4
  unsupported-attributes-tag =  %x05          ; tag of 5
  end-of-attributes-tag = %x03                 ; tag of 3
  value-tag = %x10-FF

  SIGNED-BYTE = BYTE
  SIGNED-SHORT = 2BYTE
  SIGNED-INTEGER = 4BYTE
  DIGIT = %x30-39    ;  "0" to "9"
  LALPHA = %x61-7A   ;  "a" to "z"
  BYTE = %x00-FF
  OCTET-STRING = *BYTE

The syntax lets an xxx-attributes-tag show up even when the xxx-attribute-sequence after it is empty ๐Ÿงš That's on purpose, so the Get-Jobs response can return no attributes for some job-objects. It's RECOMMENDED that the sender not send an xxx-attributes-tag when there are no attributes (except in the Get-Jobs response just mentioned). Still, the receiver MUST be able to decode that syntax anyway ๐Ÿซถ

3.3 Version-number ๐ŸŒˆ

The version-number MUST consist of a major and a minor version-number, and each of those MUST be represented by a SIGNED-BYTE ๐Ÿ’… The protocol in this document MUST have a major version-number of 1 (0x01) and a minor version-number of 0 (0x00). The ABNF for these two bytes MUST be %x01.00 โœจ

3.4 Operation-id ๐Ÿฆ‹

Operation-ids are defined as enums in the model document. An operation-ids enum value MUST be encoded as a SIGNED-SHORT ๐Ÿ’–

Note: the values 0x4000 to 0xFFFF are reserved for private extensions. Private extensions get their own lane, bestie ๐ŸŒธ

3.5 Status-code ๐Ÿ‘‘

Status-codes are defined as enums in the model document too. A status-code enum value MUST be encoded as a SIGNED-SHORT ๐Ÿ”ฅ

The status-code is an operation attribute in the model document. In the protocol, though, it has a special spot, sitting outside of the operation attributes ๐Ÿ™ˆ

If an IPP status-code gets returned, then the HTTP Status-Code MUST be 200 (successful-ok). With any other HTTP Status-Code value, the HTTP response MUST NOT contain an IPP message-body, which means no IPP status-code gets returned at all ๐Ÿ’€

3.6 Request-id ๐Ÿ“

The request-id lets a client match a response with its request. This mechanism is unnecessary in HTTP, but it may be useful when application/ipp entity bodies get used in another context โœจ

The request-id in a response MUST be the value of the request-id received in the corresponding request. A client can set the request-id in each request to a unique value or to a constant value, such as 1, depending on what the client does with the request-id returned in the response ๐ŸŽ€ The value of the request-id MUST be greater than zero ๐Ÿ’œ

3.7 Tags ๐Ÿงš

There are two kinds of tags, and they're both super important ๐Ÿ’…

  • delimiter tags: delimit major sections of the protocol, namely attributes and data
  • value tags: specify the type of each attribute value

3.7.1 Delimiter Tags

okay bestie, the delimiter tags are the big โœจ dividers that organise the whole message, and this table lists their values ๐ŸŽ€

Tag Value (Hex)   Delimiter

0x00              reserved
0x01              operation-attributes-tag
0x02              job-attributes-tag
0x03              end-of-attributes-tag
0x04              printer-attributes-tag
0x05              unsupported-attributes-tag
0x06-0x0e         reserved for future delimiters
0x0F              reserved for future chunking-end-of-attributes-
                         tag

so when an xxx-attributes-tag shows up, it MUST mean that the zero or more attributes after it, up until the next delimiter tag, belong to the group xxx from the model document. xxx can be operation, job, printer, or unsupported ๐Ÿ’…

let's break that down ๐Ÿฆ‹

  • an operation-attributes-tag MUST mean the attributes after it are operation attributes from the model document ๐Ÿ“
  • a job-attributes-tag MUST mean the attributes after it are job attributes or job template attributes from the model document ๐Ÿงš
  • a printer-attributes-tag MUST mean the attributes after it are printer attributes from the model document ๐Ÿ–จ๏ธ
  • an unsupported-attributes-tag MUST mean the attributes after it are unsupported attributes from the model document ๐Ÿ™ˆ

the operation-attributes-tag and the end-of-attributes-tag each MUST show up exactly once in an operation. the operation-attributes-tag MUST be the first delimiter, and the end-of-attributes-tag MUST be the last one ๐Ÿ‘‘ if the operation has a document-content group, the document data in that group MUST come right after the end-of-attributes-tag ๐Ÿ“„

the other three xxx-attributes-tags are OPTIONAL in an operation, and each one MUST appear at most once. the one exception is the job-attributes-tag in a Get-Jobs response, which can show up zero or more times ๐ŸŒธ

the order and presence of delimiter tags in each operation request and each operation response MUST match what the model document defines. for more detail, check section 3.9 "(Attribute) Name" and section 9 "Appendix A: Protocol Examples" ๐Ÿ“š

and finally, a Printer MUST handle the reserved delimiter tags differently from reserved value tags. that way it can tell when a whole attribute group is something it doesn't understand, versus just one single value it doesn't understand ๐Ÿ’–

3.7.2 Value Tags

the value-tag is the first octet of an attribute, and it tells you what type the attribute's value is. here are the "out-of-band" value-tags ๐ŸŒˆ

Tag Value (Hex) Meaning

0x10            unsupported
0x11            reserved for future 'default'
0x12            unknown
0x13            no-value

Tag Value (Hex) Meaning

0x14-0x1F       reserved for future "out-of-band" values.

the "unsupported" value MUST be used in the attribute-sequence of an error response, for any attributes the printer doesn't support ๐Ÿ™…โ€โ™€๏ธ "default" is reserved for a future feature where you set a value back to its default ๐Ÿ”„ "unknown" is for a supported attribute whose value is temporarily unknown โณ and "no-value" is for a supported attribute that doesn't have a value assigned yet. like, "job-k-octets-supported" has no value if the implementation supports it but an admin hasn't set a limit on the printer ๐Ÿซถ

here are the integer value-tags ๐Ÿ”ข

Tag Value (Hex)  Meaning

0x20             reserved
0x21             integer
0x22             boolean
0x23             enum
0x24-0x2F        reserved for future integer types
NOTE: 0x20 is reserved for "generic integer" in case it's ever needed ๐Ÿ‘€

next up are the octetString value-tags ๐Ÿง

Tag Value (Hex)  Meaning

0x30             octetString with an  unspecified format
0x31             dateTime
0x32             resolution
0x33             rangeOfInteger
0x34             reserved for collection (in the future)
0x35             textWithLanguage
0x36             nameWithLanguage
0x37-0x3F        reserved for future octetString types

and the character-string value-tags ๐Ÿ’œ

Tag Value (Hex)  Meaning

0x40             reserved
0x41             textWithoutLanguage
0x42             nameWithoutLanguage
0x43             reserved
0x44             keyword
0x45             uri
0x46             uriScheme
0x47             charset
0x48             naturalLanguage
Tag Value (Hex)  Meaning

0x49             mimeMediaType
0x4A-0x5F        reserved for future character string types
NOTE: 0x40 is reserved for "generic character-string" in case it's ever needed ๐ŸŒท
NOTE: every attribute value always has a type, and its tag spells that type out. "nameWithoutLanguage" is one example. an attribute's name has an implicit type, and that type is keyword ๐Ÿ”‘

the values 0x60-0xFF are reserved for future types. there are no values set aside for private extensions ๐Ÿšซ a new type MUST be registered through the type 2 registration process [RFC2566] ๐Ÿ“

the tag 0x7F is reserved for extending types past the 255 values that fit in one byte ๐Ÿš€ a tag value of 0x7F MUST signify that the first 4 bytes of the value field are read as the tag value. this extension doesn't affect parsers that don't know about this special tag. to them it's just like any other unknown tag, and the value length tells them how long the value is, which they treat as a single unit ๐Ÿงฉ all of these 4-byte tag values are currently unallocated, except that 0x40000000-0x7FFFFFFF is reserved for experimental use ๐Ÿงช

3.8 Name-Length โœจ

the name-length field MUST be a SIGNED-SHORT ๐ŸŽฏ it MUST give the number of octets in the name field that comes right after it. the two bytes of the name-length field itself don't get counted ๐Ÿ™Œ

if a name-length field is zero, the name field after it MUST be empty, and the value after that MUST be treated as an extra value for the attribute before it ๐Ÿ’… inside an attribute-sequence, if two attributes have the same name, the first one MUST be ignored ๐Ÿ™ˆ a zero-length name is the only way to get multi-valued attributes, so it's giving main character energy ๐Ÿ‘‘

3.9. (Attribute) Name ๐Ÿฆ‹

okay so some operation elements are called parameters in the model document [RFC2566] ๐Ÿ’… and they're kind of special. they MUST be encoded in a special position and they MUST NOT show up as operation attributes. these are the parameters:

  • version-number: the parameter named version-number in the IPP model document MUST become the version-number field in the operation layer request or response.
  • operation-id: the parameter named operation-id in the IPP model document MUST become the operation-id field in the operation layer request.
  • status-code: the parameter named status-code in the IPP model document MUST become the status-code field in the operation layer response.
  • request-id: the parameter named request-id in the IPP model document MUST become the request-id field in the operation layer request or response.

Now the URI situation ๐ŸŒธ All Printer and Job objects get identified by a Uniform Resource Identifier (URI) [RFC2396] so they can be referenced persistently and unambiguously. URIs are a useful concept, BUT until the notion of URI is more stable (meaning defined more completely and deployed more widely), the URIs used for IPP objects are expected to actually be URLs [RFC1738] [RFC1808]. every URL is a specialized form of a URI, so even though the rest of this document says URI, it covers the more specific idea of URL too โœจ

Some operation elements are encoded twice. once as the request-URI on the HTTP Request-Line, and a second time as a REQUIRED operation attribute in the application/ipp entity. these attributes are the target URI for the operation ๐ŸŽ€

  • printer-uri: when the target is a printer and the transport is HTTP or HTTPS (for SSL3 [ssl]), the target printer-uri defined in each operation in the IPP model document MUST be an operation attribute called printer-uri, and it MUST also be specified outside of the operation layer as the request-URI on the Request-Line at the HTTP level.
  • job-uri: when the target is a job and the transport is HTTP or HTTPS (for SSL3), the target job-uri of each operation in the IPP model document MUST be an operation attribute called job-uri, and it MUST also be specified outside of the operation layer as the request-URI on the Request-Line at the HTTP level.
Note: The target URI is included twice in an operation referencing the same IPP object, but the two URIs NEED NOT be literally identical. One can be a relative URI and the other can be an absolute URI. HTTP/1.1 allows clients to generate and send a relative URI rather than an absolute URI. A relative URI identifies a resource with the scope of the HTTP server, but does not include scheme, host or port.

the following statements explain how URLs should be used when mapping IPP onto HTTP/1.1 ๐Ÿงš

  1. Although it's potentially redundant, a client MUST supply the target of the operation both as an operation attribute and as a URI at the HTTP layer. the reason is to keep one consistent set of rules for mapping application/ipp onto possibly many communication layers, even where URLs aren't the addressing mechanism in the transport layer.
  2. even though these two URLs might not be literally identical (one relative, one absolute), they MUST both reference the same IPP object.
  3. the URI in the HTTP layer is either relative or absolute, and the HTTP server uses it to route the HTTP request to the correct resource relative to that HTTP server. the HTTP server doesn't need to be aware of the URI inside the operation request.
  4. once the HTTP server resource starts processing the HTTP request, it might get the reference to the right IPP Printer object from either the HTTP URI (using to the context of the HTTP server for relative URLs) or from the URI within the operation request. the choice is up to the implementation ๐Ÿ’–
  5. HTTP URIs can be relative or absolute, but the target URI in the operation MUST be an absolute URI.

the model document sorts the remaining attributes into groups for each operation request and response. every one of those groups MUST be represented in the protocol by an xxx-attribute-sequence, preceded by the matching xxx-attributes-tag (see the table below and section 9 "Appendix A: Protocol Examples"). the order of these xxx-attributes-tags and xxx-attribute-sequences in the protocol MUST be the same as in the model document, BUT the order of attributes inside each xxx-attribute-sequence MUST be unspecified. here's the table that maps each model document group name to its xxx-attributes-sequence ๐Ÿ“‹

Model Document Group           xxx-attributes-sequence

Operation Attributes           operations-attributes-sequence
Job Template Attributes        job-attributes-sequence
Job Object Attributes          job-attributes-sequence
Unsupported Attributes         unsupported-attributes-sequence
Requested Attributes           job-attributes-sequence
Get-Job-Attributes)
Requested Attributes           printer-attributes-sequence
Get-Printer-Attributes)
Document Content               in a special position as described
                               above

If an operation contains attributes from more than one job object (e.g. a Get-Jobs response), the attributes from each job object MUST be in a separate job-attribute-sequence, so that the attributes from the ith job object are in the ith job-attribute-sequence. check out Section 9 "Appendix A: Protocol Examples" for a table showing these rules in action ๐ŸŒˆ


3.10. Value Length ๐Ÿ’œ

each attribute value MUST be preceded by a SIGNED-SHORT, and that SIGNED-SHORT MUST specify the number of octets in the value that follows the length, not counting the two bytes that hold the length itself ๐Ÿ™ˆ

for any of the types represented by binary signed integers, the sender MUST encode the value in exactly four octets ๐Ÿ”ฅ

for any of the types represented by character-strings, the sender MUST encode the value with all of the characters in the string and without any padding characters โœจ

if a value-tag contains an "out-of-band" value, like "unsupported", the value-length MUST be 0 and the value empty. the value has no meaning when the value-tag is out-of-band. if a client gets a response with a nonzero value-length in this case, it MUST ignore the value field. if a printer gets a request with a nonzero value-length in this case, it MUST reject the request ๐Ÿ’€


3.11. (Attribute) Value ๐Ÿ“

the syntax types, and most of the details of how they're represented, are defined in the IPP model document. this table adds to that info and defines the model document's syntax types in terms of the 5 basic types from section 3 "Encoding of the Operation Layer". the 5 types are US-ASCII-STRING, LOCALIZED-STRING, SIGNED-INTEGER, SIGNED-SHORT, SIGNED-BYTE, and OCTET-STRING ๐Ÿ‘‘

Syntax of Attribute  Encoding
Value

textWithoutLanguage, LOCALIZED-STRING.
nameWithoutLanguage

textWithLanguage     OCTET_STRING consisting of 4 fields:
                       a) a SIGNED-SHORT which is the number of octets
                          in the following field
                       b) a value of type natural-language,
                       c) a SIGNED-SHORT which is the number of octets
                          in the following field,
                       d) a value of type textWithoutLanguage.

                      The length of a textWithLanguage value MUST be 4
                      + the value of field a + the value of field c.

nameWithLanguage     OCTET_STRING consisting of 4 fields:
                       a) a SIGNED-SHORT which is the number of octets
                          in the following field
                       b) a value of type natural-language,
                       c) a SIGNED-SHORT which is the number of octets
                          in the following field,
                       d) a value of type nameWithoutLanguage.

                      The length of a nameWithLanguage value MUST be 4
                      + the value of field a + the value of field c.

charset,             US-ASCII-STRING.
naturalLanguage,
mimeMediaType,
keyword, uri, and
uriScheme

boolean              SIGNED-BYTE  where 0x00 is 'false' and 0x01 is
                      'true'.

Syntax of Attribute  Encoding
Value


integer and enum     a SIGNED-INTEGER.

dateTime             OCTET-STRING consisting of eleven octets whose
                      contents are defined by "DateAndTime" in RFC
                      2579 [RFC2579].

resolution           OCTET_STRING consisting of nine octets of  2
                      SIGNED-INTEGERs followed by a SIGNED-BYTE. The
                      first SIGNED-INTEGER contains the value of cross
                      feed direction resolution. The second SIGNED-
                      INTEGER contains the value of feed direction
                      resolution. The SIGNED-BYTE contains the units
                      value.

rangeOfInteger       Eight octets consisting of 2 SIGNED-INTEGERs.
                      The first SIGNED-INTEGER contains the lower
                      bound and the second SIGNED-INTEGER contains the
                      upper  bound.

1setOf  X            Encoding according to the rules for an attribute
                      with more than 1 value.  Each value X is encoded
                      according to the rules for encoding its type.

octetString          OCTET-STRING

the type of the value in the model document decides how the value is encoded and what the value-tag is ๐ŸŒธ


3.12. Data ๐Ÿงš

the data part MUST include any data required by the operation

4. Encoding of Transport Layer โœจ

okay bestie, HTTP/1.1 [RFC2068] is the transport layer for this protocol ๐Ÿšš๐Ÿ’– it's literally the delivery truck that carries all the IPP stuff around ๐Ÿซถ

The operation layer was designed assuming the transport layer already has these two things, no cap:

  • the URI of the target job or printer operation
  • the total length of the data in the operation layer, either as a single length or as a sequence of chunks each with a length.

It is REQUIRED that a printer implementation support HTTP over the IANA assigned Well Known Port 631 (the IPP default port) ๐Ÿ–จ๏ธ, though a printer implementation may support HTTP over some other port as well. A printer may also have to support another port for privacy (See Section 5 "Security Considerations") ๐Ÿ”

Note: even though port 631 is the IPP default, port 80 remains the default for an HTTP URI ๐Ÿ‘€ So a URI for a printer using port 631 MUST contain an explicit port, e.g. "http://forest:631/pinetree". An HTTP URI for IPP with no explicit port implicitly references port 80, which is consistent with the rules for HTTP/1.1. This is giving consistency ๐Ÿ’…

Each HTTP operation MUST use the POST method, where the request-URI is the object target of the operation ๐ŸŽฏ and the "Content-Type" of the message-body in each request and response MUST be "application/ipp". The message-body MUST contain the operation layer and MUST have the syntax described in section 3.2 "Syntax of Encoding" โœจ A client implementation MUST adhere to the rules for a client described for HTTP1.1 [RFC2068]. A printer (server) implementation MUST adhere to the rules for an origin server described for HTTP1.1 [RFC2068]. Main character energy ๐Ÿ‘‘

An IPP server sends a response for each request that it receives ๐Ÿ“ฌ If an IPP server detects an error, it MAY send a response before it has read the entire request. If the HTTP layer of the IPP server completes processing the HTTP headers successfully, it MAY send an intermediate response, such as "100 Continue", with no IPP data before sending the IPP response. A client MUST expect such a variety of responses from an IPP server ๐Ÿ™ˆ For further information on HTTP/1.1, consult the HTTP documents [RFC2068].


5. Security Considerations ๐Ÿ”๐Ÿ’€

okay this section is serious, so let's get into it ๐Ÿ˜ญ

The IPP Model document defines an IPP implementation with "privacy" as one that implements Secure Socket Layer Version 3 (SSL3). Note: SSL3 is not an IETF standards track specification ๐Ÿ™ƒ SSL3 meets the requirements for IPP security with regards to features such as mutual authentication and privacy (via encryption). The IPP Model document also outlines IPP-specific security considerations and should be the primary reference for security implications with regards to the IPP protocol itself. Read that one, periodt ๐Ÿ“–

The IPP Model document defines an IPP implementation with "authentication" as one that implements the standard way for transporting IPP messages within HTTP 1.1. These include the security considerations outlined in the HTTP 1.1 standard document [RFC2068] and Digest Access Authentication extension [RFC2069] ๐Ÿ”‘

The current HTTP infrastructure supports HTTP over TCP port 80. IPP server implementations MUST offer IPP services using HTTP over the IANA assigned Well Known Port 631 (the IPP default port) ๐Ÿ–จ๏ธ IPP server implementations may support other ports, in addition to this port.

See further discussion of IPP security concepts in the model document [RFC2566] ๐Ÿฆ‹

5.1 Using IPP with SSL3 ๐ŸŽ€

An assumption is that the URI for a secure IPP Printer object has been found by means outside the IPP printing protocol, via a directory service, web site or other means ๐Ÿ—บ๏ธ

IPP provides a transparent connection to SSL by calling the corresponding URL (an https URI connects by default to port 443) ๐ŸŒธ However, the following functions can be provided to ease the integration of IPP with SSL during implementation:

connect (URI), returns a status

"connect" makes an https call and returns the immediate status of the connection as returned by SSL to the user. The status values are explained in section 5.4.2 of the SSL document [ssl]. A session-id may also be retained to later resume a session โœจ The SSL handshake protocol may also require the cipher specifications supported by the client, key length of the ciphers, compression methods, certificates, etc. These should be sent to the server and hence should be available to the IPP client (although as part of administration features) ๐Ÿงš

disconnect (session)

to disconnect a particular session ๐Ÿ’… The session-id available from the "connect" could be used.

resume (session)

to reconnect using a previous session-id ๐Ÿ”„

The availability of this information as administration features is left for implementers, and need not be specified at this time ๐Ÿซถ


6. References ๐Ÿ“š

[RFC2278] Freed, N. and J. Postel, "IANA Charset Registration Procedures", BCP 19, RFC 2278, January 1998.

[dpa] ISO/IEC 10175 Document Printing Application (DPA), June 1996.

[iana] IANA Registry of Coded Character Sets: ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets.

[ipp-iig] Hastings, Tom, et al., "Internet Printing Protocol/1.0: Implementer's Guide", Work in Progress.

[RFC2569] Herriot, R., Hastings, T., Jacobs, N. and J. Martin, "Mapping between LPD and IPP Protocols", RFC 2569, April 1999.

[RFC2566] deBry, R., Hastings, T., Herriot, R., Isaacson, S. and P. Powell, "Internet Printing Protocol/1.0: Model and Semantics", RFC 2566, April 1999.

[RFC2565] Herriot, R., Butler, S., Moore, P., Tuner, R., "Internet Printing Protocol/1.0: Encoding and Transport", RFC 2565, April 1999.

[RFC2568] Zilles, S., "Rationale for the Structure and Model and Protocol for the Internet Printing Protocol", RFC 2568, April 1999.

[RFC2567] Wright, D., "Design Goals for an Internet Printing Protocol", RFC 2567, April 1999.

[RFC822] Crocker, D., "Standard for the Format of ARPA Internet Text Messages", STD 11, RFC 822, August 1982.

[RFC1123] Braden, R., "Requirements for Internet Hosts - Application and Support", STD 3, RFC 1123, October 1989.

[RFC1179] McLaughlin, L. III, (editor), "Line Printer Daemon Protocol" RFC 1179, August 1990.

[RFC2223] Postel, J. and J. Reynolds, "Instructions to RFC Authors", RFC 2223, October 1997.

[RFC1738] Berners-Lee, T., Masinter, L. and M. McCahill, "Uniform Resource Locators (URL)", RFC 1738, December 1994.

[RFC1759] Smith, R., Wright, F., Hastings, T., Zilles, S. and J. Gyllenskog, "Printer MIB", RFC 1759, March 1995.

[RFC1766] Alvestrand, H., " Tags for the Identification of Languages", RFC 1766, March 1995.

[RFC1808] Fielding, R., "Relative Uniform Resource Locators", RFC 1808, June 1995.

[RFC2579] McCloghrie, K., Perkins, D. and J. Schoenwaelder, "Textual Conventions for SMIv2", STD 58, RFC 2579, April 1999.

[RFC2046] Freed, N. and N. Borenstein, Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types", RFC 2046, November 1996.

[RFC2048] Freed, N., Klensin J. and J. Postel. Multipurpose Internet Mail Extension (MIME) Part Four: Registration Procedures", BCP 13, RFC 2048, November 1996.

[RFC2068] Fielding, R., Gettys, J., Mogul, J., Frystyk, H. and T. Berners-Lee, "Hypertext Transfer Protocol -- HTTP/1.1", RFC 2068, January 1997.

[RFC2069] Franks, J., Hallam-Baker, P., Hostetler, J., Leach, P., Luotonen, A., Sink, E. and L. Stewart, "An Extension to HTTP: Digest Access Authentication", RFC 2069, January 1997.

[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997.

[RFC2184] Freed, N. and K. Moore, "MIME Parameter Value and Encoded Word Extensions: Character Sets, Languages, and Continuations", RFC 2184, August 1997.

[RFC2234] Crocker, D. and P. Overell, "Augmented BNF for Syntax Specifications: ABNF", RFC 2234. November 1997.

[RFC2396] Berners-Lee, T., Fielding, R. and L. Masinter, "Uniform Resource Identifiers (URI): Generic Syntax", RFC 2396, August 1998.


7. Authors' Addresses ๐Ÿ’Œ

Robert Herriot (Editor)
Xerox Corporation
3400 Hillview Ave., Bldg #1
Palo Alto, CA 94304

Phone: 650-813-7696
Fax:  650-813-6860
EMail: rherriot@pahv.xerox.com


Sylvan Butler
Hewlett-Packard
11311 Chinden Blvd.
Boise, ID 83714

Phone: 208-396-6000
Fax: 208-396-3457
EMail: sbutler@boi.hp.com
Paul Moore
Microsoft
One Microsoft Way
Redmond, WA 98053

Phone: 425-936-0908
Fax: 425-93MS-FAX
EMail: paulmo@microsoft.com


Randy Turner
Sharp Laboratories
5750 NW Pacific Rim Blvd
Camas, WA 98607

Phone: 360-817-8456
Fax: 360-817-8436
EMail: rturner@sharplabs.com


IPP Mailing List:  ipp@pwg.org
IPP Mailing List Subscription:  ipp-request@pwg.org
IPP Web Page:  http://www.pwg.org/ipp/

8. Other Participants: ๐Ÿซ‚

Chuck Adams - Tektronix          Harry Lewis - IBM
Ron Bergman - Dataproducts       Tony Liao - Vivid Image
Keith Carter - IBM               David Manchala - Xerox
Angelo Caruso - Xerox            Carl-Uno Manros - Xerox
Jeff Copeland - QMS              Jay Martin - Underscore
Roger deBry - IBM                Larry Masinter - Xerox
Lee Farrell - Canon              Ira McDonald - High North Inc.
Sue Gleeson - Digital            Bob Pentecost - Hewlett-Packard
Charles Gordon - Osicom          Patrick Powell - Astart
                                 Technologies
Brian Grimshaw - Apple           Jeff Rackowitz - Intermec
Jerry Hadsell - IBM              Xavier Riley - Xerox
Richard Hart - Digital           Gary Roberts - Ricoh
Tom Hastings - Xerox             Stuart Rowley - Kyocera
Stephen Holmstead                Richard Schneider - Epson
Zhi-Hong Huang - Zenographics    Shigern Ueda - Canon
Scott Isaacson - Novell          Bob Von Andel - Allegro Software
Rich Lomicka - Digital           William Wagner - Digital Products
David Kellerman - Northlake      Jasper Wong - Xionics
Software
Robert Kline - TrueSpectra       Don Wright - Lexmark
Dave Kuntz - Hewlett-Packard     Rick Yardumian - Xerox
Takami Kurono - Brother          Lloyd Young - Lexmark
Rich Landau - Digital            Peter Zehler - Xerox
Greg LeClair - Epson             Frank Zhao - Panasonic
                                 Steve Zilles - Adobe

9. Appendix A: Protocol Examples ๐Ÿง

9.1 Print-Job Request ๐Ÿ–จ๏ธโœจ

okay bestie, this is a Print-Job request with job-name, copies, and sides all specified ๐Ÿ’–. the ipp-attribute-fidelity attribute is set to 'true', so the print request fails if the copies or the sides attribute isn't supported, or if their values aren't supported. it's giving strict bouncer energy ๐Ÿ’…

 Octets          Symbolic Value                Protocol field

 0x0100          1.0                           version-number
 0x0002          Print-Job                     operation-id
 0x00000001      1                             request-id
 0x01            start operation-attributes    operation-attributes-tag
 0x47            charset type                  value-tag
 0x0012                                        name-length
 attributes-     attributes-charset            name
 charset
 0x0008                                        value-length
 us-ascii        US-ASCII                      value
 0x48            natural-language type         value-tag
 0x001B                                        name-length
 attributes-     attributes-natural-language   name
 natural-
 language
 0x0005                                        value-length
 en-us           en-US                         value
 0x45            uri type                      value-tag
 0x000B                                        name-length
 printer-uri     printer-uri                   name
 0x001A                                        value-length
 http://forest:  printer pinetree              value
 631/pinetree
 0x42            nameWithoutLanguage type      value-tag
 0x0008                                        name-length
 job-name        job-name                      name
 0x0006                                        value-length
 foobar          foobar                        value
 0x22            boolean type                  value-tag
 0x16                                          name-length
 ipp-attribute-  ipp-attribute-fidelity        name
 fidelity
 0x01                                          value-length
 0x01            true                          value
 0x02            start job-attributes          job-attributes-tag
 0x21            integer type                  value-tag
 0x0006                                        name-length
 copies          copies                        name
 0x0004                                        value-length
 0x00000014      20                            value
 0x44            keyword type                  value-tag
 0x0005                                        name-length
 sides           sides                         name
 0x0013                                        value-length
 two-sided-      two-sided-long-edge           value
 long-edge
 0x03            end-of-attributes             end-of-attributes-tag
 %!PS...         <PostScript>                  data

9.2 Print-Job Response (successful) ๐ŸŽ‰

here's a successful Print-Job response to that previous request ๐Ÿฆ‹. the printer supported the copies and sides attributes and their values, so everything went through. the status code returned is 'successful-ok' โœจ

 Octets            Symbolic Value              Protocol field

 0x0100            1.0                         version-number
 0x0000            successful-ok               status-code
 0x00000001        1                           request-id
 0x01              start operation-attributes  operation-attributes-tag
 0x47              charset type                value-tag
 0x0012                                        name-length
 attributes-       attributes-charset          name
 charset
 0x0008                                        value-length
 us-ascii          US-ASCII                    value
 0x48              natural-language type       value-tag
 0x001B                                        name-length
 attributes-       attributes-natural-         name
 natural-language  language
 0x0005                                        value-length
 en-us             en-US                       value
 0x41              textWithoutLanguage type    value-tag
 0x000E                                        name-length
 status-message    status-message              name
 0x000D                                        value-length
 successful-ok     successful-ok               value
 0x02              start job-attributes        job-attributes-tag
 0x21              integer                     value-tag
 0x0006                                        name-length
 Octets            Symbolic Value              Protocol field

 job-id            job-id                      name
 0x0004                                        value-length
 147               147                         value
 0x45              uri type                    value-tag
 0x0007                                        name-length
 job-uri           job-uri                     name
 0x001E                                        value-length
 http://forest:63  job 123 on pinetree         value
 1/pinetree/123
 0x42              nameWithoutLanguage type    value-tag
 0x0009                                        name-length
 job-state         job-state                   name
 0x0004                                        value-length
 0x0003            pending                     value
 0x03              end-of-attributes           end-of-attributes-tag

9.3 Print-Job Response (failure) ๐Ÿ’”

this one is an unsuccessful Print-Job response to that same request ๐Ÿ˜ญ. it fails because the printer doesn't support the sides attribute, and because the value '20' for the copies attribute isn't supported. so no job gets created, and neither a job-id nor a job-uri operation attribute comes back. the error code returned is 'client-error-attributes-or-values-not-supported' (0x040B) ๐Ÿ™ˆ

 Octets        Symbolic Value                Protocol field

 0x0100        1.0                           version-number
 0x040B        client-error-attributes-or-   status-code
               values-not-supported
 0x00000001    1                             request-id
 0x01          start operation-attributes    operation-attribute tag
 0x47          charset type                  value-tag
 0x0012                                      name-length
 attributes-   attributes-charset            name
 charset
 0x0008                                      value-length
 us-ascii      US-ASCII                      value
 0x48          natural-language type         value-tag
 0x001B                                      name-length
 attributes-   attributes-natural-language   name
 natural-
 language
 0x0005                                      value-length
 Octets            Symbolic Value              Protocol field

 en-us         en-US                         value
 0x41          textWithoutLanguage type      value-tag
 0x000E                                      name-length
 status-       status-message                name
 message
 0x002F                                      value-length
 client-error- client-error-attributes-or-   value
 attributes-   values-not-supported
 or-values-
 not-supported
 0x05          start unsupported-attributes  unsupported-attributes tag
 0x21          integer type                  value-tag
 0x0006                                      name-length
 copies        copies                        name
 0x0004                                      value-length
 0x00000014    20                            value
 0x10          unsupported  (type)           value-tag
 0x0005                                      name-length
 sides         sides                         name
 0x0000                                      value-length
 0x03          end-of-attributes             end-of-attributes-tag

9.4 Print-Job Response (success with attributes ignored) ๐ŸŒˆ

last one, and it's a plot twist ๐Ÿงš. this is a successful Print-Job response to a request like the previous one, except the ipp-attribute-fidelity value is false ๐Ÿ“. the print request succeeds even though the printer supports neither the sides attribute nor the value '20' for the copies attribute. so a job is created, and both a job-id and a job-uri operation attribute come back ๐ŸŽ€. the unsupported attributes get returned too, in an Unsupported Attributes Group. the error code returned is 'successful-ok-ignored-or-substituted-attributes' (0x0001) โœจ๐Ÿ‘‘

 Octets            Symbolic Value              Protocol field

 0x0100            1.0                         version-number
 0x0001            successful-ok-ignored-or-   status-code
                   substituted-attributes
 0x00000001        1                           request-id
 0x01              start operation-attributes  operation-attributes-tag
 0x47              charset type                value-tag
 0x0012                                        name-length
 attributes-       attributes-charset          name
 charset
 0x0008                                        value-length
 Octets            Symbolic Value              Protocol field

 us-ascii          US-ASCII                    value
 0x48              natural-language type       value-tag
 0x001B                                        name-length
 attributes-       attributes-natural-         name
 natural-language  language
 0x0005                                        value-length
 en-us             en-US                       value
 0x41              textWithoutLanguage type    value-tag
 0x000E                                        name-length
 status-message    status-message              name
 0x002F                                        value-length
 successful-ok-    successful-ok-ignored-or-   value
 ignored-or-       substituted-attributes
 substituted-
 attributes
 0x05              start unsupported-          unsupported-attributes
                   attributes                  tag
 0x21              integer type                value-tag
 0x0006                                        name-length
 copies            copies                      name
 0x0004                                        value-length
 0x00000014        20                          value
 0x10              unsupported  (type)         value-tag
 0x0005                                        name-length
 sides             sides                       name
 0x0000                                        value-length
 0x02              start job-attributes        job-attributes-tag
 0x21              integer                     value-tag
 0x0006                                        name-length
 job-id            job-id                      name
 0x0004                                        value-length
 147               147                         value
 0x45              uri type                    value-tag
 0x0007                                        name-length
 job-uri           job-uri                     name
 0x001E                                        value-length
 http://forest:63  job 123 on pinetree         value
 1/pinetree/123
 0x42              nameWithoutLanguage type    value-tag
 0x0009                                        name-length
 job-state         job-state                   name
 0x0004                                        value-length
 0x0003            pending                     value
 0x03              end-of-attributes           end-of-attributes-tag

9.5 Print-URI Request ๐Ÿฆ‹

okay so this one is a Print-URI request asking for copies and a job-name, and it's giving main character energy ๐Ÿ’… the printer gets the job by URI instead of a document, so there's no document-format sneaking in here ๐ŸŒธ the operation-attributes group, the job-attributes group, and the end tag all show up in order ๐ŸŽ€

Octets         Symbolic Value               Protocol field

0x0100         1.0                          version-number

Octets         Symbolic Value               Protocol field
0x0003         Print-URI                    operation-id
0x00000001     1                            request-id
0x01           start operation-attributes   operation-attributes-tag
0x47           charset type                 value-tag
0x0012                                      name-length
attributes-    attributes-charset           name
charset
0x0008                                      value-length
us-ascii       US-ASCII                     value
0x48           natural-language type        value-tag
0x001B                                      name-length
attributes-    attributes-natural-language  name
natural-
language
0x0005                                      value-length
en-us          en-US                        value
0x45           uri type                     value-tag
0x000B                                      name-length
printer-uri    printer-uri                  name
0x001A                                      value-length
http://forest  printer pinetree             value
:631/pinetree
0x45           uri type                     value-tag
0x000C                                      name-length
document-uri   document-uri                 name
0x11                                        value-length
ftp://foo.com  ftp://foo.com/foo            value
/foo
0x42           nameWithoutLanguage type     value-tag
0x0008                                      name-length
job-name       job-name                     name
0x0006                                      value-length
foobar         foobar                       value
0x02           start job-attributes         job-attributes-tag
0x21           integer type                 value-tag
0x0006                                      name-length
copies         copies                       name
0x0004                                      value-length
0x00000001     1                            value
0x03           end-of-attributes            end-of-attributes-tag

9.6 Create-Job Request ๐Ÿงš

next up is a Create-Job request with no parameters and no attributes, so it's basically the minimalist era โœจ it still needs the version, the operation, the request-id, and the operation-attributes group with the charset, language, and printer-uri, then it ends ๐Ÿซถ

Octets         Symbolic Value              Protocol field
0x0100         1.0                         version-number
0x0005         Create-Job                  operation-id
0x00000001     1                           request-id
0x01           start operation-attributes  operation-attributes-tag
0x47           charset type                value-tag
0x0012                                     name-length

Octets         Symbolic Value              Protocol field
attributes-    attributes-charset          name
charset
0x0008                                     value-length
us-ascii       US-ASCII                    value
0x48           natural-language type       value-tag
0x001B                                     name-length
attributes-    attributes-natural-language name
natural-
language
0x0005                                     value-length
en-us          en-US                       value
0x45           uri type                    value-tag
0x000B                                     name-length
printer-uri    printer-uri                 name
0x001A                                     value-length
http://forest: printer pinetree            value
631/pinetree
0x03           end-of-attributes           end-of-attributes-tag

9.7 Get-Jobs Request ๐Ÿ’œ

this is a Get-Jobs request with parameters but no attributes ๐Ÿ’€ (lowkey the name is doing a lot here) it asks for a limit of 50 and a requested-attributes list with job-id, job-name, and document-format, so the printer knows exactly what to send back ๐Ÿ“

Octets           Symbolic Value               Protocol field

0x0100           1.0                          version-number
0x000A           Get-Jobs                     operation-id
0x00000123       0x123                        request-id
0x01             start operation-attributes   operation-attributes-tag
0x47             charset type                 value-tag
Octets           Symbolic Value               Protocol field

0x0012                                        name-length
attributes-      attributes-charset           name
charset
0x0008                                        value-length
us-ascii         US-ASCII                     value
0x48             natural-language type        value-tag
0x001B                                        name-length
attributes-      attributes-natural-language  name
natural-
language
0x0005                                        value-length
en-us            en-US                        value
0x45             uri type                     value-tag
0x000B                                        name-length
printer-uri      printer-uri                  name
0x001A                                        value-length
http://forest:6  printer pinetree             value
31/pinetree
0x21             integer type                 value-tag
0x0005                                        name-length
limit            limit                        name
0x0004                                        value-length
0x00000032       50                           value
0x44             keyword type                 value-tag
0x0014                                        name-length
requested-       requested-attributes         name
attributes
0x0006                                        value-length
job-id           job-id                       value
0x44             keyword type                 value-tag
0x0000           additional value             name-length
0x0008                                        value-length
job-name         job-name                     value
0x44             keyword type                 value-tag
0x0000           additional value             name-length
0x000F                                        value-length
document-format  document-format              value
0x03             end-of-attributes            end-of-attributes-tag

9.8 Get-Jobs Response ๐ŸŽ€

and here's the response to that last request ๐ŸŒˆ the printer sends back three jobs, but it keeps the second one's details to itself (for security reasons ๐Ÿ™ˆ), so you'll only see info on the first and third. the status is successful-ok and the request-id gets echoed back, which is so iconic of it ๐Ÿ‘‘

Octets           Symbolic Value                Protocol field

0x0100           1.0                           version-number
0x0000           successful-ok                 status-code
0x00000123       0x123                         request-id (echoed
                                               back)
0x01             start operation-attributes    operation-attribute-tag
0x47             charset type                  value-tag
0x0012                                         name-length
attributes-      attributes-charset            name
charset
0x000A                                         value-length
ISO-8859-1       ISO-8859-1                    value
0x48             natural-language type         value-tag
0x001B                                         name-length
attributes-      attributes-natural-language   name
natural-
language
0x0005                                         value-length
en-us            en-US                         value
0x41             textWithoutLanguage type      value-tag
0x000E                                         name-length
status-message   status-message                name
0x000D                                         value-length
successful-ok    successful-ok                 value
0x02             start job-attributes (1st     job-attributes-tag
                 object)
0x21             integer type                  value-tag
0x0006                                         name-length
job-id           job-id                        name
0x0004                                         value-length
147              147                           value
0x36             nameWithLanguage              value-tag
0x0008                                         name-length
job-name         job-name                      name
0x000C                                         value-length
0x0005                                         sub-value-length
fr-ca            fr-CA                         value
0x0003                                         sub-value-length
fou              fou                           name
0x02             start job-attributes (2nd     job-attributes-tag
                 object)
0x02             start job-attributes (3rd     job-attributes-tag
                 object)
0x21             integer type                  value-tag
0x0006                                         name-length
job-id           job-id                        name
0x0004                                         value-length
Octets           Symbolic Value                Protocol field

148              148                           value
0x36             nameWithLanguage              value-tag
0x0008                                         name-length
job-name         job-name                      name
0x0012                                         value-length
0x0005                                         sub-value-length
de-CH            de-CH                         value
0x0009                                         sub-value-length
isch guet        isch guet                     name
0x03             end-of-attributes             end-of-attributes-tag

10. Appendix C: Registration of MIME Media Type Information for "application/ipp" ๐ŸŽ€

okay so this appendix is the paperwork bit ๐Ÿ“ It has everything IANA needs to register a MIME media type. Everything after this paragraph gets sent to IANA so they can register application/ipp, whose contents are defined in Section 3 "Encoding of the Operation Layer" in this document.

MIME type name: application

MIME subtype name: ipp

A Content-Type of "application/ipp" means an Internet Printing Protocol message body, either a request or a response ๐Ÿ–จ๏ธ Right now there's only one version, IPP/1.0. Its syntax is described in Section 3 "Encoding of the Operation Layer" of [RFC2565], and its semantics are described in [RFC2566].

Required parameters: none

Optional parameters: none

Encoding considerations:

IPP/1.0 requests and responses MAY contain long lines and ALWAYS contain binary data (for example, attribute value lengths) ๐Ÿงš

Security considerations:

IPP/1.0 requests and responses don't add any security risks that aren't already inherent in the underlying transport protocols ๐Ÿ”’ The mixed-version interworking rules in [RFC2566], and the protocol encoding rules in [RFC2565], are complete and unambiguous.

Interoperability considerations:

IPP/1.0 requests (generated by clients) and responses (generated by servers) MUST comply with all conformance requirements imposed by the normative specifications [RFC2566] and [RFC2565]. The protocol encoding rules in [RFC2565] are comprehensive, so interoperability between conforming implementations is guaranteed. Support for specific optional features is not ensured, though ๐Ÿซถ Both the "charset" and the "natural-language" of every IPP/1.0 attribute value that is a LOCALIZED-STRING are explicit within the IPP protocol requests and responses. You don't need any outside info from HTTP, SMTP, or other message transport headers to figure them out โœจ

Published specification:

[RFC2566] Isaacson, S., deBry, R., Hastings, T., Herriot, R. and P.
          Powell, "Internet Printing Protocol/1.0: Model and
          Semantics" RFC 2566, April 1999.

[RFC2565] Herriot, R., Butler, S., Moore, P., Tuner, R., "Internet
          Printing Protocol/1.0: Encoding and Transport", RFC 2565,
          April 1999.

Applications which use this media type:

IPP print clients and print servers use this type when they talk to each other over HTTP/1.1 (see [RFC2565]), SMTP/ESMTP, FTP, or some other transport protocol ๐Ÿ“ฎ Messages of type "application/ipp" are self-contained and transport-independent. That includes the "charset" and "natural-language" context for any LOCALIZED-STRING value, so the message carries its own context with it ๐Ÿ’–

Person & email address to contact for further information:

Scott A. Isaacson
Novell, Inc.
122 E 1700 S
Provo, UT 84606

Phone: 801-861-7366
Fax: 801-861-4025
Email: sisaacson@novell.com

or

Robert Herriot (Editor)
Xerox Corporation
3400 Hillview Ave., Bldg #1
Palo Alto, CA 94304

Phone: 650-813-7696
Fax:  650-813-6860
EMail: rherriot@pahv.xerox.com

this part is the legal stuff, so I'm keeping the wording exactly as written ๐Ÿ™

Copyright (C) The Internet Society (1999). All Rights Reserved.

This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this paragraph are included on all such copies and derivative works. However, this document itself may not be modified in any way, such as by removing the copyright notice or references to the Internet Society or other Internet organizations, except as needed for the purpose of developing Internet standards in which case the procedures for copyrights defined in the Internet Standards process must be followed, or as required to translate it into languages other than English.

The limited permissions granted above are perpetual and will not be revoked by the Internet Society or its successors or assigns.

This document and the information contained herein is provided on an "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. ๐Ÿฆ‹

๐Ÿ“ฆ where this page comes from