IEN 151                                                        Vint Cerf
                                                              1 April 80

                      FINAL REPORT OF THE STANFORD
                         UNIVERSITY TCP PROJECT

                             Vinton G. Cerf
                              1 April 1980


This report provides a brief historical and technical summary of the
Stanford University internet, host-to-host Transmission Control Protocol
(TCP) project.  Developed from 1973-1976 at Stanford, Bolt Beranek and
Newman and University College London, the effort then continued at other
research and development centers during 1977-1980.  Originally designed
as a monolithic internet protocol, the internet aspects were separated
into a distinct protocol layer in early 1979 with the publication of
version 4 of TCP.  The resulting pair of protocols, TCP4 and Internet
Protocol (IP) are now undergoing procedures for standardization within
the DoD and Intelligence Community.  The four most valuable results of
the Stanford effort were the assessment of which functions could or
should be implemented in the protocol and which should not, the
implementation of an efficient, assembly-language version of TCP for an
LSI-11 computer, the development of a "micro" operating system (MOS) for
the same computer, and the specification of the TCP protocol.

1.  Introduction:

The Stanford TCP project was supported by the Defense Advanced Research
Projects Agency (DARPA) under contract No. DAHC 15-73-C-0363 and
MDA903-76-C-0206, ARPA Order No. 2494 during the period 1 July 1973 to
30 September 1976.  During the time that the project was at Stanford,
two versions of TCP were developed, one in December 1974 [1] and another
which was published in March 1977 [2], by DARPA.  Since that time, two
other versions of TCP were developed, one n December 1974 [1] and
another which was published in March 1977 [2], by DARPA.  Since that
time, two other versions have been published, versions 3 and 4 [3,4] in
January 1978 and February 1979, respectively.  Editing of these latter
versions was the responsibility of J. Postel, Information Sciences
Institute, University of Southern California. Intermediate versions were
published in July 1976 [5], July 1978 [6], and August 1979 [7].  The
July 76 version was developed for the Defense Communication Agency by J.
Postel, L. Garlic, and R. Ram of Stanford Research Institute for the
Defense Communication Agency in connection with the AUTODIN II project.
The final versions of TCP and Internet Protocol were published in
January, 1980 [14,15] by DARPA on behalf of the Defense Communication

During the course of the DARPA Interneting program, which supported the

Cerf                                                            [Page 1]

                                                            1 April 1980
IEN 151

TCP development, a great many people and groups were involved in or
influenced the development of the TCP.

The initial impetus for the effort resulted from work by R. Kahn and V.
Cerf, which was published in May 1974 [8], but whose basic roots were
already known in September 1973 [9].

An initial design for TCP was worked out during 1973-74 at Stanford
among V. Cerf, Y. Dalal, C. Sunshine and R. Karp, with the participation
of R. Tomlinson [Bolt Beranek and Newman], W. Plummer [BBN], R. Metcalfe
[Xerox PARC] and D. Boggs [Xerox PARC].  Implementation, testing and
further development were carried out jointly at Stanford with J. Mathis
and J. Estrin, Bolt Beranek and Newman, and University College London
[F. Deignan, C. J. Bennett, A. J. Hinchley and M. Galland.]  Visiting at
Stanford during this initial development period were G. LeLann
[University of Rennes, France] and D. Belsnes [University of Oslo] who
provided additional philosophical leavening which influenced the design
of the protocol.

By 1976, implementations had been written for the Tenex/PDP-10
[Tomlinson, Plummer - in BCPL], ELF/PDP-11 [Tomlinson, Plummer - in
BCPL; Karp, Dalal, Cerf - BCPL], LSI-11 [Mathis - assembly language],
PDP-9 [Deignan - BABBAGE] and some performance experience obtained [10].

Since then, implementations have been for UNIX [M. Wingfield - "c"; J.
Haverty - assembly language], MOS 360 [B. Braden - assembly language],
Multics [D. Clark - PL/1], TOPS-20 [W. Plummer - assembly language], and
NORD-10 [A. Stensby].


The initial concept behind TCP was very simple.  Two processes wishing
to communicate had only to know the other's "address".  Data would be
accounted for in 8-bit octets, and sequence numbers would be used to
re-order the received data at the destination, if necessary.  The first
packet would have a special synchronization flag ["SYN"] which would
alert the receiver that the sender's sequence numbers would start with
the one associated with data sequence numbers so that end to end
acknowledgments for data could also be used to acknowledge control.  If
resynchronization were needed, the sender could simply send another
"SYN" packet.  There would be no use for a "connection set-up" in the
conventional sense.  Finally, packet formats would permit internet
gateways to fragment packets into identically formatted, smaller packets
if necessary, to get through a net with a smaller packet size.
Reassembly of fragments would be done by the destination.

