<?xml version="1.0" encoding="us-ascii"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 2.6.10) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

<!ENTITY RFC7159 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7159.xml">
<!ENTITY RFC0377 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.0377.xml">
<!ENTITY RFC1014 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1014.xml">
<!ENTITY RFC1094 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1094.xml">
<!ENTITY RFC1832 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1832.xml">
<!ENTITY RFC3530 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3530.xml">
<!ENTITY RFC4506 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4506.xml">
<!ENTITY RFC4627 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4627.xml">
<!ENTITY RFC7464 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7464.xml">
<!ENTITY RFC7530 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7530.xml">
<!ENTITY RFC8259 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8259.xml">
<!ENTITY SELF "[RFCXXXX]">
]>


<rfc ipr="trust200902" docName="draft-partridge-xdr-00" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title>Designing an Intermediate Data Format</title>

    <author initials="C." surname="Partridge" fullname="Craig Partridge">
      <organization>Colorado State University</organization>
      <address>
        <postal>
          <street>Department of Computer Science</street>
          <city>Fort Collins, Colorado</city>
          <code>80528</code>
          <country>USA</country>
        </postal>
        <email>craig.partridge@colostate.edu</email>
      </address>
    </author>
    <author initials="T." surname="O'Leary" fullname="Tyson O'Leary">
      <organization>Colorado State University</organization>
      <address>
        <postal>
          <street>Department of Computer Science</street>
          <city>Fort Collins, Colorado</city>
          <code>80528</code>
          <country>USA</country>
        </postal>
        <email>tyson.oleary@colostate.edu</email>
      </address>
    </author>

    <date year="2025" month="August" day="05"/>

    <area>Applications</area>
    <workgroup>none</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 178?>

<t>Intermediate data formats (IDFs), also known as external data formats or
data-interchange formats, are used to exchange data between networked
applications.  Example formats are JavaScript Object Notation (JSON) and
Abstract Syntax Notation One (ASN.1).  IDFs are ubiquitous in
networking.</t>

<t>Despite their importance, there&#39;s remarkably little written guidance about how
to actually design or architect an IDF.  This guidance gap exists despite
fifty years of experience designing and deploying IDFs,
going back to the days of ARPANET.
As a result, even recently developed IDFs have obvious
flaws that could have been avoided.</t>

<t>The purpose of this memo is to provide basic basic guidance about how
to design an IDF.
This memo is NOT the product of any IETF or IRTF working group.</t>



    </abstract>



  </front>

  <middle>


<?line 198?>

<section anchor="terminology"><name>Terminology</name>

<t>The terms &quot;byte&quot; and &quot;octet&quot; are use interchangeably in this document to
refer to 8-bit quantities.</t>

<t>Big- and little-endian are used as defined in <xref target="IEN137"/>.</t>

</section>
<section anchor="problems"><name>Introduction</name>

<t>Intermediate Data Formats (IDF) solve a critical problem in networking,
namely how to transmit data units in a mutually
intelligible manner between two networked applications that may be on different
hardware platforms and have been implemented in different programming
languages.  The first external
data formats were developed in the 1970s and they have been an integral
part of data networking ever since.  In the old OSI network stack, they
were considered the core of the presentation layer. In the modern network
stack they are considered part of the application layer.</t>

<t>Despite their importance in the network stack, not much has been written about
how to design an IDF.  Indeed, the most recent paper seems to be over 30 years
old <xref target="PartridgeRose"/>.  The motivation for this memo is to provide updated, albeit unofficial, guidance.
This memo is NOT the product of any IETF or IRTF working group.</t>

<t>To illustrate the role of IDFs, consider the following example.  Suppose
you wished to exchange points on a map, aka objects containing integers for the X and Y coordinates, between two applications over the Internet.
The sending application is written in Python and resides on
a big-endian computer and the receiving application
is written in C and resides on a little-endian computer.
The Python application represents the X,Y
coordinates as a class that incorporates two named integer attributes, &quot;X&quot;
and &quot;Y&quot;, of arbitrary size (Python integers can be arbitrarily large).
The receiving computer probably represents the
point as a C structure of two 32-bit integers (in little-endian format).
Naively, if the Python application sought to send an instance of its
class, it would presumably send two key:value pairs representing attributes
X and Y, where the integers were in big-endian format. The receiving
application, written in C, would likely expect data in its native format
(so 8 bytes of binary data representing two integers in little-endian form)
and view the Python output as inscrutable data.</t>

