W. Richard Stevens' Home Page
-
UNIX Network Programming, Volume 2, Second Edition:
Interprocess Communications,
Prentice Hall, 1999.
-
UNIX Network Programming, Volume 1, Second Edition: Networking APIs: Sockets and XTI,
Prentice Hall, 1998.
-
TCP/IP Illustrated, Volume 3: TCP for Transactions, HTTP, NNTP,
and the UNIX Domain Protocols,
Addison-Wesley, 1996.
-
TCP/IP Illustrated, Volume 2: The Implementation,
Addison-Wesley, 1995.
-
TCP/IP Illustrated, Volume 1: The Protocols,
Addison-Wesley, 1994.
-
Advanced Programming in the UNIX Environment,
Addison-Wesley, 1992.
-
UNIX Network Programming,
Prentice Hall, 1990.
- Allman, M., Paxson, V., Stevens, W. R. 1999.
"TCP Congestion Control,"
RFC 2581.
- Gilligan, R. E., Thomson, S., Bound, J., and Stevens, W. R. 1999.
"Basic Socket Interface Extensions for IPv6,"
RFC 2553.
- Stevens, W. R., and Thomas, M. 1998.
"Advanced Sockets API for IPv6,"
RFC 2292.
- Stevens, W. R., and Pendry, J.-S. 1995.
"Portals in 4.4BSD,"
Proceedings of the 1995 Winter USENIX Technical Conference,
pp. 1-10, New Orleans, La.
- Stevens, W. R. 1989.
"Heuristics for Disk Drive Positioning in 4.3BSD,"
Computing Systems,
vol. 2, no. 3,
pp. 251-274 (Summer).
Some of the following are papers that I have referenced in my books,
often Usenet postings, that are not easily obtainable.
Others are just papers that I think are interesting.
Enjoy--most are classics.
- Borman, D. A. 1997,
"
Re: Frequency of RST terminated connections,"
end2end-interest Mailing List,
Jan. 30, 1997.
A note that the upper limit of port 5000 for the ephemeral port numbers
was a typo that occurred around 1986 right before 4.3BSD was released.
The upper limit was meant to be 50,000.
- Borman, D. A. 1997,
"
Re: SYN/RST cookies,"
tcp-impl Mailing List,
June 6, 1997.
A note that the concept of the listen() backlog is a limit on the
number of established connections. The purpose of this limit is
to prevent TCP from accepting new connection requests when the
application is not accept()ing them.
- Braden, R. T. 1993,
"
TCP Extensions for High Performance: An Update,"
Internet Draft,
June 21, 1993.
Unfortunately this Internet Draft expired quite a while ago and was
never published as an RFC. Nevertheless, the ideas in the draft appear
in all current implementations of RFC 1323.
- I have always been a fan of Richard W. Hamming.
I did not keep very many of the textbooks that I acquired in
graduate school, but kept all four of his books
(along with all my Knuth, Kernighan, and Kleinrock books).
Here is a wonderful biography
and obituary of Hamming (6 pages of PostScript),
which includes a nice summary of his major accomplishments.
Here are the three photos
that go with the biography.
I will never forget having learned about digital filters from
the classic Digital Signal Processing books of the 1970s
(Oppenheim and Schafer, etc.) and then finding Hamming's
Digital Filters book, and wondering why all the classic texts
made the topic so hard to understand when Hamming could make it
so easy to understand.
Some readers have told me that they find that my books
make a complicated subject (such as network programming)
easy to understand--if that is true,
then it is due to the influence of writers like Richard Hamming
and Brian Kernighan.
- Jacobson, V. 1987,
"
Re: Interpacket Arrival Variance and Mean,"
June 15, 1987.
An explanation and example C code for estimating the mean and variance
of a series of measurements.
- Jacobson, V. 1987,
"
Re: Your congestion scheme,"
Nov. 16, 1987.
An early email on slow start and congestion avoidance.
- Jacobson, V. 1988,
"
Dynamic Congestion Avoidance / Control,
Feb. 11, 1988.
Another early posting on congestion avoidance.
- Jacobson, V. 1988,
"
Some Interim Notes on the BSD Network Speedup,"
Usenet, comp.protocols.tcp-ip Newsgroup,
Message-ID <8807200426.AA01221@helios.ee.lbl.gov>,
July 20, 1988.
- Jacobson, V. 1988,
"
4BSD TCP Ethernet Throughput,"
tcp-ip Mailing List,
Oct. 24, 1988.
- Jacobson, V. 1988,
"
Performance,"
Usenet, comp.protocols.tcp-ip Newsgroup,
Message-ID <8811231121.AA19744@helios.ee.lbl.gov>,
Nov. 23, 1988.
- Jacobson, V. 1990,
"
Modified TCP Congestion Avoidance Algorithm,"
end2end-interest Mailing List,
Apr. 30, 1990.
- Jacobson, V. 1992,
"
Design Changes to the Kernel Network Architecture for 4.4BSD,
4.4BSD Class, Berkeley, Calif., May 1992.
These overheads contains additional details about the changes described
in [Partridge 1993] and [Jacobson 1993]. Note that despite the title,
these changes never made it into the 4.4BSD release.
- Jacobson, V. 1993,
"
Some Design Issues for High-Speed Networks,"
Networkshop '93, Melbourne, Australia, Nov. 1993.
Additional details about the changes described in [Partridge 1993].
- Jacobson, V. 1994,
"
Problems With Arizona's Vegas,"
end2end-tf Mailing List,
Mar. 14, 1994.
PostScript illustration referenced in
this posting.
- Jacobson, V. 1994,
"
Re: half baked anycastoff idea...,"
end2end-interest Mailing List,
Jun. 27, 1994.
A note that 4.4BSD intended to incorporate a lazy accept for TCP.
- Jacobson, V. 1999,
"
Re: traceroute history: why UDP?,"
Usenet, comp.protocols.tcp-ip Newsgroup,
Message-ID: <79m7m4$reh$1@dog.ee.lbl.gov>,
Feb. 8, 1999.
People have wondered why traceroute uses UDP probes instead of
ICMP echo probes (which apparently Microsoft traceroute uses).
Here is the answer from the original author.
- Brian
Kernighan's home page contains some classic software
along with the source code for the one true awk.
(I am a big fan of awk, and use it a lot.)
- Readers (and copy editors) are occasionally surprised
by my use of compound words, instead of using either the
open or hyphenated form.
That is, I write filesystem instead of either
file system or file-system.
The Chicago Manual of Style acknowledges this trend (Section 6.38).
Don Knuth has a wonderul
paragraph
about why we should write email instead of e-mail
and just accept the fact now that it will become a compound word.
- Lanciani, D. 1996,
"
Re: sockets: AF_INET vs. PF_INET,"
Usenet, comp.protocols.tcp-ip Newsgroup,
Message-ID: <3561@news.IPSWITCH.COM>,
Apr. 1996.
Contains a copy of the 4.1cBSD manual page for the original socket()
function, showing why the PF_ constants existed, independent of
the AF_ constants.
- Libes, D. 1990,
"
Implementing Software Timers,"
C User's Journal, Nov. 1990.
A handy set of C functions to implement any number of software timers
in a process using a single timer signal.
- Maslen, T. M. 1997,
"
Re: gethostbyXXXX() and threads,"
Usenet, comp.programming.threads Newsgroup,
Message-ID: <maslen.862463530@shellx>,
May 1997.
An interesting history of the development of the Solaris
gethostbyXXXX_r() functions.
- Mogul, J. 1992,
"
Re: Holy Turbocharger Batman, (evil, cheating) NFS async writes fly,"
Usenet, comp.protocols.nfs Newsgroup,
Message-ID: <1992Mar2.191711.9935@PA.dec.com>,
March 1992.
- Muuss, M. J.,
"
The Story of the PING Program."
A history of the PING program, by its original author.
There exists a children's book
The Story About Ping, that, sadly, is not about this command.
Nevertheless, a funny
review
of this book was posted to Amazon in March 1999.
Amazon promptly removed the review (no sense of humor?),
then put it back.
- Partridge, C. 1993,
"
Jacobson on TCP in 30 Instructions,"
Usenet, comp.protocols.tcp-ip Newsgroup,
Message-ID <1993Sep8.213239.28992@sics.se>,
Sept. 1993.
- Partridge, C., and Pink, S. 1993.
"
A Faster UDP,"
IEEE/ACM Transactions on Networking,
vol. 1, no. 4,
pp. 429-440
(PostScript, 148K).
- This is a summary of the accidental priority inversion that occurred
with the Mars
Pathfinder
mission in July, 1997.
This summary is by Mike Jones, dated December 7, 1997,
and was then widely circulated after it appeared in Peter G. Neumann's
moderated Risks Forum (comp.risks) on December 9, 1997
in issue RISKS-19.49.
- Paxson, V. 1995,
"
Re: Traceroute and TTL,"
Usenet, comp.protocols.tcp-ip Newsgroup,
Message-ID <48407@dog.ee.lbl.gov>
Sept. 1995.
30% of measured Internet routes are asymmetrical.
See the next reference for the final version of the SIGCOMM paper
that is referenced in the posting.
- Paxson, V. 1996,
"
End-to-End Routing Behavior in the Internet,"
SIGCOMM 1996,
Aug. 1996.
- Jon Postel passed away unexpectedly on October 16, 1998.
Here
are three wonderful acknowledgments of Jon's many contributions
to the Internet by Dave Farber, Vint Cerf, and Bob Braden.
- Dennis
Ritchie's home page contains some classic papers:
"The Evolution of the Unix Time-sharing System,"
"The Development of the C Language," and
"A Stream Input/Output System," for example.
- Shimomura, T. 1995,
"
Technical details of the attack described by Markoff in NYT,"
Usenet, comp.protocols.tcp-ip Newsgroup,
Message-ID <3g5gkl$5j1@ariel.sdsc.edu>,
Jan. 1995.
A technical explanation of the Internet break-in of December 1994
along with the CERT advisory.
- RPC Mailing List Discussion, 1995,
"
RPC is a poor solution anyway, so why bother?,"
end2end-interest Mailing List,
Feb. 1995.
Whenever I teach RPC I always mention that it is a controversial
topic. This is a collection of eight postings by some knowledgeable
people on the topic of RPC, some pro, some con.
This discussion was generated by the proposal from Sun to publish
their RPC specifications as RFCs
(which were published as RFCs
1831,
1832, and
1833,
preceded by the agreement detailed in RFC
1790).
- Torek, C. 1994,
"
Re: Delay in re-using TCP/IP port,"
Usenet, comp.unix.wizards Newsgroup,
Message-ID <199501010028.QAA16863@elf.bsdi.com>,
Dec. 1994.
A great explanation of why the SO_REUSEADDR socket option
is needed with the bind() function.
- Unix International, 1991,
"
Data Link Provider Interface Specification, Revision 2.0.0,"
Aug. 1991. (1.4 Mbytes PostScript, 185 pages.)
This paper and the next two are the only publicly available
documentation that I am aware of for the System V Release 4
STREAMS interfaces to the datalink layer, network layer,
and transport layer. They used to be available on the
Unix International FTP site, when UI existed.
- Unix International, 1992,
"
Network Provider Interface Specification, Revision 2.0.0,"
Aug. 1992. (860 Kbytes PostScript, 146 pages.)
- Unix International, 1992,
"
Transport Provider Interface Specification, Revision 1.5,"
Dec. 1992. (360 Kbytes PostScript, 51 pages.)
The Transport Provider Interface is what sockets, XTI, and TLI
talk to on an SVR4 system.
- White, J. E. 1975.
"
A High-Level Framework for Network-Based Resource Sharing,"
RFC 707, Dec. 1975.
This is probably one of the first papers describing RPC
(remote procedure calls). Most RFC indexes list this RFC as
not being on-line, but someone found a copy of it for posterity.
This paper also appeared in the Proceedings of the National Computer
Conference in June 1976, and that is how it is normally referenced
in RPC papers and texts.
This section contains some notes on how I write books.
- This used to be a tar file containing the Posix.1g
getaddrinfo() function that supports both IPv4 and IPv6.
You should now go to here and fetch
the source code from this book, which contains the implementation,
and the sample chapter, which describes the implementation in
great detail.
-
IP multicast API information.
This describes the multicast API (application programming interface)
using sockets for IPv4.
It is from Steve Deering's original multicast release README (1989)
but is still valid.
Section 5 of
RFC 2553
describes the multicast API for IPv6.
- There is a complete description of multicasting in general
along with a detailed description of the IPv4 and IPv6 multicast API
using sockets in this book,
with four example programs.
Even if you don't want to buy the book,
fetch the source code for the book,
and look at the mcast_ functions in the lib/ directory
along with the example programs in the mysdr,
mcast, ssntp, and sntp directories.
- This paper
by Semeria and Maufer
is a nice introduction to multicasting in general, and multicast routing.
-
mtest.c:
the test program from Steve Deering's original multicast release.
Use it as another example of the multicast API.
I received the B.S.E. in Aerospace Engineering from the University of
Michigan (1973), and the M.S. (1978) and Ph.D. (1982) in Systems
Engineering (image processing major, physiology minor)
from the University of Arizona.
I have had many lives as a programmer.
After getting my B.S.E. I spent 2 years writing operating systems in
assembler, 7 years in the astronomy world (at Kitt Peak National Observatory
in Tucson, doing real-time data acquisition and image processing), then
8 years as Vice President of a health-care software startup in Connecticut
(Health Systems International).
Since 1990 I have been self-employed, living in Tucson, writing
books full-time with occasional teaching of classes based on the books.
In what seems to be a previous life (1970s) I was a flight instructor,
although most of my flying these days is in the back of a commercial airliner
or down the steeps at Taos Ski Valley.
I am willing to admit that my first programming language was Fortran,
that I once programmed in Forth and Cobol,
and that I still have (from my undergraduate years)
both my IBM green card and my slide rule
(which Kelly Johnson calls a "Michigan calculator").
Here is a longer biography,
mainly about how I got into computers and Unix.
Here is a chronological list of the various
computer systems and programming languages
that I have used.
I've worked on mathematics for slot machines for the
online casino industry for years.
Where are you from?
Chronologically and geographically I have lived lots of places.
When someone asks me "where are you from?" or "where did you grow up?"
my reply begins with "it's a long story".
- 1951: I was born in Luanshya, Northern Rhodesia (now Zambia).
My father (an American, although he had spent much of his youth
in Southern Africa and Tasmania) was working at the
Roan Antelope Copper Mine,
where he had worked as a metallurgical engineer
since graduating from Columbia University in 1937.
My mother (also an American) had gone to Northern Rhodesia to visit
her brother (another mining engineer from Columbia),
met my father, got married, and stayed 16 years longer than planned.
- 1956-1960: Salt Lake City, Utah.
My father was working for Kennecott Copper Corp. (Bingham Canyon).
- 1960-1964: Hurley, New Mexico.
My father was working for Kennecott Copper Corp. (Chino Mines).
- 1964: Washington, D.C.
My father was at the Brookings Institution for 6 months.
- 1964-1971: Phalaborwa, South Africa.
My parents went to South Africa for the development and opening
of the new Palabora Copper Mine in the northeastern Transvaal.
(Phalaborwa is one of the gates into the Kruger Game Reserve.)
- 1964-1968: Waynesboro, Virginia.
When my parents moved to South Africa I was about to start high school,
and had my choice of a boarding school in the U.S. or an
English-style boarding school in South Africa.
I chose the former and attended Fishburne Military School for 4 years,
going "home" to South Africa each summer.
- 1968-1973: Ann Arbor, Michigan,
attending the University of Michigan.
- 1969: Sallisaw, Oklahoma. I had a summer job with Bechtel Corp.
at the construction of the Kerr McGee uranium treatment plant in Gore, OK.
- 1971, 1972: Carrollton, Georgia.
I had summer jobs with the Southwire Corp.,
the first summer as a computer operator,
and the second summer as a programmer.
- 1973-1975: Santa Ana, California.
After graduating from Michigan,
I worked for 2 years at Singer's M & M Computer Division
as a programmer.
- 1975-1982: Tucson, Arizona.
I worked full-time for Kitt Peak Observatory
and attended graduate school at the University of Arizona.
Yes, it is possible to obtain a Ph.D. while working full-time,
although you don't have much free time.
- 1982-1990: New Haven, Connecticut.
I worked for Health Systems International.
- 1990-present: Tucson, Arizona.