An initial implementation of the protocol by Tomlinson and Plummer was
used to control a line printer which was supposed to spool output from a
host computer onto paper.  The first obvious problem which cropped up

Cerf                                                            [Page 2]

                                                            1 April 1980
IEN 151

was an inability to distinguish an old duplicate SYN packet (created by
retransmissions in the absence of an acknowledgments) from a new SYN
packet which is trying to start a new sequence.

This problem was documented in [11-13] and the solution proposed was
called the "three-way" handshake" by its inventor, Ray S. Tomlinson.
This addition to the original proposed protocol [8] was probably the
most major change to its philosophy, since it introduced an explicit
connection "set-up" exchange at the beginning to allow both ends to
validate the connection sequence numbers. Basically, each end selects a
starting sequence number, and receives both an acknowledgments and an
indication of the start of the other end's sequence space.  This
validating exchange is intended to help each end distinguish old,
duplicate SYNs from recent ones.  For this to work correctly, some
maximum throughput, so as to be able to select a suitably-sized sequence
number space. In the end, a 32 bit sequence space was selected which
would not wrap around for about 4 hours at 2 megabits/second.

An alternative to the three-way handshake was examined in 1978 by D.
Reed at MIT [16], in which the initiator of a "connection" employs a
unique, non-reusable "socket identifier" as a way of distinguishing new
from old connection requests.  These identifiers are needed in TCP also,
to distinguish among multiple connections, but the socket numbers are
allowed to be reused, leading to the need to use sequence numbers and
the three-way handshake to distinguish old from new connection requests.
The strategy proposed by Reed required some non-volatile supply of new
socket identifiers which would either never recur, or recur at such long
cycles (days, weeks...) that there would never be any confusion or
duplication of use.  Obvious, if the socket identifiers cycled too
quickly, a particular identifier might present itself for use anew while
it was still in use on some connection.  This idea was considered for
TCP in 1978, but was not pursued as it created problems of "dangling,
half-open server connections" when things went wrong.

The second major issue had to do with the resynchronization of a
connection after host failure.  A variety of techniques were exploded
and designed in detail.  In the final TCP design, a simple strategy for
recovering from "half-open" connections was developed.

A hazard was found, however, based on violation of the assumption that
sequence numbers would be consumed at no more than some maximum rate.
If a connect stayed idle for a long enough period, the basic "initial
sequence number" selection strategy outlined in [11-13] would encounter
a hazard if the host failed just as the "next sequence number" to use
fell into the so-called initial sequence number "forbidden zone".  A
complex set of tests were defined to catch this case, but required
action on each packet transmitted to determine whether the hazardous
"forbidden" zone had been entered.  If so, the sequence numbers on the
connection would be re-synchronized to skip around the danger area.  The

Cerf                                                            [Page 3]

                                                            1 April 1980
IEN 151

probability of the hazard actually occurring was judged to be quite
small, and finally these tests were eliminated, vastly simplifying the
TCP definition and implementation.

The third critical issue had to do with the treatment of packets which
required fragmentation to pass through a network.  Gateways between nets
were postulated which could detect that an incoming packet was too large
to fit encapsulated in the packet format of the next network.

A fragmentation strategy was developed which permitted an internet
packet to be fragmented into smaller packets and marked in such a way
that the resulting fragments could be routed independently of one
another and could still be reassembled at the final destination.

A major change to the TCP philosophy occurred when the basic interneting
func tions (addressing, fragmentation and type of service selection)
were separated from the end to end functions of TCP (sequencing,
retransmission, duplicate detection, flow control and port
multiplexing).  At this point, the fragmentation problem was
substantially simplified since it applied only to the internet packets
and limited knowledge of protocols to the IP layer in the gateway.

At the same time, this permitted other higher level protocols, adjacent
to the TCP layer, to rely on the special services, including
fragmentation and reassembly, of the IP protocol layer.

Network Security

The TCP concepts were applied to the ARPA network security program and
an architecture was developed which accommodated the use of TCP as an
end to end protocol, below which, end to end encryption could take
place.  This architecture became even simpler when the TCP was split
from the internet protocol functions since security was provided at the
IP level, allowing many different transport protocols, in addition to
TCP, to be secured by the same basic system.

Implementation and Experimentation

Two TCPs were developed during this project:

   1.  BCPL for PDP-11 under ELF operating system.

   2.  Assembly Language for LSI-11 under MOS operating system.

The former was useful for high-level description of the TCP
functionality but was never very efficient.  Extensive performance tests
and timing analyses revealed that 75-80% of the overhead for the BCPL
TCP running under ELF was attributable to either the slow interprocess

Cerf                                                            [Page 4]

                                                            1 April 1980
IEN 151

communication system in ELF or the inefficient "Reliable Transmission
Protocol" for the Very Distant Host interface to ARPANET.