<t>IDFs solve this problem by having the sending application convert
the data (in this case the X, Y coordinates) into a standard
representation that is transmitted over the network.  The network
representation is then transmitted
over the network to the receiving application, which converts from the
network representation to the receiving application&#39;s local representation.</t>

<t>Conceptually this is all the typical programmer needs to know about IDFs.
When sending, put local data into an IDF format before sending and when
receiving, extract from the IDF format into the local form.</t>

<t>But for protocol designers and more specifically, designers who need to
create a custom IDF, a number of challenging issues
reside under this conceptual simplicity.
Indeed, one of the motivations for this memo is that one of the
authors found himself reviewing multiple documents where the authors had
concluded they needed a custom IDF and then demonstrated they did not
understand how to design one.</t>

<t>The remainder of this memo is devoted to walking through the
issues in designing an IDF and concludes with guidance to the IDF designer.</t>

</section>
<section anchor="brief-idf-examples"><name>Brief IDF Examples</name>
<t>Before discussing the various issues, it is useful to sketch key features of
some widely used IDFs.  The purpose dual is (1) to give the reader a sense of
the different styles of IDFs; and (2) describe the IDFs in enough detail
that they can be used as examples; while deferring actual issues to later in
this memo.</t>

<section anchor="xdr"><name>XDR</name>
<t>The eXternal Data Representation (XDR) was developed by Sun Microsystems in the 1980s to support applications, such as the Network File System, which were
built on a remote procedure call API <xref target="RFC1014"/><xref target="RFC1832"/><xref target="RFC4506"/>
<xref target="RFC1094"/><xref target="RFC3530"/><xref target="RFC7530"/>.</t>

<t>Heavily influenced by the earlier
Courier <xref target="Courier"/> intermediate format, XDR is a binary IDF; the data is
sent over the network in a binary (non-text) format. XDR supports
a range of data types including application-defined structures.  Novel
application data types
are sent as opaque binary blobs.</t>

<t>XDR&#39;s philosophy (reasonable for remote procedure call) was that the
receiving application knows what data types
it should receive. Accordingly, XDR typically sends only the binary
representation of the data, with a length field, when required
(e.g. for strings), and without any typing information.</t>

</section>
<section anchor="asn1"><name>ASN.1</name>
<t>Abstract Syntax Notation One (ASN.1) was developed by a team working on
OSI email standards.  Unlike XDR, they had to assume the receiving email
application could receive previously unknown data types (e.g. in
attachments from new applications) and had to be able to at least parse, and perhaps display,
the new data types. (Similar design needs led OSI and Internet network
management protocols to adopt
ASN.1).  ASN.1 also placed a premium on keeping the encodings
small, out of concerns that a large encoding would harm transmission times
(this was a time when email was often sent over 4Kbps links) and affect
email storage (again, a time when disks were small, with capacities measured
in megabytes) <xref target="ASN1-design"/><xref target="ASN1-std"/>.</t>

<t>ASN.1 is a binary IDF in which all information is sent as
&lt;type, length, value&gt; triples.  There are globally-defined type values
and application-defined type values.  Triples may be nested (e.g.
for data structures), so the value field may itself contain triples.
Type, length, and value are each encoded to use the minimum number of bytes.</t>

</section>
<section anchor="json"><name>JSON</name>
<t>JavaScript Object Notation (JSON) was developed to support
communication with web-browsers.  It is a text-based protocol
that subsets the JavaScript language <xref target="RFC4627"/><xref target="RFC8259"/></t>

<t>JSON supports a small set of data types along with two structured types: objects
of key:value pairs, and lists.  Novel application types typically get mapped to
objects.</t>

<t>JSON transmits no explicit type or length information.  Both are implicit in the text
representation.  So, for instance, &quot;IETF&quot; is a string of length 4.</t>

<t>JSON was designed to transmit finite objects and did not contemplate sending
streams of objects (i.e. a TCP socket on which objects are sent as needed),
with the result that there are multiple JSON streaming
standards <xref target="RFC7464"/>.</t>

</section>
<section anchor="protobufs"><name>protobufs</name>
<t>Protocol Buffers (protobufs) were developed by Google as an internal IDF
for language-agnostic serialization. They were later released open
source in version 2 alongside other open source Google projects
that depended on them.</t>

<t>Protobufs were designed to be similar to JSON or XML in that they
support hierarchical structures for organizing data, essentially
key-value maps like JSON objects. Also similar to JSON, new datatypes
not included with protobufs are mapped to objects (messages).
The major difference is that protobufs use a binary format on-the-wire
that is certainly not human-readable, but is often more efficient.</t>

