                                ==Phrack Inc.==

                     Volume Three, Issue 28, File #3 of 12

       <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
       <>                                                            <>
       <>           Introduction to the Internet Protocols           <>
       <>           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~           <>
       <>        Chapter Eight Of The Future Transcendent Saga       <>
       <>                                                            <>
       <>                    Part One of Two Files                   <>
       <>                                                            <>
       <>                Presented by Knight Lightning               <>
       <>                        July 3, 1989                        <>
       <>                                                            <>
       <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>


Prologue
~~~~~~~~
Much of the material in this file comes from "Introduction to the
Internet Protocols" by Charles L. Hedrick of Rutgers University.
That material is copyrighted and is used in this file by
permission.  Time differention and changes in the wide area
networks have made it necessary for some details of the file to
updated and in some cases reworded for better understanding of
our readers.  Also, Unix is a trademark of AT&T Technologies,
Inc. -- Just thought I'd let you know.

If you are not already familiar with TCP/IP, I would suggest that
you read "Introduction to MIDNET" (Phrack Inc., Volume Three,
Issue 27, File 3 of 12) for more information.  That file is
Chapter Seven of The Future Transcendent Saga and contains
information about TCP/IP and how it is used within the National
Science Foundation Network (NSFnet).


Table of Contents - Part One
~~~~~~~~~~~~~~~~~
*  Introduction
*  What Is TCP/IP?
*  General Description Of The TCP/IP Protocols
       The TCP Level
       The IP Level
       The Ethernet Level


Introduction
~~~~~~~~~~~~
This article is a brief introduction to TCP/IP, followed by
suggestions on what to read for more information.  This is not
intended to be a complete description, but it can give you a
reasonable idea of the capabilities of the protocols.  However,
if you need to know any details of the technology, you will want
to read the standards yourself.

Throughout the article, you will find references to the
standards, in the form of "RFC" (Request For Comments) or "IEN"
(Internet Engineering Notes) numbers -- these are document
numbers.  The final section (in Part Two) explains how you can
get copies of those standards.


What Is TCP/IP?
~~~~~~~~~~~~~~~
TCP/IP is a set of protocols developed to allow cooperating
computers to share resources across a network.  It was developed
by a community of researchers centered around the ARPAnet.

First some basic definitions; The most accurate name for the set
of protocols I am describing is the "Internet protocol suite."
TCP and IP are two of the protocols in this suite (they will be
described below).  Because TCP and IP are the best known of the
protocols, it has become common to use the term TCP/IP to refer
to the whole family.

The Internet is a collection of networks, including the Arpanet,
NSFnet, regional networks such as MIDnet (described in Chapter
Seven of the Future Transcendent Saga), local networks at a
number of University and research institutions, and a number of
military networks.  The term "Internet" applies to this entire
set of networks.

The subset of them that is managed by the Department of Defense
is referred to as the "DDN" (Defense Data Network).  This
includes some research-oriented networks, such as the ARPAnet, as
well as more strictly military ones (because much of the funding
for Internet protocol developments is done via the DDN
organization, the terms Internet and DDN can sometimes seem
equivalent).

All of these networks are connected to each other.  Users can
send messages from any of them to any other, except where there
are security or other policy restrictions on access.  Officially
speaking, the Internet protocol documents are simply standards
adopted by the Internet community for its own use.  The
Department of Defense once issued a MILSPEC definition of TCP/IP
that was intended to be a more formal definition, appropriate for
use in purchasing specifications.  However most of the TCP/IP
community continues to use the Internet standards.  The MILSPEC
version is intended to be consistent with it.

Whatever it is called, TCP/IP is a family of protocols.  A few
provide "low-level" functions needed for many applications.
These include IP, TCP, and UDP (all of which will be described in
a bit more detail later in this file).  Others are protocols for
doing specific tasks, e.g. transferring files between computers,
sending mail, or finding out who is logged in on another
computer.