The RTP introduced a minimum round-trip time to the IMP and back of some
50 ms, limiting packet rates to about 20 packets/second.

Performance tests conducted with a Babbage implementation at University
College London [10] were even less satisfactory due to buffer
limitations in the London PDP-9 computer and the very lengthy cross-net
delays imposed by a 9.6 kb/s satellite circuit connecting London to the
U.S. by way of Norway.  The best packet rate we could sustain was about
2-3 packets/second.

We found a significant improvement in performance to be possible upon
using ARPANET "type 3" packets which are not limited to 8 outstanding
messages as is normal ARPANET traffic.  However, this mode of operation,
if stressed, caused serious network congestion problems.

To determine whether the limited performance of TCP was a design flaw,
we implemented an assembly language version in about 1200 words of
LSI-11 memory running under a small, 800 word micro-operating system.
This version, while compatible with our 12,000 word BCPL version on ELF,
was one tenth the size and achieved 37 kb/s on the LSI-11 and 50 kb/s on
the PDP-11/20.

The LSI-11 version was subsequently integrated in to the packet radio
network at SRI as part of a Terminal Interface Unit.


This project successfully developed, implemented, documented and tested
a reliable, internet work, host-to-host protocol, capable of operating
in extremely hostile environments and able to recover from catastrophic
failures in a graceful fashion.

The adoption of the protocol for DoD use in packet networking is an
indication of the far-reaching impact of this research.

Cerf                                                            [Page 5]

                                                            1 April 1980
IEN 151


1.   Cerf V., Y. K. Dalal, C. A. Sunshine, "Specification of Internet
     Transmission Control Program", INWG General Note 72, IFIP Working
     Group 6.1, December 1974.

2.   Cerf. V., "Specification of Internet Transmission Control Program -
     TCP (Version 2)", March

3.   Cerf. V., J. Postel (eds), "Specification of Internetwork
     Transmission Control Program - TCP (Version 3)", January 1978.

4.   J. Postel (ed), 'Transmission Control Protocol - TCP (Version 4)",
     February 1979.

5.   J. B. Postel, L. L. Garlic, R. Rom, "Transmission Control Protocol
     Specification", Augmentation Research Center, Stanford Research
     Institute, Menlo Park, CA 15 July 1976 [for the U.S. Defense
     Communications Agency in connection with AUTODIN II].

6.   "Specification of Internetwork Transmission Control Program - TCP
     (Version 3.1)", July 1978.

7.   DARPA, "Transmission Control Protocol, Version 4", August 1979
     [edited by J. Postel].

8.   Cerf, V. G. and R. E. Kahn, "A Protocol for Network
     Intercommunication", IEEE Transactions on Communications, Vol.
     Com-22, No. 5, May 1974.

9.   Cerf, V. and R.E. Kahn, "Proposed Protocol for Internet
     Host-to-Host Communication", INWG Note No. 39, September 1973.

10.  Bennett, C. J. and A. J. Hinchley, "Quantitative Measurements of
     the Transmission Control Protocol", Proceedings of the Int'l
     Conference on Protocols, Andre Danthine [ed].

11.  Tomlinson, R.S., "Selecting Sequence Numbers", INWG Protocol Note
     No. 2, August 1974; Proceedings of the ACM SIGCOMM/SIGOPS
     Interprocess Communication Workshop, (Santa Monica, CA, March
     24-25, 1975) and ACM Operating Systems Review, Vol. 9, No. 3, July
     1975, Association for Computing Machinery, New York, 1975.

12.  Dalal, Yoden, K., "More on Selecting Sequence Numbers", INWG
     Protocol Note, No. 4 IFIP Working Group 6.1, August 1974; also, in
     Proceeding of the ACM SIGCOMM/SIGOPS Interprocess Communications
     Workshop, (Santa Monica, CA, March 24-25, 1975) and ACM Operating
     Systems Review, Vol. 9, No. 3, July 1975, Association for Computing
     Machinery, New York, 1975.

Cerf                                                            [Page 6]

                                                            1 April 1980
IEN 151

13.  Dalal, Yogen K., "Establishing a Connection", INWG Protocol Note
     14, IFIP Working Group 6.1, March 1975.

14.  DARPA, "DoD Standard Transmission Control Protocol", (J. Postel,
     ed.) January 1980.

15.  DARPA, "DoD Standard Internet Protocol", (J. Postel, ed.), January

16.  Reed, David P., "Naming and Synchronization in a Decentralized
     Computer System", MIT Report LCS/TR-205, September, 1978.

17.  Sunshine, C., "Interprocess Communication Protocols for Computer
     Networks", Ph.D. Dissertation, Stanford University, December 1975.

Cerf                                                            [Page 7]