<t>Protobufs do not transmit type information. However, types are explicit
in its custom language for defining the structure of the data. It can
be viewed as a more rigorous version of XDR.
Once the structure is defined, a compiler generates code in
the user&#39;s desired language for serialization and deserialization. This
process allows data definitions to be defined in one place even in
multilingual projects. The generated code provides a convenient interface
that, with the definition language, seeks to mitigate the readability problem
of the binary format for the programmer. The serialized data, however,
is definitely not human readable. Another common drawback is protobufs lack
of support for multi-dimensional arrays.</t>

<t>Protobufs support both finite and streaming transmission.</t>

</section>
</section>
<section anchor="goals"><name>Design Goals</name>
<t>The central challenge for the designer of an IDF is that there are multiple
possible design goals and those goals are, in varying degree, in conflict.
In this section, we step through the typical list of goals and some of the
issues within each goal.  We
discuss the tensions between the goals in <xref target="trades"/>.</t>

<section anchor="processing"><name>Processing costs</name>
<t>Programmers, quite reasonably, want their clients and servers
to focus their computations on delivering the application service
they implement, and NOT spending inordinate amounts of time converting
into and out of intermediate formats.  As a result, IDF designers often
seek to make the computational cost of converting into and out of their
intermediate form low.</t>

<t>In the 1990s, there was a substantial debate about whether binary or
text representations were inherently computationally less demanding.
While no definitive resolution was reached, most participants appear
to have concluded that either representation can be architected to be
computationally efficient.  (Likely contributing to this conclusion
was the realization that it was possible to build fast lexical
analyzers for well-defined text formats).</t>

<t>That said, there continues to be a naive belief that a binary format should
be more computationally efficient.  There are two counter arguments. First,
lexical analyzers can be extremely fast (see <xref target="Flex"/>).  Second, Abstract
Syntax Notation One (ASN.1), a binary format <xref target="ASN1-std"/>, is generally
viewed as the most computationally demanding IDF in widespread use.</t>

</section>
<section anchor="size"><name>Representation size</name>
<t>Particularly when transmitting large data objects, such as an array of
a million integers, the time to transfer the data depends, in large part, on
how big the intermediate data representation is.  This observation leads to
pressure to make the intermediate representation concise.  Unfortunately,
it is often unclear what the most concise representation is.</t>

<t>Consider the problems of transmitting integers.</t>

<t>When transmitting integers, it may seem obvious that a binary representation is more efficient. For instance, transmitting a 32-bit integer in binary
requires only
4 octets, but may require up to 10 UTF-8 characters (or 13 characters
if you
include commas, e.g. 4,294,967,295). More generally, transmitting text
representations of integers uses only 10 possible values in each octet, while
a binary value uses every bit in each octet.</t>

<t>Except... In a large number of cases, the typical integer will be small.  Zero
is often the most common value transmitted and requires just a single octet
of text.  An array of a million zeros, with a space between each zero character, is 2MB.  The same array sent as binary integers is twice as big.
So binary versus text for concise representation of integers
depends very much upon the data being sent.</t>

<t>The issue of representation size has become less important as network
bandwidths have increased.  On a 10Mbps Ethernet, which was the network
for which many early IDFs were designed, sending an extra 10MB of data
took an extra 9 seconds.  On today&#39;s gigabit networks, that 10MB is
roughly an extra 80 milliseconds, which in many cases (though not all)
is negligible for the application.</t>

</section>
<section anchor="generality-and-extensibility"><name>Generality and Extensibility</name>
<t>These are two tightly intertwined goals.  The essential issues are (1) how
broad a range of data objects does the the IDF&#39;s core intermediate
representation handle? and (2) how easy or painful is it for a programmer (or
protocol designer) to extend the core representation to support additional
data types?</t>

<t>Supporting a small set of data objects in the IDF&#39;s core representation tends
to simplify the IDF&#39;s implementation, so there is some instinct to keep
the list small.  For instance, JSON <xref target="RFC7159"/> supports only 
floating point numbers, arrays, objects, strings and a small set of constants.
XDR <xref target="RFC1014"/>, which is more typical in the range of data objects, supports 32-bit integers, unsigned 32-bit integers,
64-bit integers, unsigned 64-bit integers, floating point numbers, double
precision floating point numbers, fixed and variable length opaque data,
strings, fixed and variable length arrays, structures, unions, and voids.</t>

<t>Any data type or value not in the core representation
must be transmitted as an application-defined extension.  Extensions require
programmers to develop their own standards for encoding and decoding the
newly defined types.  Different IDFs make supporting extensions easier or
harder.  Using JSON and XDR as the examples illustrates some issues.</t>