Initially TCP/IP was used mostly between minicomputers or
mainframes.  These machines had their own disks, and generally
were self-contained.  Thus the most important "traditional"
TCP/IP services are:

    - File Transfer -- The file transfer protocol (FTP) allows a
      user on any computer to get files from another computer, or
      to send files to another computer.  Security is handled by
      requiring the user to specify a user name and password for
      the other computer.

      Provisions are made for handling file transfer between
      machines with different character set, end of line
      conventions, etc.  This is not quite the same as "network
      file system" or "netbios" protocols, which will be
      described later.  Instead, FTP is a utility that you run
      any time you want to access a file on another system.  You
      use it to copy the file to your own system.  You then can
      work with the local copy.  (See RFC 959 for specifications
      for FTP.)

    - Remote Login -- The network terminal protocol (TELNET)
      allows a user to log in on any other computer on the
      network.  You start a remote session by specifying a
      computer to connect to.  From that time until you finish
      the session, anything you type is sent to the other
      computer.  Note that you are really still talking to your
      own computer, but the telnet program effectively makes your
      computer invisible while it is running.  Every character
      you type is sent directly to the other system.  Generally,
      the connection to the remote computer behaves much like a
      dialup connection.  That is, the remote system will ask you
      to log in and give a password, in whatever manner it would
      normally ask a user who had just dialed it up.

      When you log off of the other computer, the telnet program
      exits, and you will find yourself talking to your own
      computer.  Microcomputer implementations of telnet
      generally include a terminal emulator for some common type
      of terminal.  (See RFCs 854 and 855 for specifications for
      telnet.  By the way, the telnet protocol should not be
      confused with Telenet, a vendor of commercial network
      services.)

    - Computer Mail -- This allows you to send messages to users
      on other computers.  Originally, people tended to use only
      one or two specific computers and they would maintain "mail
      files" on those machines.  The computer mail system is
      simply a way for you to add a message to another user's
      mail file.  There are some problems with this in an
      environment where microcomputers are used.

      The most serious is that a micro is not well suited to
      receive computer mail.  When you send mail, the mail
      software expects to be able to open a connection to the
      addressee's computer, in order to send the mail.  If this
      is a microcomputer, it may be turned off, or it may be
      running an application other than the mail system.  For
      this reason, mail is normally handled by a larger system,
      where it is practical to have a mail server running all the
      time.  Microcomputer mail software then becomes a user
      interface that retrieves mail from the mail server.  (See
      RFC 821 and 822 for specifications for computer mail.  See
      RFC 937 for a protocol designed for microcomputers to use
      in reading mail from a mail server.)

These services should be present in any implementation of TCP/IP,
except that micro-oriented implementations may not support
computer mail.  These traditional applications still play a very
important role in TCP/IP-based networks.  However more recently,
the way in which networks are used has been changing.  The older
model of a number of large, self-sufficient computers is
beginning to change.  Now many installations have several kinds
of computers, including microcomputers, workstations,
minicomputers, and mainframes.  These computers are likely to be
configured to perform specialized tasks.  Although people are
still likely to work with one specific computer, that computer
will call on other systems on the net for specialized services.
This has led to the "server/client" model of network services.  A
server is a system that provides a specific service for the rest
of the network.  A client is another system that uses that
service.  Note that the server and client need not be on
different computers.  They could be different programs running on
the same computer.  Here are the kinds of servers typically
present in a modern computer setup.  Also note that these
computer services can all be provided within the framework of
TCP/IP.

-  Network file systems.  This allows a system to access files on
   another computer in a somewhat more closely integrated fashion
   than FTP.  A network file system provides the illusion that
   disks or other devices from one system are directly connected
   to other systems.  There is no need to use a special network
   utility to access a file on another system.  Your computer
   simply thinks it has some extra disk drives.  These extra
   "virtual" drives refer to the other system's disks.  This
   capability is useful for several different purposes.  It lets
   you put large disks on a few computers, but still give others
   access to the disk space.  Aside from the obvious economic
   benefits, this allows people working on several computers to
   share common files.  It makes system maintenance and backup
   easier, because you don't have to worry about updating and
   backing up copies on lots of different machines.  A number of
   vendors now offer high-performance diskless computers.  These
   computers have no disk drives at all.  They are entirely
   dependent upon disks attached to common "file servers".  (See
   RFC's 1001 and 1002 for a description of PC-oriented NetBIOS
   over TCP.  In the workstation and minicomputer area, Sun's
   Network File System is more likely to be used.  Protocol
   specifications for it are available from Sun Microsystems.) -
   remote printing.  This allows you to access printers on other
   computers as if they were directly attached to yours.  (The
   most commonly used protocol is the remote lineprinter protocol
   from Berkeley Unix.  Unfortunately, there is no protocol
   document for this.  However the C code is easily obtained from
   Berkeley, so implementations are common.)

