Trailer encapsulation: Trailer encapsulations
Putting variable-length protocol headers after the data so a receiver can keep the data page-aligned and avoid copying it.
Leffler, S. and M.J. Karels, "Trailer encapsulations", RFC 893, DOI 10.17487/RFC0893, April 1984, <https://www.rfc-editor.org/info/rfc893>.
@misc{rfc893,
series = {Request for Comments},
number = 893,
howpublished = {RFC 893},
publisher = {RFC Editor},
doi = {10.17487/RFC0893},
url = {https://www.rfc-editor.org/info/rfc893},
author = {S. Leffler and M.J. Karels},
title = {{Trailer encapsulations}},
pagetotal = 6,
year = 1984,
month = apr,
} RFC text
Contents
Network Working Group Samuel J. Leffler
Request for Comments: 893 Michael J. Karels
University of California at Berkeley
April 1984
Trailer Encapsulations
Status of this Memo
This RFC discusses the motivation for use of "trailer encapsulations"
on local-area networks and describes the implementation of such an
encapsulation on various media. This document is for information
only. This is NOT an official protocol for the ARPA Internet
community.
Introduction
A trailer encapsulation is a link level packet format employed by
4.2BSD UNIX (among others). A trailer encapsulation, or "trailer",
may be generated by a system under certain conditions in an effort to
minimize the number and size of memory-to-memory copy operations
performed by a receiving host when processing a data packet.
Trailers are strictly a link level packet format and are not visible
(when properly implemented) in any higher level protocol processing.
This note cites the motivation behind the trailer encapsulation and
describes the trailer encapsulation packet formats currently in use
on 3 Mb/s Experimental Ethernet, 10 Mb/s Ethernet, and 10 Mb/s V2LNI
ring networks [1].
The use of a trailer encapsulation was suggested by Greg Chesson, and
the encapsulation described here was designed by Bill Joy.
Motivation
Trailers are motivated by the overhead which may be incurred during
protocol processing when one or more memory to memory copies must be
performed. Copying can be required at many levels of processing,
from moving data between the network medium and the host's memory, to
passing data between the operating system and user address spaces.
An optimal network implementation would expect to incur zero copy
operations between delivery of a data packet into host memory and
presentation of the appropriate data to the receiving process. While
many packets may not be processed without some copying operations,
when the host computer provides suitable memory management support it
may often be possible to avoid copying simply by manipulating the
appropriate virtual memory hardware.
In a page mapped virtual memory environment, two prerequisites are
usually required to achieve the goal of zero copy operations during
packet processing. Data destined for a receiving agent must be
aligned on a page boundary and must have a size which is a multiple
of the hardware page size (or filled to a page boundary). The latter
restriction assumes virtual memory protection is maintained at the
page level; different architectures may alter these prerequisites.
Data to be transmitted across a network may easily be segmented in
the appropriate size, but unless the encapsulating protocol header
information is fixed in size, alignment to a page boundary is
virtually impossible. Protocol header information may vary in size
due to the use of multiple protocols (each with a different header),
or it may vary in size by agreement (for example, when optional
information is included in the header). To insure page alignment the
header information which prefixes data destined for the receiver must
be reduced to a fixed size; this is normally the case at the link
level of a network. By taking all (possibly) variable length header
information and moving it after the data segment a sending host may
"do its best" in allowing the receiving host the opportunity to
receive data on a page aligned boundary. This rearrangement of data
at the link level to force variable length header information to
"trail" the data is the substance of the trailer encapsulation.
There are several implicit assumptions in the above argument.
1. The receiving host must be willing to accept trailers. As this
is a link level encapsulation, unless a host to host negotiation
is performed (preferably at the link level to avoid violating
layering principles), only certain hosts will be able to converse,
or their communication may be significantly impaired if trailer
packets are mixed with non-trailer packets.
2. The cost of receiving data on a page aligned boundary should be
comparable to receiving data on a non-page aligned boundary. If
the overhead of insuring proper alignment is too high, the savings
in avoiding copy operations may not be cost effective.
3. The size of the variable length header information should be
significantly less than that of the data segment being
transmitted. It is possible to move trailing information without
physically copying it, but often implementation constraints and
the characteristics of the underlying network hardware preclude
merely remapping the header(s).
4. The memory to memory copying overhead which is expected to be
performed by the receiver must be significant enough to warrant
the added complexity in the both the sending and receiving host
software.
The first point is well known and the motivation for this note.
Thought has been given to negotiating the user of trailers on a per
host basis using a variant of the Address Resolution Protocol [2]
(actually augmenting the protocol), but at present all systems using
trailers require hosts sharing a network medium to uniformly accept
trailers or never transmit them. (The latter is easily carried out
at boot time in 4.2BSD without modifying the operating system source
code.)
The second point is (to our knowledge) insignificant. While a host
may not be able to take advantage of the alignment and size
properties of a trailer packet, it should nonetheless never hamper
it.
Regarding the third point, let us assume the trailing header
information is copied and not remapped, and consider the header
overhead in the TCP/IP protocols as a representative example [3]. If
we assume both the TCP and IP protocol headers are part of the
variable length header information, then the smallest trailer packet
(generated by a VAX) would have 512 bytes of data and 40+ bytes of
header information (plus the trailer header described later). While
the trailing header could have IP and/or TCP options included this
would normally be rare (one would expect most TCP options, for
example, to be included in the initial connection setup exchange) and
certainly much smaller than 512 bytes. If the data segment is
larger, the ratio decreases and the expected gain due to fewer copies
on the receiving end increases. Given the relative overheads of a
memory to memory copy operation and that of a page map manipulation
(including translation buffer invalidation), the advantage is
obvious.
The fourth issue, we believe, is actually a non-issue. In our
implementation the additional code required to support the trailer
encapsulation amounts to about a dozen lines of code in each link
level "network interface driver". The resulting performance
improvement more than warrants this minor investment in software.
It should be recognized that modifying the network (and normal link)
level format of a packet in the manner described forces the receiving
host to buffer the entire packet before processing. Clever
implementations may parse protocol headers as the packet arrives to
find out the actual size (or network level packet type) of an
incoming message. This allows these implementations to avoid
preallocating maximum sized buffers to incoming packets which it can
recognize as unacceptable. Implementations which parses the network
level format on the fly are violating layering principles which have
been extolled in design for some time (but often violated in
implementation). The problem of postponing link level type
recognition is a valid criticism. In the case of network hardware
which supports DMA, however, the entire packet is always received
before processing begins.
Trailer Encapsulation Packet Formats
In this section we describe the link level packet formats used on the
3 Mb/s Experimental Ethernet, and 10 Mb/s Ethernet networks as well
as the 10 Mb/s V2LNI ring network. The formats used in each case
differ only in the format and type field values used in each of the
local area network headers.
The format of a trailer packet is shown in the following diagram.
+----+-------------------------------------------------+----+
| LH | data | TH |
+----+-------------------------------------------------+----+
^ ( ^ ) ^
LH:
The fixed-size local network header. For 10 a Mb/s Ethernet,
the 16-byte Ethernet header. The type field in the header
indicates that both the packet type (trailer) and the length of
the data segment.
For the 10 Mb/s Ethernet, the types are between 1001 and 1010
hexadecimal (4096 and 4112 decimal). The type is calculated as
1000 (hex) plus the number of 512-byte pages of data. A
maximum of 16 pages of data may be transmitted in a single
trailer packet (8192 bytes).
data:
The "data" portion of the packet. This is normally only data
to be delivered to the receiving processes (i.e. it contains no
TCP or IP header information). Data size is always a multiple
of 512 bytes.
TH:
The "trailer". This is actually a composition of the original
protocol headers and a fixed size trailer prefix which defines
the type and size
of the trailing data. The format of a trailer is shown below.
The carats (^) indicate the page boundaries on which the receiving
host would place its input buffer for optimal alignment when
receiving a trailer packet. The link level receiving routine is able
to locate the trailer using the size indicated in the link level
header's type field. The receiving routine is expected to discard
the link level header and trailer prefix, and remap the trailing data
segment to the front of the packet to regenerate the original network
level packet format.
Trailer Format
+----------------+----------------+------~...~----------+
| TYPE | HEADER LENGTH | ORIGINAL HEADER(S) |
+----------------+----------------+------~...~----------+
Type: 16 bits
The type field encodes the original link level type of the
transmitted packet. This is the value which would normally be
placed in the link level header if a trailer were not generated.
Header length: 16 bits
The header length field of the trailer data segment. This
specifies the length in bytes of the following header data.
Original headers: <variable length>
The header information which logically belongs before the data
segment. This is normally the network and transport level
protocol headers.
Summary
A link level encapsulation which promotes alignment properties
necessary for the efficient use of virtual memory hardware facilities
has been described. This encapsulation format is in use on many
systems and is a standard facility in 4.2BSD UNIX. The encapsulation
provides an efficient mechanism by which cooperating hosts on a local
network may obtain significant performance improvements. The use of
this encapsulation technique currently requires uniform cooperation
from all hosts on a network; hopefully a per host negotiation
mechanism may be added to allow consenting hosts to utilize the
encapsulation in a non-uniform environment.
References
[1] "The Ethernet - A Local Area Network", Version 1.0, Digital
Equipment Corporation, Intel Corporation, Xerox Corporation,
September 1980.
[2] Plummer, David C., "An Ethernet Address Resolution Protocol",
RFC-826, Symbolics Cambridge Research Center, November 1982.
[3] Postel, J., "Internet Protocol", RFC-791, USC/Information
Sciences Institute, September 1981.
AI ELI5
On this page
§1What a Trailer Encapsulation Is
A trailer encapsulation is a link-level packet format used by 4.2BSD UNIX, among others. A system may generate one under certain conditions to reduce the number and size of memory-to-memory copy operations that the receiving host performs on a data packet.
Trailers are strictly a link-level format and, when properly implemented, are not visible to higher-level protocol processing. The note describes the formats used on 3 Mb/s Experimental Ethernet, 10 Mb/s Ethernet and 10 Mb/s V2LNI ring networks. The idea was suggested by Greg Chesson and the encapsulation was designed by Bill Joy. The RFC is for information only.
It is a different way to pack a parcel at the network level: the address stuff goes on the back, so the receiver can grab the contents faster.
§2Why Trailers: Avoiding Copies
An optimal network implementation would do zero copies between a packet arriving in host memory and the data reaching the receiving process. With virtual memory support this can often be done by manipulating the memory hardware instead of copying. In a page-mapped system, the data must be aligned on a page boundary and have a size that is a multiple of the hardware page size.
That is hard when protocol headers vary in size, for example because of different protocols or optional header information. So the trailer scheme takes all possibly variable-length header information and moves it after the data segment, leaving a fixed-size link-level header in front. The sender thereby does its best to let the receiver get page-aligned data.
If the labels on the front are different sizes, the contents start at a different spot each time. Moving the labels to the back keeps the contents in the same place.
§3Assumptions and Trade-offs
The RFC lists four assumptions behind the argument. The receiver must be willing to accept trailers; the cost of receiving page-aligned data should be comparable to non-aligned data; the variable-length header should be much smaller than the data; and the copying saved must be large enough to justify the extra software complexity.
The first is the weak point. Because trailers are a link-level format, hosts sharing a medium must all accept trailers or never send them. Negotiation per host, perhaps by augmenting the Address Resolution Protocol (RFC 826), was considered but not adopted. The authors say 4.2BSD can switch trailers off at boot time without modifying the operating system source.
For TCP/IP (RFC 791 for IP), the smallest trailer packet generated by a VAX has 512 bytes of data and 40 or more bytes of headers. The authors say supporting trailers took about a dozen lines of code in each network interface driver. They also admit a valid criticism: the receiver must buffer the whole packet before it can recognise the network-level type.
It only works if both sides agree to do it this way. The authors thought the small extra work was worth it.
§4The Trailer Packet Layout
A trailer packet has three parts: the fixed-size local network header (LH), the data, and the trailer (TH). The formats on the three networks differ only in the header format and the type field values.
On 10 Mb/s Ethernet the type field in LH shows both that the packet is a trailer packet and how long the data is. The types run from 1001 to 1010 hexadecimal (4096 to 4112 decimal): the type is 1000 hex plus the number of 512-byte pages of data. A single trailer packet carries at most 16 pages, or 8192 bytes. The data is normally only user data, with no TCP or IP headers, and its size is always a multiple of 512 bytes.
The receiver locates the trailer using the size in the type field, discards the link-level header and trailer prefix, and remaps the trailing data to the front to rebuild the original network-level packet.
The front label says how many 512-byte chunks of data are inside, so the receiver knows where the back label begins.
§5The Trailer Itself
The trailer holds the original protocol headers behind a fixed-size prefix that records the type and size of the trailing data. It has three fields:
- Type (16 bits): the original link-level type that would have been in the header had no trailer been used.
- Header length (16 bits): the length in bytes of the header data that follows.
- Original headers (variable): the header information that logically belongs before the data, normally network and transport level headers.
The back label says what kind of package it really is, how long the address part is, and then holds the address part itself.
| Field | Name | Size | Value | Description |
|---|---|---|---|---|
TYPE | Type | 2 bytes | Original link-level type of the packet. | |
HEADER-LENGTH | Header length | 2 bytes | Length in bytes of the header data that follows. |