<t>JSON makes adding extensions easy: they are sent as JSON objects, which are
simply collections of key:value pairs, where the value itself may be
another JSON object.  Converting into and out of key:value
pairs is typically straightforward in any computing language. Thus, in
general, JSON can support a small set of core types because it is easy to
extend.</t>

<t>In contrast, XDR makes extensions painful.  They are sent as opaque
binary blobs of data, which forces the programmer to develop custom
binary conversion routines, which is painful in some programming languages.
As a result, XDR supports a wider range of core types including
structured data types, in the hopes custom extensions will be rare.</t>

<t>The JSON example highlights that, done right, a small set of core
data types can work well.  It turns out JSON also illustrates a hazard of
going small, namely leaving out an essential core value.  JSON does not support
the floating point constants Not-A-Number (NaN) and Infinity (Inf), which means if either
value is possible, one needs to define a custom object.  That&#39;s a glaring
omission, especially as NaN is often used in sensing applications to
indicate a missing value.</t>

</section>
<section anchor="read"><name>Readability</name>
<t>One of the driving concerns for those who argued for text IDFs in the 1990s was
the desire to make it easy to debug their protocols.  Reading text data
as it is sent in packets over the network is much easier than reading binary
data.</t>

<t>Over time, we have come to realize the issue of readability has two parts.
The first is whether the data stream be easily parsed by a human reader.
The second is whether the semantics of the data stream can be inferred.
Put more bluntly, can you (1) tell that the value 10 was transmitted? and (2)
do you know what a 10 in specific position in the data stream means?</t>

<t>Parsing is the easier problem of the two. Both text and binary representations
can indicate the type of the data.  As discussed in <xref target="types"/>, in text it is
usually implicit, while in binary representations it may be explicit (ASN.1)
or implicit (protobufs, XDR).</t>

<t>Semantics are tougher. Type fields or key:value representations can help,
but work better in text than binary.  For instance, &quot;voltage:10&quot;, is easy to
understand, while &lt;application type=47&gt;&lt;integer 10&gt; (which is what an
ASN.1 parser might display) leaves the reader wondering what application type
47 encodes.  We visit this subject a bit more in Section <xref target="types"/> below.</t>

</section>
</section>
<section anchor="fundamental-design-rule-the-mxn-rule"><name>Fundamental Design Rule: the MxN Rule</name>
<t>There is one fundamental design rule for IDFs that no designer should flout.</t>

<t>The MxN (&quot;M by N&quot;) rule was first articulated by Padlipsky <xref target="Padlipsky"/>.
Padlipsky sought to explain why the Network Virtual Terminal (NVT), developed in
the early 1970s <xref target="RFC0377"/> and arguably the first IDF, was so successful.</t>

<t>The problem that the NVT solved was of connecting M different terminal
types, via the Telnet protocol, to N hosts running different operating
systems.  Padlipsky
observed that one wanted to avoid a protocol design in which adding a new,
an M+1, terminal type forced all N existing hosts to be upgraded to support.
The NVT solved this problem by providing a standard external terminal
representation. Adding the new terminal type only required that
software be written, solely on the new terminal&#39;s host, to map 
the new terminal type to the NVT representation.  Once the terminal type to
NVT mapping was created, the terminal could connect to any of the existing
N hosts.</t>

<t>One can see the MxN rule as a cautionary insight that a poorly designed
protocol can undo Metcalfe&#39;s law.  Metcalfe&#39;s Law observes that adding a new
resource to the network makes all existing hosts on the network more
valuable, because they benefit from the new resource.  (Indeed, Metcalfe&#39;s
Law states the value of the network grows as the square of the number of
users or resources on the network).  Padlipsky&#39;s MxN rules points out that
if an existing hosts must be upgraded before the benefit of the new
resource is realized, the benefit is sharply reduced.</t>

<t>The MxN rule has important implications for IDF design.</t>

<t><list style="symbols">
  <t>First, the concept that &quot;the receiver makes it right&quot; is busted. The idea of
&quot;receiver makes it right&quot; appeared early in the development of IDFs, most
notably in the Network Data Representation <xref target="NDR"/>, though elements of
the concept linger in protobufs. The
concept was that the sender would send (in binary) using its hardware&#39;s
native data representation along with tags describing the data format and
the receiver would then translate from the sender&#39;s format into the receiver&#39;s
format. As observed in <xref target="PartridgeRose"/> it requires N sets of decoding rules
in the receivers, and when a new hardware configuration arises
(as it inevitably does), all receivers will need to implement an N+1 set
of rules.  (<xref target="PartridgeRose"/> notes that enabling a negotiation between two
systems to see if their binary data formats are identical would work, but this
adds a round-trip time to any data exchange, which may be undesirable.)</t>
  <t>Second, the IDF has to get the core set of data types right the first time.