-  Remote execution.  This allows you to request that a
   particular program be run on a different computer.  This is
   useful when you can do most of your work on a small computer,
   but a few tasks require the resources of a larger system.
   There are a number of different kinds of remote execution.
   Some operate on a command by command basis.  That is, you
   request that a specific command or set of commands should run
   on some specific computer.  (More sophisticated versions will
   choose a system that happens to be free.) However there are
   also "remote procedure call" systems that allow a program to
   call a subroutine that will run on another computer.  (There
   are many protocols of this sort.  Berkeley Unix contains two
   servers to execute commands remotely:  rsh and rexec.  The
   Unix "man" pages describe the protocols that they use.  The
   user-contributed software with Berkeley 4.3 contains a
   "distributed shell" that will distribute tasks among a set of
   systems, depending upon load.

-  Name servers.  In large installations, there are a number of
   different collections of names that have to be managed.  This
   includes users and their passwords, names and network
   addresses for computers, and accounts.  It becomes very
   tedious to keep this data up to date on all of the computers.
   Thus the databases are kept on a small number of systems.
   Other systems access the data over the network.  (RFC 822 and
   823 describe the name server protocol used to keep track of
   host names and Internet addresses on the Internet.  This is
   now a required part of any TCP/IP implementation.  IEN 116
   describes an older name server protocol that is used by a few
   terminal servers and other products to look up host names.
   Sun's Yellow Pages system is designed as a general mechanism
   to handle user names, file sharing groups, and other databases
   commonly used by Unix systems.  It is widely available
   commercially.  Its protocol definition is available from Sun.)

-  Terminal servers.  Many installations no longer connect
   terminals directly to computers.  Instead they connect them to
   terminal servers.  A terminal server is simply a small
   computer that only knows how to run telnet (or some other
   protocol to do remote login).  If your terminal is connected
   to one of these, you simply type the name of a computer, and
   you are connected to it.  Generally it is possible to have
   active connections to more than one computer at the same time.
   The terminal server will have provisions to switch between
   connections rapidly, and to notify you when output is waiting
   for another connection.  (Terminal servers use the telnet
   protocol, already mentioned.  However any real terminal server
   will also have to support name service and a number of other
   protocols.)

-  Network-oriented window systems.  Until recently,
   high-performance graphics programs had to execute on a
   computer that had a bit-mapped graphics screen directly
   attached to it.  Network window systems allow a program to use
   a display on a different computer.  Full-scale network window
   systems provide an interface that lets you distribute jobs to
   the systems that are best suited to handle them, but still
   give you a single graphically-based user interface.  (The most
   widely-implemented window system is X.  A protocol description
   is available from MIT's Project Athena.  A reference
   implementation is publically available from MIT.  A number of
   vendors are also supporting NeWS, a window system defined by
   Sun.  Both of these systems are designed to use TCP/IP.)

Note that some of the protocols described above were designed by
Berkeley, Sun, or other organizations.  Thus they are not
officially part of the Internet protocol suite.  However they are
implemented using TCP/IP, just as normal TCP/IP application
protocols are.  Since the protocol definitions are not considered
proprietary, and since commercially-supported implementations are
widely available, it is reasonable to think of these protocols as
being effectively part of the Internet suite.

Note that the list above is simply a sample of the sort of
services available through TCP/IP.  However it does contain the
majority of the "major" applications.  The other commonly-used
protocols tend to be specialized facilities for getting
information of various kinds, such as who is logged in, the time
of day, etc.  However if you need a facility that is not listed
here, I encourage you to look through the current edition of
Internet Protocols (currently RFC 1011), which lists all of the
available protocols, and also to look at some of the major TCP/IP
implementations to see what various vendors have added.


General Description Of The TCP/IP Protocols
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TCP/IP is a layered set of protocols.  In order to understand
what this means, it is useful to look at an example.  A typical
situation is sending mail.  First, there is a protocol for mail.
This defines a set of commands which one machine sends to
another, e.g. commands to specify who the sender of the message
is, who it is being sent to, and then the text of the message.
However this protocol assumes that there is a way to communicate
reliably between the two computers.  Mail, like other application
protocols, simply defines a set of commands and messages to be
sent.  It is designed to be used together with TCP and IP.

TCP is responsible for making sure that the commands get through
to the other end.  It keeps track of what is sent, and
retransmitts anything that did not get through.  If any message
is too large for one datagram, e.g. the text of the mail, TCP
will split it up into several datagrams, and make sure that they
all arrive correctly.  Since these functions are needed for many
applications, they are put together into a separate protocol,
rather than being part of the specifications for sending mail.
You can think of TCP as forming a library of routines that
applications can use when they need reliable network
communications with another computer.

Similarly, TCP calls on the services of IP.  Although the
services that TCP supplies are needed by many applications, there
are still some kinds of applications that don't need them.
However there are some services that every application needs.  So
these services are put together into IP.  As with TCP, you can
think of IP as a library of routines that TCP calls on, but which
is also available to applications that don't use TCP.  This
strategy of building several levels of protocol is called
"layering."  I like to think of the applications programs such as
mail, TCP, and IP, as being separate "layers," each of which
calls on the services of the layer below it.  Generally, TCP/IP
applications use 4 layers:

- An application protocol such as mail.

- A protocol such as TCP that provides services need by many
applications.

- IP, which provides the basic service of getting datagrams to
  their destination.

- The protocols needed to manage a specific physical medium, such
  as Ethernet or a point to point line.

TCP/IP is based on the "catenet model."  (This is described in
more detail in IEN 48.)  This model assumes that there are a
large number of independent networks connected together by
gateways.  The user should be able to access computers or other
resources on any of these networks.  Datagrams will often pass
through a dozen different networks before getting to their final
destination.  The routing needed to accomplish this should be
completely invisible to the user.  As far as the user is
concerned, all he needs to know in order to access another system
is an "Internet address."  This is an address that looks like
128.6.4.194.  It is actually a 32-bit number.  However it is
normally written as 4 decimal numbers, each representing 8 bits
of the address.  (The term "octet" is used by Internet
documentation for such 8-bit chunks.  The term "byte" is not
used, because TCP/IP is supported by some computers that have
byte sizes other than 8 bits.)

Generally the structure of the address gives you some information
about how to get to the system.  For example, 128.6 is a network
number assigned by a central authority to Rutgers University.
Rutgers uses the next octet to indicate which of the campus
Ethernets is involved.  128.6.4 happens to be an Ethernet used by
the Computer Science Department. The last octet allows for up to
254 systems on each Ethernet.  (It is 254 because 0 and 255 are
not allowed, for reasons that will be discussed later.)  Note
that 128.6.4.194 and 128.6.5.194 would be different systems.  The
structure of an Internet address is described in a bit more
detail later.

Of course I normally refer to systems by name, rather than by
Internet address.  When I specify a name, the network software
looks it up in a database, and comes up with the corresponding
Internet address.  Most of the network software deals strictly in
terms of the address.  (RFC 882 describes the name server
technology used to handle this lookup.)

TCP/IP is built on "connectionless" technology.  Information is
transfered as a sequence of "datagrams."  A datagram is a
collection of data that is sent as a single message.  Each of
these datagrams is sent through the network individually.  There
are provisions to open connections (i.e. to start a conversation
that will continue for some time).  However at some level,
information from those connections is broken up into datagrams,
and those datagrams are treated by the network as completely
separate.  For example, suppose you want to transfer a 15000
octet file.  Most networks can't handle a 15000 octet datagram.
So the protocols will break this up into something like 30
500-octet datagrams.  Each of these datagrams will be sent to the
other end.  At that point, they will be put back together into
the 15000-octet file.  However while those datagrams are in
transit, the network doesn't know that there is any connection
between them.  It is perfectly possible that datagram 14 will
actually arrive before datagram 13.  It is also possible that
somewhere in the network, an error will occur, and some datagram
won't get through at all.  In that case, that datagram has to be
sent again.

Note by the way that the terms "datagram" and "packet" often seem
to be nearly interchangable.  Technically, datagram is the right
word to use when describing TCP/IP.  A datagram is a unit of
data, which is what the protocols deal with.  A packet is a
physical thing, appearing on an Ethernet or some wire.  In most
cases a packet simply contains a datagram, so there is very
little difference.  However they can differ.  When TCP/IP is used
on top of X.25, the X.25 interface breaks the datagrams up into
128-byte packets.  This is invisible to IP, because the packets
are put back together into a single datagram at the other end
before being processed by TCP/IP.  So in this case, one IP
datagram would be carried by several packets.  However with most
media, there are efficiency advantages to sending one datagram
per packet, and so the distinction tends to vanish.


* The TCP level

Two separate protocols are involved in handling TCP/IP datagrams.
TCP (the "transmission control protocol") is responsible for
breaking up the message into datagrams, reassembling them at the
other end, resending anything that gets lost, and putting things
back in the right order.  IP (the "internet protocol") is
responsible for routing individual datagrams.  It may seem like
TCP is doing all the work.  However in the Internet, simply
getting a datagram to its destination can be a complex job.  A
connection may require the datagram to go through several
networks at Rutgers, a serial line to the John von Neuman
Supercomputer Center, a couple of Ethernets there, a series of
56Kbaud phone lines to another NSFnet site, and more Ethernets on
another campus.  Keeping track of the routes to all of the
destinations and handling incompatibilities among different
transport media turns out to be a complex job.  Note that the
interface between TCP and IP is fairly simple.  TCP simply hands
IP a datagram with a destination.  IP doesn't know how this
datagram relates to any datagram before it or after it.

It may have occurred to you that something is missing here.  I
have talked about Internet addresses, but not about how you keep
track of multiple connections to a given system.  Clearly it
isn't enough to get a datagram to the right destination.  TCP has
to know which connection this datagram is part of.  This task is
referred to as "demultiplexing."  In fact, there are several
levels of demultiplexing going on in TCP/IP.  The information
needed to do this demultiplexing is contained in a series of
"headers."  A header is simply a few extra octets tacked onto the
beginning of a datagram by some protocol in order to keep track
of it.  It's a lot like putting a letter into an envelope and
putting an address on the outside of the envelope.  Except with
modern networks it happens several times.  It's like you put the
letter into a little envelope, your secretary puts that into a
somewhat bigger envelope, the campus mail center puts that
envelope into a still bigger one, etc.  Here is an overview of
the headers that get stuck on a message that passes through a
typical TCP/IP network:

It starts with a single data stream, say a file you are trying to
send to some other computer:

     ......................................................

TCP breaks it up into manageable chunks.  (In order to do this,
TCP has to know how large a datagram your network can handle.
Actually, the TCP's at each end say how big a datagram they can
handle, and then they pick the smallest size.)

     .... .... .... .... .... .... .... ....

TCP puts a header at the front of each datagram.  This header
actually contains at least 20 octets, but the most important ones
are a source and destination "port number" and a "sequence
number."  The port numbers are used to keep track of different
conversations.  Suppose 3 different people are transferring
files.  Your TCP might allocate port numbers 1000, 1001, and 1002
to these transfers.  When you are sending a datagram, this
becomes the "source" port number, since you are the source of the
datagram.  Of course the TCP at the other end has assigned a port
number of its own for the conversation.  Your TCP has to know the
port number used by the other end as well.  (It finds out when
the connection starts, as I will explain below.)  It puts this in
the "destination" port field.  Of course if the other end sends a
datagram back to you, the source and destination port numbers
will be reversed, since then it will be the source and you will
be the destination.  Each datagram has a sequence number.  This
is used so that the other end can make sure that it gets the
datagrams in the right order, and that it hasn't missed any.
(See the TCP specification for details.)  TCP doesn't number the
datagrams, but the octets.  So if there are 500 octets of data in
each datagram, the first datagram might be numbered 0, the second
500, the next 1000, the next 1500, etc.  Finally, I will mention
the Checksum.  This is a number that is computed by adding up all
the octets in the datagram (more or less - see the TCP spec).
The result is put in the header.  TCP at the other end computes
the checksum again.  If they disagree, then something bad
happened to the datagram in transmission, and it is thrown away.
So here's what the datagram looks like now.

       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |          Source Port           |       Destination Port       |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                         Sequence Number                       |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |                      Acknowledgment Number                    |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |  Data |           |U|A|P|R|S|F|                               |
       | Offset| Reserved  |R|C|S|S|Y|I|            Window             |
       |       |           |G|K|H|T|N|N|                               |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |           Checksum            |         Urgent Pointer        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |   your data ... next 500 octets                               |
       |   ......                                                      |

If you abbreviate the TCP header as "T", the whole file now looks like this:

     T.... T.... T.... T.... T.... T.... T....

You will note that there are items in the header that I have not
described above.  They are generally involved with managing the
connection.  In order to make sure the datagram has arrived at
its destination, the recipient has to send back an
"acknowledgement."  This is a datagram whose "Acknowledgement
number" field is filled in.  For example, sending a packet with
an acknowledgement of 1500 indicates that you have received all
the data up to octet number 1500.  If the sender doesn't get an
acknowledgement within a reasonable amount of time, it sends the
data again.  The window is used to control how much data can be
in transit at any one time.  It is not practical to wait for each
datagram to be acknowledged before sending the next one.  That
would slow things down too much.  On the other hand, you can't
just keep sending, or a fast computer might overrun the capacity
of a slow one to absorb data.  Thus each end indicates how much
new data it is currently prepared to absorb by putting the number
of octets in its "Window" field.  As the computer receives data,
the amount of space left in its window decreases.  When it goes
to zero, the sender has to stop.  As the receiver processes the
data, it increases its window, indicating that it is ready to
accept more data. Often the same datagram can be used to
acknowledge receipt of a set of data and to give permission for
additional new data (by an updated window).  The "Urgent" field
allows one end to tell the other to skip ahead in its processing
to a particular octet.  This is often useful for handling
asynchronous events, for example when you type a control
character or other command that interrupts output.  The other
fields are not pertinent to understanding what I am trying to
explain in this article.


* The IP Level

TCP sends each datagram to IP.  Of course it has to tell IP the
Internet address of the computer at the other end.  Note that
this is all IP is concerned about.  It doesn't care about what is
in the datagram, or even in the TCP header.  IP's job is simply
to find a route for the datagram and get it to the other end.  In
order to allow gateways or other intermediate systems to forward
the datagram, it adds its own header.  The main things in this
header are the source and destination Internet address (32-bit
addresses, like 128.6.4.194), the protocol number, and another
checksum.  The source Internet address is simply the address of
your machine.  (This is necessary so the other end knows where
the datagram came from.)  The destination Internet address is the
address of the other machine.  (This is necessary so any gateways
in the middle know where you want the datagram to go.)  The
protocol number tells IP at the other end to send the datagram to
TCP.

Although most IP traffic uses TCP, there are other protocols that
can use IP, so you have to tell IP which protocol to send the
datagram to.  Finally, the checksum allows IP at the other end to
verify that the header wasn't damaged in transit.  Note that TCP
and IP have separate checksums.  IP needs to be able to verify
that the header didn't get damaged in transit, or it could send a
message to the wrong place.  It is both more efficient and safer
to have TCP compute a separate checksum for the TCP header and
data.  Once IP has tacked on its header, here's what the message
looks like:

      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |Version|  IHL  |Type of Service|          Total Length         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |         Identification        |Flags|      Fragment Offset    |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Time to Live |    Protocol   |         Header Checksum       |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                       Source Address                          |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                    Destination Address                        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  TCP header, then your data ......                            |
      |                                                               |

If you represent the IP header by an "I", your file now looks like this:

     IT....   IT....   IT....   IT....   IT....   IT....   IT....

Again, the header contains some additional fields that will not
be discussed in this article because they are not relevent to
understanding the process.  The flags and fragment offset are
used to keep track of the pieces when a datagram has to be split
up.  This can happen when datagrams are forwarded through a
network for which they are too big.  (This will be discussed a
bit more below.) The time to live is a number that is decremented
whenever the datagram passes through a system.  When it goes to
zero, the datagram is discarded.  This is done in case a loop
develops in the system somehow.  Of course this should be
impossible, but well-designed networks are built to cope with
"impossible" conditions.

At this point, it's possible that no more headers are needed.  If
your computer happens to have a direct phone line connecting it
to the destination computer, or to a gateway, it may simply send
the datagrams out on the line (though likely a synchronous
protocol such as HDLC would be used, and it would add at least a
few octets at the beginning and end).


* The Ethernet Level

Most networks these days use Ethernet which has its own
addresses.  The people who designed Ethernet wanted to make sure
that no two machines would end up with the same Ethernet address.
Furthermore, they didn't want the user to have to worry about
assigning addresses.  So each Ethernet controller comes with an
address built-in from the factory.  In order to make sure that
they would never have to reuse addresses, the Ethernet designers
allocated 48 bits for the Ethernet address.  People who make
Ethernet equipment have to register with a central authority, to
make sure that the numbers they assign don't overlap any other
manufacturer.  Ethernet is a "broadcast medium."  That is, it is
in effect like an old party line telephone.  When you send a
packet out on the Ethernet, every machine on the network sees the
packet.  So something is needed to make sure that the right
machine gets it.  As you might guess, this involves the Ethernet
header.

Every Ethernet packet has a 14-octet header that includes the
source and destination Ethernet address, and a type code.  Each
machine is supposed to pay attention only to packets with its own
Ethernet address in the destination field.  (It's perfectly
possible to cheat, which is one reason that Ethernet
communications are not terribly secure.)  Note that there is no
connection between the Ethernet address and the Internet address.
Each machine has to have a table of what Ethernet address
corresponds to what Internet address.  (I will describe how this
table is constructed a bit later.)  In addition to the addresses,
the header contains a type code.  The type code is to allow for
several different protocol families to be used on the same
network.  So you can use TCP/IP, DECnet, Xerox NS, etc. at the
same time. Each of them will put a different value in the type
field.  Finally, there is a checksum.  The Ethernet controller
computes a checksum of the entire packet.  When the other end
receives the packet, it recomputes the checksum, and throws the
packet away if the answer disagrees with the original.  The
checksum is put on the end of the packet, not in the header.  The
final result is that your message looks like this:

      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |       Ethernet destination address (first 32 bits)            |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      | Ethernet dest (last 16 bits)  |Ethernet source (first 16 bits)|
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |       Ethernet source address (last 32 bits)                  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |        Type code              |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  IP header, then TCP header, then your data                   |
      |                                                               |
          ...
      |                                                               |
      |   end of your data                                            |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                       Ethernet Checksum                       |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

If you represent the Ethernet header with "E", and the Ethernet
checksum with "C", your file now looks like this:

     EIT....C   EIT....C   EIT....C   EIT....C   EIT....C

When these packets are received by the other end, of course all
the headers are removed.  The Ethernet interface removes the
Ethernet header and the checksum.  It looks at the type code.
Since the type code is the one assigned to IP, the Ethernet
device driver passes the datagram up to IP.  IP removes the IP
header.  It looks at the IP protocol field.  Since the protocol
type is TCP, it passes the datagram up to TCP.  TCP now looks at
the sequence number.  It uses the sequence numbers and other
information to combine all the datagrams into the original file.

This ends my initial summary of TCP/IP.  There are still some
crucial concepts I have not gotten to, so in part two, I will go
back and add details in several areas.  (For detailed
descriptions of the items discussed here see, RFC 793 for TCP,
RFC 791 for IP, and RFC's 894 and 826 for sending IP over
Ethernet.)
__________________________________________________________________

