1974 Protocol for Network Intercommunication
1974 Protocol for Network Intercommunication
The key idea introduced is an internetwork protocol (a universal set of rules) that all networks
can use without changing their internal operation. Instead of redesigning every network, Cerf
and Kahn proposed adding a layer “on top” of existing networks to handle inter-network
communication. This would allow data to travel from one network to another seamlessly. They
also coined the term gateway for a device that links two networks and translates the data as
needed. This pioneering design laid the foundation for what we now call the Internet protocol
suite.
Cerf and Kahn describe a scenario with multiple networks (A, B, C) and gateways connecting
them. For example, Gateway M links Network A to Network B, and Gateway N links Network B
to Network [Link]. A packet from a host in Network A
destined for a host in Network C will first go to Gateway M. Gateway M takes the incoming
packet from A, wraps it with a standard internetwork header (more on that soon), and then
sends it into Network B. When that packet reaches Gateway N (connecting B to C), Gateway N
will do the same: it reformats or repackages the data for Network C and forwards it. This way,
the packet travels across multiple networks with gateways handling the transitions.
The gateway’s job is to be as simple and reliable as possible: just pass along data and perform
minimal necessary conversions. Ideally, all the networks remain unaware that a packet
originated elsewhere – the gateway makes it fit in. One big issue is that networks differ in
maximum packet size they accept. If a packet is too large for the next network, the gateway will
fragment the packet (split it into smaller pieces) to fit. We’ll discuss fragmentation shortly.
Gateways do not attempt to fix or alter the actual content of the data; they only deal with
addressing and size adjustments at the network boundaries. This design keeps each network’s
internal protocols intact and only requires the internetwork layer (at gateways and hosts) to be
standardized.
3. Process-Level Communication
While gateways handle network-to-network transfer, Cerf and Kahn also design how end
processes (programs on user computers) communicate reliably through this internetwork.
They assume we have a piece of software in each host called a Transmission Control Program
(TCP) – this is responsible for end-to-end communication between processes on different
machines. The TCP is the same on all connected networks (it’s the common “language” the hosts
speak over the internetwork). This section explains how TCP on the sending side breaks down
messages and how TCP on the receiving side reassembles them, handles addressing, and ensures
nothing is lost or duplicated. It essentially establishes a process-to-process link over the series
of networks.
Full-duplex communication: The authors assume processes want to communicate in both
directions simultaneously (full duplex), sending potentially very long messages (even
conceptually infinite streams of data). The TCP in each host must allow this by managing data as
a stream and chopping it into packets. They also introduce the idea of a message (a complete unit
of data a process wants to send) which might be very large, and a segment (a smaller chunk of
that message that can fit into a packet for transmission).
Let’s break down the tasks and design decisions for process-level communication:
For data to travel between any two hosts in any network, we need a uniform way to identify each
destination. Each individual network has its own local addressing for its hosts, but the
internetwork protocol requires a global addressing scheme that is understood universally (by all
gateways and hosts running TCP). Cerf and Kahn propose that every host in the connected
“internet” gets a unique address composed of two parts: a Network ID (which network it’s
on) and a Host ID (which specific host machine on that network). In the paper, they suggest
using an 8-bit Network ID and a 16-bit Host [Link]. This would allow up to 256
different networks and up to 65,536 hosts in each network – numbers they felt were far more
than enough at the time.
On top of host addresses, the protocol also needs to distinguish between multiple programs or
processes on the same host. For example, your computer might have a web server process and an
email server process – data arriving needs to go to the right one. For this, Cerf and Kahn
introduce the concept of port numbers (they call them ports or process identifiers). A port is
like a mailbox within a host that a specific process monitors. They decide on a standard size (16
bits) for port identifiers as [Link], giving a large range of port numbers so that
one host can handle many concurrent conversations (each conversation associated with a
different port).
In simple terms: It’s like giving every computer in the world a unique mailing address
composed of a country code (network) and street address (host), and also specifying a person’s
name (port) on the envelope so the mail gets to the right person (process) at that address.
Figure: Splitting a long message into two smaller segments. Each segment will be sent in a
separate packet.
The figure above illustrates conceptually how a message might be split. The Transmission
Control Program (TCP) running on the source host takes a long message from a process and
breaks it into segments (Segment 1, Segment 2, etc.). These segments are of a size suitable for
the network – often determined by a maximum transmission unit or to accommodate flow
control. Each segment will have a segment header that includes the source and destination port
numbers (so the receiving TCP knows which process it’s for) and other control information. The
segment header plus the segment data together form the payload that will go into an
internetwork packet. If a message is short enough, it might fit in one segment (then it will be one
packet). If it’s longer, it will be split across multiple segments/packets.
Cerf and Kahn discuss two possible approaches for handling message boundaries: one could treat
the data as a continuous stream of bytes (ignoring original message boundaries), or treat each
message as a unit and mark segments as beginning or end of a message. They opted to include
flags in the header to indicate the End of a Message (EM) and the End of a Segment (ES)
when needed. For instance, if a message fits in one segment, that segment would be marked as
both start and end of a message. If a message is split, the last segment of that message would
have an “end-of-message” flag so the receiver knows it has received the complete message. This
way, the protocol preserves message boundaries even though data was broken into packets.
These flags are part of the internetwork header (described next) and help the destination
reassemble whole messages from pieces.
Every segment prepared by TCP is handed over to the internetwork protocol to send across the
networks. The internetwork protocol prepends an internetwork header in front of the segment,
turning it into an internetwork packet. This packet is the thing that actually gets transmitted
through the gateways and networks. It’s analogous to placing the segment into an “envelope”
that has addressing and other info on it needed for delivery.
The internetwork header contains several fields with vital information: the Source Address,
Destination Address, Sequence Number, Byte Count, and Flags. There is also a checksum at
the end (used for error checking). Below is a simplified diagram of the packet format:
Figure: Internetwork packet format. A local network header (specific to each network) is added
when the packet travels within that network, but the key part is the Internetwork Header which
is understood by all gateways and hosts. It carries Source/Destination addresses, Sequence
number, Byte count, and Flags. The Data portion contains the segment (including port numbers
and user data), and a trailing Checksum is used for error detection.
• Source Addr / Dest Addr: These are the global addresses (network + host) for the
sender and receiver, as discussed in the addressing section. They uniquely identify where
the packet is coming from and where it’s going. Every packet carries these so that
gateways know how to route it and the destination knows who sent it.
• Sequence Number: This is a number assigned to the packet (or more precisely, to the
position of this segment’s data in the overall byte stream). It’s used to order segments
properly at the receiving side. If packets arrive out of order (which can happen), the
sequence numbers tell the receiver how to put the pieces back in the right order to
reconstruct the original message. The sequence number in each packet is unique within a
given conversation (between a pair of hosts/ports) and typically represents the byte offset
of this packet’s data in the stream.
• Byte Count: This field indicates how many bytes of data are in this packet’s payload. It
helps the receiver know the length of the segment (and combined with sequence number,
defines the range of bytes covered by this packet). It’s also useful for detecting if a packet
is missing or got truncated.
• Flags: A set of bits used for control purposes. For example, flags indicate the end-of-
message or end-of-segment as mentioned, and possibly other signals like synchronization
or acknowledgement (in the context of this unified protocol, some flags might mark
special packets for setting up connections or other controls). Cerf and Kahn specifically
mention using flags for things like indicating a packet is a duplicate or to aid
retransmission logic (we’ll see some flags related to that in the next subsection).
• Checksum: A checksum is a computed value that lets the receiver verify the packet’s
integrity. The sender calculates this over the packet’s contents (or at least the header and
data) and the receiver recalculates to check if anything was corrupted in transit. In this
design, the checksum is placed at the end of the packet (like a trailer). The gateways do
not recalc the checksum; they just carry it along. Only the destination host’s TCP will
verify it to ensure end-to-end data integrity. This end-to-end checksum catches any errors
that individual networks might miss.
Cerf and Kahn note that when a packet enters a particular network, that network might add its
own local header in front of the internetwork header (or even a local trailer at the end) while it
travels [Link]. Think of the local header as the address label used within that
one network. The internetwork header is like an inner envelope that remains intact across
networks. The local header is stripped off or changed by each gateway as the packet moves from
one network to another, but the internetwork header stays with the packet until it reaches the
final destination. This layering allows each network to deliver the packet locally, while the
internetwork header ensures it eventually reaches the ultimate target host.
Fragmentation: Different networks have different limits on packet size (some might allow, say,
1000 bytes per packet, others only 100 bytes). If a packet is too large for a network, the gateway
must break it into smaller pieces – this is called fragmentation. Cerf and Kahn’s protocol
handles fragmentation at the gateways: a gateway will split an internetwork packet into two or
more smaller internetwork packets to fit the next network’s [Link].
Each resulting packet fragment carries the necessary internetwork header (and usually would
have flags or information to indicate it’s a fragment and to help reassembly).
Importantly, the design pushes reassembly to the destination host’s TCP, not on intermediate
gateways. The gateways do not reassemble fragments back into a big packet in the middle of the
route because that could waste memory and time on the gateway, cause bottlenecks, and even
lead to issues if fragments take different paths. Instead, each fragment travels separately to the
destination, and the TCP there will put them back together into the original segment. The
internetwork header’s sequence number and byte count fields help with this reassembly, and
flags can indicate if a fragment is the last part of a larger packet. By doing fragmentation only
when needed (at network boundaries) and reassembling only at the end, the protocol can
accommodate networks of various sizes in between.
Cerf and Kahn also briefly discuss accounting issues with fragmentation – for example, if
networks charge for packets, splitting one packet into many might incur more cost. However,
they reason that if packet sizes are chosen well and not drastically different, fragmentation won’t
significantly increase cost and might even reduce it in some cases (since smaller packets might
travel faster or with less delay)[Link]. Accounting was a minor
point, but it shows they thought about practical implications like billing in a multi-network
environment.
Recap: The internetwork packet format is the core that allows all networks to understand where
data should go and how to handle it. It provides a uniform wrapper around the data, and fields
for ensuring it arrives correctly (addressing, sequencing, error check). Fragmentation is a
necessary feature to deal with varied network capacities, and the protocol’s philosophy is to do
the minimal necessary at gateways (fragment when needed) and keep the rest (like reassembly
and error recovery) for the end hosts.
Once packets start flowing, the receiving side (the TCP at the destination host) has to collect
them and rebuild the original message. Because packets can take different paths and may arrive
out of order, each packet’s sequence number plays a crucial role. Cerf and Kahn specify that
each packet carries a sequence number unique to its message stream (i.e. unique for the
conversation between the particular source port and destination port). The sequence numbers are
assigned in a monotonically increasing [Link]. A simple way to imagine it:
treat all data bytes sent in one conversation as one long numbered sequence. If the first byte of
the first message is number 0, and you send 100 bytes, the sequence numbers for that message’s
bytes go 0–99. If a second message is sent later, its bytes might continue numbering 100, 101,
etc., or there might be a reset per message depending on implementation – but the key is, the
receiver can look at sequence numbers to order incoming packets.
The TCP receiver will buffer arriving packets and use their sequence numbers to reassemble
the original message(s) in the correct order. For example, if packet with sequence 0 arrives, then
seq 200, then seq 100, the TCP knows that it should arrange data starting with 0, then 100, then
200. If a piece is missing (say sequence 100–199 hasn’t arrived yet), the receiver can tell that
there’s a gap. It will hold onto what it has and possibly request a retransmission for the missing
part (or simply wait, depending on protocol specifics). The byte count field in each packet tells
how long that packet’s data is, so sequence number + byte count lets the receiver know the range
of bytes that packet covers.
They acknowledge that sequence numbers cannot grow forever without wrapping around (since
they have a fixed size in bits). A finite sequence number space means that after some large
number, it will reset to 0. Cerf and Kahn discuss problems that can occur with finite sequence
spaces, especially for retransmissions and duplicate packets (covered in the next section). In
designing the protocol, one must ensure that when a sequence number wraps around, old packets
from an earlier cycle won’t be mistaken for new ones. We’ll see how the window mechanism
addresses that.
To help with reassembly, they used the flag field in the header for special markers: specifically
flags for “End of Segment (ES)” and “End of Message (EM)” are mentioned. The receiver
uses these to know if it has reached the end of a message. For instance, if a message was split
into 3 segments, the third segment’s EM flag will be 1 (true). The first segment of a message
might have a BS (Begin Segment) flag (implicitly marking the start of a new message). By
examining these, the receiving TCP knows when one message ends and another begins in the
byte stream. This is helpful because if data is continuous, you need a way to delineate message
boundaries. With the flags, the protocol can be message-oriented while still sending a
continuous stream of bytes.
Summary: Sequencing ensures reliability and correct ordering. Every packet’s data is numbered
so the receiver can reassemble messages and detect missing pieces. Flags in the header signal
message boundaries, enabling the protocol to piece together the exact original messages, even if
packets arrive out of order or some need retransmission.
No network is perfect – packets can get lost, corrupted, or delayed. The internetwork protocol
must ensure that data eventually gets through correctly. Two mechanisms are crucial here:
acknowledgments/retransmissions (for reliability) and flow control (to prevent overwhelming
the network or the receiver).
Acknowledgment & Retransmission: The basic idea is that the sender should retransmit a
packet if it suspects the packet was lost. How does it know? Through ACKs (acknowledgment
messages) from the receiver, or by timing out. In Cerf and Kahn’s design, the receiver would
send back an acknowledgment indicating up to which sequence number bytes have been received
in order. For example, an ACK might say “I have received all bytes up through number 499.”
That implicitly acknowledges all packets covering up to byte 499. If the sender doesn’t receive
an ACK for later bytes within some time, it will assume something went wrong and retransmit
the missing data. The internetwork header has a flag field and possibly a dedicated ACK field to
facilitate this, similar to modern TCP’s ACK flag and acknowledgment number.
However, retransmission introduces the possibility of duplicate packets – e.g., if an ACK was
delayed but not lost, the sender might retransmit a packet that actually got through. The receiver
could then see the same sequence of bytes twice. The protocol must detect and ignore duplicates
so they don’t confuse the reassembly. Thanks to sequence numbers, this is straightforward: if a
packet arrives carrying a sequence number that has already been received (i.e., is to the “left” of
the current window), the receiver knows it’s a duplicate and can discard it. Cerf and Kahn
explicitly planned for duplicate detection logic using sequence numbers.
They also reason about how large the sequence number space (range of possible sequence
numbers) should be relative to how many packets might be outstanding, to avoid a late duplicate
being mistaken as a new packet after wraparound. One rule they mention: the sequence space
should be at least twice as large as the maximum number of outstanding data bytes (a rule that
ensures a packet’s sequence number won’t be reused until it’s safe)[Link]. In
practice, this relates to window size as we’ll see.
Flow Control (Window Mechanism): Flow control is needed so that a fast sender does not
overwhelm a slower receiver or flood the network. Cerf and Kahn adopt a sliding window
protocol similar to one used in the ARPANET and the French CYCLADES network
[Link]. In a sliding window, the receiver advertises a window size (how many
bytes it can accept beyond those already received and acknowledged). The sender can send
multiple packets back-to-back up to the window limit without waiting for an ACK each time.
This keeps the pipeline full for efficiency but not so full as to drown the receiver.
Imagine a window of size w bytes. The sender keeps track of a window of sequence numbers that
are allowed to be sent but not yet acknowledged. As ACKs come in (sliding the window
forward), more data can be sent. The receiver, on its end, only accepts bytes within the current
window range and will discard anything outside (either too early – duplicates – or too far ahead –
beyond what it can handle now). In the paper, they illustrate the window concept (Fig. 10)
showing a “left edge” and “right edge” of allowed sequence [Link]. The
left edge moves when data is acknowledged, the right edge moves accordingly, maintaining a
fixed window size w. If a packet arrives out of order (future part of sequence beyond the left
edge), the receiver has a choice: it can either keep it (store it out of order) or drop it and rely on
sender to retransmit. Cerf and Kahn allow that the receiver may buffer out-of-order packets or
may not, but in either case it will not acknowledge them until the gap is filled
[Link]. Usually, buffering is beneficial to reduce retransmissions.
The window approach also inherently provides flow control: w can be adjusted based on receiver
capacity. If the receiver is slow or its buffer is filling up, it can advertise a smaller window,
causing the sender to slow down. If it can handle more, it can enlarge the window.
Timeouts: The protocol requires a timeout mechanism. The sender starts a timer when sending a
packet; if the timer expires before an ACK for that packet (or for that byte range) arrives, it will
retransmit. The authors didn’t dictate a specific timeout duration in the paper – they noted
experiments would be needed to determine optimal [Link].
Handling Wraparound: With a finite sequence space, say 0 to N, if you have a window and
you keep transmitting, eventually sequence numbers will wrap back to ones used earlier. To
avoid confusion between old packets and new, the rule mentioned earlier is applied: the window
size w must be less than half of the sequence number [Link]. This ensures that
when a sequence number repeats, any old occurrence of that number (from an earlier cycle) is
outside of the window and would have been acknowledged or timed out long ago, so it won’t
clash with a current packet.
In summary for reliability: The protocol uses a combination of ACKs and timeouts to recover
from lost packets. Each packet has a sequence number so both sides can track what’s been
received and what’s missing. A sliding window is used for efficient and controlled delivery of
multiple packets in flight. Duplicates are detected via sequence numbers and ignored. These
mechanisms guarantee that despite network failures or delays, the data will be delivered correctly
and in order, or the sender will know to retry.
• Every host is identified by a global address = (Network ID, Host ID). Every
communicating process is identified by a port number.
• TCP (Transmission Control Program) in each host breaks large messages into
segments that fit into packets, and reassembles segments back into messages at the
destination.
• Each segment (packet) carries a Source & Destination address (for host routing) and
Source & Destination port (for process routing).
• Internetwork Header fields: Sequence number (for ordering), Byte count (segment
length), Flags (control info like end-of-message), and a Checksum (error detection).
• Fragmentation: Gateways split packets that are too large for the next network.
Reassembly of fragments is done by the destination’s TCP.
• Sequencing and Acknowledgments: Sequence numbers on packets allow receivers to
reorder data and detect losses. Receivers send ACKs for received data; senders retransmit
if ACKs don’t arrive (indicating possible loss).
• Flow Control (Window): A sliding window of unacknowledged bytes prevents overflow
and keeps data flowing efficiently. It ensures the sender doesn’t send too much too fast
for the receiver or network.
• Duplicate detection: Sequence numbers and window rules allow recognizing duplicate
packets (e.g., retransmissions) so they can be discarded and not confuse the data stream.
• All these features (variable packet size support, end-to-end acknowledgment,
retransmission, flow control, etc.) are integrated into the protocol to make it reliable
across multiple heterogeneous networks.
They introduce the term association to describe the relationship between two communicating
processes. An association is like an agreement or understanding that the two processes will
converse, but it doesn’t necessarily tie down a specific fixed path or resources in the network. In
other words, it’s a logical connection rather than a strictly bound physical or fixed circuit. They
prefer to use “association” to avoid the baggage of the word “connection,” which in networking
often implied a dedicated path or state in intermediate nodes like a telephone circuit
[Link]. Here, an association simply means the two endpoints (processes) know
about each other and are willing to exchange data (tracked by their port numbers and addresses),
but the network treats each packet independently (a concept later known as connectionless
packet switching with end-to-end control).
Cerf and Kahn discuss that one can implement reliable communication with or without a
formal connection setup. They reference research that connection-free protocols (meaning you
just send messages without a preliminary handshake) can work, especially since the internetwork
protocol itself has sequencing and error recovery. They carefully examine whether a handshake
is needed to synchronize state or whether sending the first data packet with some special flag can
initiate an association on the fly.
Their solution allows for a simplified connection establishment: when two processes want to
start communicating, they do not necessarily have to go through a lengthy handshake to “open” a
connection. Instead, the first packet sent to a new destination can be marked in a way that tells
the receiver “this is start of a new conversation, please set up state for it.” In the paper, they
propose that a special synchronization bit in the header could signal [Link].
The receiving TCP, upon seeing a packet with this flag that doesn’t match any existing
association, will create a new record for this new association (often called a Transmission
Control Block or TCB in later literature) and synchronize with the sender’s sequence numbers.
Essentially, the connection is established implicitly with the first data packet. This is sometimes
called a “handshake-free” setup – though in practice, to ensure both sides agree on starting
values (like initial sequence numbers), at least one packet (and maybe an acknowledgment of it)
is needed. They describe that the first packet from one side and the first packet from the other
side could cross in the network and each will establish the association at the other end (this is
often called a simultaneous open, meaning both sides started sending without a prior
arrangement, and it should still work).
The term connection is not thrown away entirely – they redefine it to mean an association
between processes for communication, without regard to a particular path in the network
[Link]. This was a shift from the telephone-like thinking to the internet-like
thinking: we care that the two endpoints are communicating reliably, not that they have a fixed
route or reserved circuit. If one route fails, another can be used, and the endpoints might not even
notice beyond maybe a delay.
They also mention that associations can be short-lived – even a single message exchange might
be all that’s needed. For example, one process can send one packet to another, and that could be
the entire conversation (if no reply is needed). The overhead to create and tear down state in that
case is minimal (just creating an entry when the packet arrives and removing it when done). If
properly optimized, this can support low-bandwidth, simple transactions efficiently
[Link].
An interesting idea they touch on is security through dynamic associations: if each new message
exchange uses a new association with a different identifier (like changing port numbers in a
pseudo-random way), eavesdroppers would have difficulty linking the messages together as a
single ongoing [Link]. Each message would look isolated, providing a
form of security by obscurity (though the data itself could also be encrypted for actual secrecy).
This wasn’t a primary focus of the paper, but it’s a forward-thinking suggestion to make
eavesdropping harder.
Finally, they compare their approach with ARPANET’s existing host-to-host protocol which
required opening and closing connections (NCP managed socket connections that were
somewhat analogous to port associations, but they were simplex and had to be opened
explicitly). Cerf and Kahn’s design is more flexible and general, avoiding constant
setup/teardown handshakes for each communication. It can operate in a connection-oriented
fashion when needed (e.g., a long-lived association with ongoing flow of data in both directions,
which is effectively what a TCP connection is today), but it also gracefully handles
connectionless exchanges (just send a packet and get a response, no pre-negotiation).
They note that, at the time of writing, the next step would be to create a detailed specification
and test it out in real [Link]. Indeed, following this paper, experiments
were conducted and by 1978 the protocol was split into two layers: IP (Internet Protocol)
handling the internetwork packet routing, and TCP (Transmission Control Protocol) handling
reliable transport – a direct result of the concepts in this paper. By 1983, TCP/IP became the
standard for ARPANET, and the foundation of the Internet as we know it.
Cerf and Kahn also acknowledge contributions from colleagues and prior works that influenced
their design (notably Donald Davies, Louis Pouzin who designed CYCLADES, and others)
[Link]. This emphasizes that the internetworking idea was a
collaborative advancement in networking research.
To put it simply, the paper’s contribution was to show how to build a network of networks:
introduce a common protocol layer and gateways so any computer could communicate with any
other, regardless of the underlying network differences. The design addressed technical
challenges like heterogeneity, reliability, and efficiency in a remarkably elegant way, which is
why this paper is considered a landmark in computer science.
• The proposed internetwork protocol introduced in 1974 is essentially the blueprint for
TCP/IP, enabling today’s Internet.
• It solved the problem of connecting heterogeneous networks by introducing a common
protocol and gateways, rather than requiring uniform hardware or software in all
networks.
• Major features of the design: universal addressing, packet format standardization,
fragmentation/reassembly, end-to-end acknowledgments, sequencing, flow control,
and a flexible association model for connections.
• The protocol is robust against network failures: if any packet is lost, the system detects
and corrects it (retransmission); if networks have different limits, it adapts
(fragmentation); if packets come out of order, it fixes that (sequencing).
• Cerf and Kahn’s work paved the way for an open, scalable internet. By abstracting
communication into this protocol, new networks could join simply by building a gateway,
making the Internet extensible.
• This paper is a foundational document – understanding it gives insight into why the
Internet’s design is as it is (e.g., why we have routers/gateways, why packets have
headers, why TCP does what it does with sequence numbers and windows). It’s a prime
example of designing for interoperability and end-to-end principles in network
architecture.