once an IDF is deployed, it is extremely hard to add new core data types as
this requires updating all deployed systems. This makes IDFs one of the
notable exceptions to Brooks&#39; rule to &quot;plan to throw one away&quot; <xref target="Brooks"/>.
It also tends to cause IDFs to age poorly.  A particular issue is floating
point representations.  Over time, floating point numbers have tended to get
larger.  If an IDF selects a specific floating point format as its core
floating point type (and we will suggest in <xref target="floating"/> that IDFs should
no longer
choose a particular floating point format), it is inevitable that
some years in the future, that core type will be too small.</t>
</list></t>

</section>
<section anchor="types"><name>Tags and Types</name>
<t>Every object in an IDF has a type and a meaning (semantics). The two properties
are often confused and there is no consensus about how to handle them.</t>

<t>The problem is most clearly understood from the receiver&#39;s perspective.
A stream of data is arriving and the receiver needs to interpret the data.
At minimum, the receiver needs to know the intended data type, so it can
correctly represent the data on its machine.</t>

<t>Text-based IDFs typically use implicit typing.  Thus, 10 is a decimal integer,
&quot;10&quot; is a string, and 0x10 is a hexidecimal integer.  Explicit typing
only becomes an issue for structured data, where you may wish some indication
that the object containing two integers is a point on a map and not
the velocity and mass of a wheeled vehicle.</t>

<t>In contrast binary IDFs need explicit tags to indicate types at least
some of the time.  If the application knows the structure of the binary
stream, e.g. it is a sequence of 32-bit integers, then no type tag
is required.  If, on the other hand, the application may not know what
is coming, or you want the ability to extend the stream to use either 32-bit or 64-bit integers, then some sort of tagging is
required to interpret what is otherwise a undifferentiated sequence of bytes.</t>

<t>Whether to have type tags all the time or just when needed depends on whether
the binary IDF intends to support the receipt of unexpected data. Some binary
IDFs, notably XDR, explicitly state they do not support the receipt of
unexpected data.  In contrast, for generality, ASN.1 tags everything.</t>

<t>Semantic tags are a tougher problem. To illustrate the issue, consider
an application that is receiving temperature data in the form of floating point
numbers from a suite of sensors.  Suppose the original set of sensors all
returned data in Fahrenheit, but a new set of sensors returns the data in
Celsius.  Converting to support the new sensors requires either negotiating
the temperature type when the sensor is first attached (e.g. via a TCP
connection) to the application, or reworking the IDF to insert a temperature
scale indicator such as &quot;F&quot;, &quot;C&quot; (and since you&#39;re doing it &quot;K&quot;) into the
the data stream.</t>

<t>None of the major IDFs except for ASN.1 support semantic tagging.  And ASN.1&#39;s
approach is imperfect: it uses an application specific tag.  As a result,
if our temperature sensing system uses ASN.1,
a receiving application will recognize that the temperature data is arriving
with a new tag (which is great -- there is no chance of temperatures being
misunderstood), but, until new code is written, the application will be unable
to use the data.</t>

<t>For an IDF designer, the key message is that tagging is not a special case.
Rather the decision of how to tag represents a decision about how you see
the IDF being used and its ability to extend to new uses in the future.</t>

</section>
<section anchor="trades"><name>IDF Design Tradeoffs</name>
<t>There are a few tradeoffs that any IDF designer should consider.  In this
section, we walk through those tradeoffs.</t>

<section anchor="optimizing-representation-harms-the-other-goals"><name>Optimizing representation harms the other goals</name>
<t>The biggest design challenge is trying to optimize the size of the IDF data
objects (<xref target="size"/>).  The harder you push to make the representation as small as
possible, the greater the impact on processing costs, the harder the
representation typically is to read, and there&#39;s a tendency to avoid
type values (which consume space) even when it causes generality to suffer.</t>

<t>ASN.1 is an excellent example of the challenges.  The ASN.1 designers
sought to both create a fully general IDF, in which every object has
both a type and length field, AND minimize the amount of space to represent
any object (<xref target="ASN1-design"/>).  For instance, integers are compressed to
the minimum number of
bytes to represent the value.  Type fields are minimized; when type values
exceed a byte, there is an extension bit that says the field extends
to the next byte.  The result is an IDF that is elegant in its design,
but a computational nightmare.</t>

</section>
<section anchor="core-data-types-vs-generality-vs-computation"><name>Core data types vs. generality vs. computation</name>
<t>Historically, there has been a temptation to define a relatively large
set of core data types (XDR has 18) because it reduces the pressure to support
user-defined types.  Indeed, with a large set of core types, the extension
mechanisms for user-defined types can be made simpler (e.g. XDR simply allows
for binary blobs).</t>

<t>But the larger set of core types often increases the computational costs for
handling the IDF. (Note: the increased cost is typically in the form of
the code footprint and thus cache misses.  The actual code is often
some form of switch or match dispatch based on a type field.)</t>

<t>Arguably the greatest contribution of JSON has been to solve this trilemma.
JSON has a small set of core types combined with a powerful and simple
extension mechanism. Extensions are simply sets (objects in JSON terminology)
of key:value pairs.  Sets of key:value pairs are easy to parse and easy to
map to internal data representations (sets, structures, objects, etc.).
Their only downside is that key:value pairs tend have a larger representation
footprint, and minimizing representation size by using short key names such
as &quot;xy9&quot; hurts readability.</t>

<t>Note that JSON, by using easy to read text and key:value pairs, also
goes a long way towards solving the semantics problems without a type
field (per <xref target="types"/>).</t>

</section>
</section>
<section anchor="lessons-learned"><name>Lessons Learned</name>

<section anchor="the-idf-representation-is-authoritative"><name>The IDF representation is authoritative</name>
<t>There is a tendency when creating a new networked application to view the
host data structure as authoritative.  For instance, one might say &quot;we chose
to represent the C data structure this way in JSON.&quot;</t>

<t>That&#39;s the WRONG way to think about IDF data formats.  Rather, in a networked
application, the IDF data format is the authoritative data structure and
the host/language representations are interpretations of the authoritative
definition.  Indeed, for this reason, many IDFs have carefully defined data
definition languages.</t>

<t>Protobufs gets this lesson right, with a mechanism to compile the
authoritative IDF format into encoders and decoders for a range of languages.</t>

</section>
<section anchor="floating"><name>Floating point is hard</name>
<t>Handling floating point numbers have historically been a hard problem.  There are two issues:</t>

<t><list style="symbols">
  <t>Precision. How many bits of floating point precision are represented.</t>
  <t>What to do about NaN (Not-A-Number) and Infinity.  Floating point numbers may
have non-numeric values and they are useful in a number of cases such as as an indication that an expected value is missing.</t>
</list></t>

<t>At the risk of getting in front of current consensus, we suggest the following
approach going forward:</t>

<t><list style="symbols">
  <t>Future IDFs should not specify the floating point precision (indeed,
JSON waffles towards this approach now).  The existence of high-quality
arbitrary-precision floating point libraries for most computing languages
means there is no reason to pick a particular precision.</t>
  <t>NaN and Inf must be supported.</t>
</list></t>

</section>
<section anchor="integers"><name>Integer types tend to proliferate</name>
<t>In binary IDFs, there is a tendency to create lots of integer types.
Think of the cross-product of signed and unsigned and a range of widths
from 8 bits to 128 bits.</t>

<t>ASN.1 is the exception to this insight, having defined
an arbitrarily large integer type, in which the actual integer value
is transmitted in the minimum number of bytes.  But this flexibility
comes with increased processing costs.</t>

<t>Text-based IDFs neatly skirt this problem.  The integer, of whatever
size, is transmitted as a readable string.  The only concern is
that the receiving application is unable to handle very large integers,
an increasingly unlikely issue given the proliferation of arbitrary
precision integer math packages.</t>

</section>
<section anchor="streaming"><name>Define the streaming format</name>
<t>IDFs are routinely used to implement streams of multiple data objects.
This means an IDF needs a rule that defines when one object ends and the next
starts.</t>

<t>In many IDFs this is simple.  The new object starts with the byte after the end of the prior object.  This is the approach, for instance, in ASN.1 and XDR.
In fact, this approach is so simple that a designer may fail to realize that
rule for delimiting objects is required.</t>

<t>A failure to define how objects are delimited can lead to compatibility
issues.
JSON failed to define an object delimiter, with the result that there are
multiple, incompatible, ways to stream JSON.  Furthermore, each streaming
approach has limitations <xref target="RFC7464"/>.</t>

<t>Any new IDF should define its streaming rules.</t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>
<t>IDFs sit at a critical security boundary.  The IDF code at the receiver is
parsing data received from the network.  This parsing process has frequently
been a source of over-the-network attacks, including stack overflow attacks and
SQL injection attacks.</t>

<t>That concern being acknowledged, as of the time this memo was written, there
are no accepted best practices for designing IDFs to be safer from these
styles of attacks.</t>

</section>
<section anchor="concluding-guidance"><name>Concluding Guidance</name>
<t>If you were asked tomorrow to design a next generation IDF, intended for
general use, we offer the following guidance:</t>

<t><list style="symbols">
  <t>Use a text-based format. The size difference between text and binary
representations is sufficiently application and data dependent, that it
is not a good principle for making a choice.  As a result, the benefit
of being able to read the data in transit is the greater benefit
(per <xref target="size"/> and <xref target="read"/>).  Text formats also do a better job of
conveying semantics (<xref target="types"/>).</t>
  <t>Minimize the number of types.  Define integers as of arbitrary size, to avoid the trap of many integer types (per <xref target="integers"/>).</t>
  <t>Make floating point simple.  Allow arbitrarily large floats and make sure to support NaN and Inf (per <xref target="floating"/>).</t>
  <t>Have a simple extension mechanism such as JSON&#39;s key:value object.</t>
  <t>Define the streaming format (per <xref target="streaming"/>).</t>
</list></t>

<t>This guidance still leaves considerable room for innovation.  For instance,
one might push to make the text representation concise and do things such
as (1) transmit all numbers (floats and integers) in hexidecimal (or a larger
radix) and (2) have a way to minimize key names, without substantially
compromising semantics.  Furthermore, designing a security-focused IDF
is a wide-open problem.</t>

</section>
<section anchor="acknowledgements"><name>Acknowledgements</name>

</section>
<section anchor="iana-consideration"><name>IANA Consideration</name>
<t>This document has no IANA actions.</t>

</section>


  </middle>

  <back>




    <references title='Informative References' anchor="sec-informative-references">

&RFC7159;
&RFC0377;
&RFC1014;
&RFC1094;
&RFC1832;
&RFC3530;
&RFC4506;
&RFC4627;
&RFC7464;
&RFC7530;
&RFC8259;
<reference anchor="ASN1-design" >
  <front>
    <title>Specification of a Draft Message Format Standard (BBN Report 4486)</title>
    <author initials="D." surname="Deutsch" fullname="Debbie Deutsch">
      <organization></organization>
    </author>
    <author initials="R." surname="Resnick" fullname="Robert Resnick">
      <organization></organization>
    </author>
    <author initials="J." surname="Vittal" fullname="John Vittal">
      <organization></organization>
    </author>
    <date year="1980" month="September"/>
  </front>
</reference>
<reference anchor="NDR" >
  <front>
    <title>The Network Computing Architecture and System - An Environment for Developing Distributed Applications</title>
    <author initials="T. H." surname="Dineen" fullname="Terence H. Dineen">
      <organization></organization>
    </author>
    <author initials="P. J." surname="Leach" fullname="Paul J. Leach">
      <organization></organization>
    </author>
    <author initials="N. W." surname="Mishkin" fullname="Nathaniel W. Mishkin">
      <organization></organization>
    </author>
    <author initials="J. N." surname="Pato" fullname="Joseph N. Pato">
      <organization></organization>
    </author>
    <author initials="G. L." surname="Wyant" fullname="Geoffrey L. Wyant">
      <organization></organization>
    </author>
    <date year="1987"/>
  </front>
  <seriesInfo name="USENIX Conference Proceedings" value=""/>
</reference>
<reference anchor="Brooks" >
  <front>
    <title>The Mythical Man-Month</title>
    <author initials="F." surname="Brooks" fullname="Fred Brooks">
      <organization></organization>
    </author>
    <date year="1975"/>
  </front>
  <seriesInfo name="ISBN" value="978-0201835953"/>
</reference>
<reference anchor="Flex" >
  <front>
    <title>flex and bison - Text Processing Tools</title>
    <author initials="J. R." surname="Levine" fullname="John R. Levine">
      <organization>O'Reilly Media</organization>
    </author>
    <date year="2009" month="September" day="22"/>
  </front>
  <seriesInfo name="ISBN" value="978-0596155971"/>
</reference>
<reference anchor="Courier" >
  <front>
    <title>Courier - The Remote Procedure Call Protocol (XSIS 038112)</title>
    <author initials="X." surname="Corporation" fullname="Xerox Corporation">
      <organization></organization>
    </author>
    <date year="1981" month="December"/>
  </front>
</reference>
<reference anchor="ASN1-std" >
  <front>
    <title>ITU-T X.690 (02/201) - Information technology - ASN.1 encoding rules- Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER)</title>
    <author initials="" surname="ITU-T" fullname="ITU-T">
      <organization></organization>
    </author>
    <date year="2021" month="February" day="01"/>
  </front>
</reference>
<reference anchor="Padlipsky" >
  <front>
    <title>A Perspective on the ARPANET Reference Model</title>
    <author initials="M. A." surname="Padlipsky" fullname="Mike Padlipsky">
      <organization></organization>
    </author>
    <date year="1983"/>
  </front>
  <seriesInfo name="Proceedings of IEEE INFOCOM" value=""/>
</reference>
<reference anchor="PartridgeRose" >
  <front>
    <title>A Comparison of External Data Formats</title>
    <author initials="C." surname="Partridge" fullname="Craig Partridge">
      <organization></organization>
    </author>
    <author initials="M. T." surname="Rose" fullname="Marshall T. Rose">
      <organization></organization>
    </author>
    <date year="1988"/>
  </front>
  <seriesInfo name="Proceedings IFIP Intl. Conf. on Message Handling Systems and Distributed Applications" value=""/>
</reference>
<reference anchor="IEN137" >
  <front>
    <title>IEN137 - On Holy Wars and a Plea for Peace</title>
    <author initials="D." surname="Cohen" fullname="Danny Cohen">
      <organization>USC ISI</organization>
    </author>
    <date year="1980" month="April" day="01"/>
  </front>
</reference>


    </references>




  </back>

<!-- ##markdown-source:
H4sIAOd3k2gAA8196XIjR5Lm/3iKNOpHkT0AhmTd7J6eZV0SNSpWbZFqqWd7
rS0ABIAQE5lQHkRBZWU2r7Gvt0+y/rl7REYmQHWv2f7YspkWCeQR4eHn5wfH
47FpfJO7i+yNq/2y8MUys0V2VTSuWru5t43L3tjGZu/Kam0b801mp9PK3V9k
r8vLj+NXeTm7M/NyVtg1PWNe2UUz3tiqqfx86caf59X49NTM6SkX2fnp+dPx
6Yvx6VN6Svjo7Hx8etb73dBvdWOL+d9tXhb0YVO1zhi/qfjHujk/PX15em5s
5exFdrnZ5H5mG18WtdkuL7KC7jF32wvZQuGa8RssytA1F5kvFqWpG7pzjV/m
buPof4rGmFk5p61fZG09tvXMe7PxFxn9+yabETna2mW2quwuO/aLzOZ5tnP1
SVZW2crWq2zlKkerzsZZU87kh7okGrhFrb/t1vxLhgsucDP9GC654NfM3cK2
eVPTFeF7uUkuN7ZtVmV1YTL+N9b/ZrQLuuL1JPsYiB6/kSN5XVm/PPBtWS1x
hnlZ2XmZ3TQ46B8Lf++q2je7eFl33rf/eZV8CiK65iL5ZJx9LOtmYWer7PHj
0ydPTnvfvfLT3JfNyt3RnZPsLH6pDyL2A9us6TCyckELW29aOr/sZuZdMeuW
PaPFXYAZGyw+p92P4i66i8o57fzF6dPzF8lnbdFUdO+PN5fxQ7e2Pr/IZqDR
JLLtf5vRA2tQZOLm7WGK306yD49+cLbaDeh9u6vLYu+7f5La/z8Qo8EGJmWO
9Q8oYQpWArTsC+Lr6w/Xb0kuSaSSD/XfOKsWs/Ozs5fDj56dPUs/uhq/mXjX
LMazsnL0P3ZDy/n07vXzs6cvL+TH08fPn+uPZ6dnT+KPL+OPLx6f64+Pnz4+
1R+fPD19Fn58dh6e8PzJs3Db8+7aF+d4G/18eXN9Np6zIhTWVt14s3Ezv1A9
gyOxGWuV7L2ra7t0qh1xsMXcVvPs+NWr6+yT2+Bonjx58eyEn9aT4chQzE9v
JnTobVPPVuFjYac3bjr1rv9d/85PE3pRXXjSw707P5VTR2/vfde/8/tJ9hff
NDbv3/h9uSrSL0Q1n718cTo+fQkqXb/51KPO7cpl167ZltWd8iqsyGU1W/nG
zZq2IuVZzLObXd24NR36ZZG9Le59VRbM4cQ/tL97l5cb3PfGkxT4KTH8vK/d
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

-->

</rfc>

