1.6.2. Transmission Control Protocol
Applications
that require
the transport protocol to provide reliable
data delivery use TCP because it verifies that data is delivered
across the network accurately and in the proper sequence. TCP is a
reliable,
connection-oriented,
byte-stream protocol. Let's look at each
of these characteristics in more detail.
TCP provides reliability
with
a mechanism called Positive Acknowledgment with
Re-transmission (PAR).
Simply stated, a system using PAR sends the data again
unless it hears from the remote system that the
data arrived OK. The unit of data exchanged between cooperating TCP
modules is called a segment
(see
Figure 1-9). Each segment contains a checksum
that the
recipient uses to verify that the data is undamaged. If the data
segment is received undamaged, the receiver sends a
positive acknowledgment back to the sender. If
the data segment is damaged, the receiver discards it. After an
appropriate timeout
period, the
sending TCP module re-transmits any segment for which no positive
acknowledgment has been received.
Figure 1-9. TCP segment format
TCP is connection-oriented. It establishes a
logical end-to-end connection between the two communicating hosts.
Control information, called a handshake,
is exchanged
between the two endpoints to establish a dialogue before data is
transmitted. TCP indicates the control function of a segment by
setting the appropriate bit in the Flags field in word 4 of the
segment header.
The type of handshake used by TCP is called a three-way
handshake because three segments are exchanged.
Figure 1-10 shows the simplest form of the three-way
handshake. Host A begins the connection by
sending host B a segment with the
"Synchronize sequence numbers" (SYN)
bit
set. This segment tells host B that
A wishes to set up a connection, and it tells
B what sequence number host
A will use as a starting number for its
segments. (Sequence numbers are used to keep data in the proper
order.) Host B responds to
A with a segment that has the
"Acknowledgment" (ACK) and SYN bits set.
B's segment acknowledges the receipt of
A's segment, and informs
A which sequence number host
B will start with. Finally, host
A sends a segment that acknowledges receipt of
B's segment, and transfers the first
actual data.
Figure 1-10. Three-way handshake
After this exchange, host A's TCP has
positive evidence that the remote TCP is alive and ready to receive
data. As soon as the connection is established, data can be
transferred. When the cooperating modules have concluded the data
transfers, they will exchange a three-way handshake with segments
containing the "No more data from sender" bit (called the
FIN bit) to close the connection. It is
the end-to-end exchange of data that provides the logical connection
between the two systems.
TCP views the data it sends as a continuous stream of bytes, not as
independent packets. Therefore, TCP takes care to maintain the
sequence in which bytes are sent and received. The
Sequence Number and
Acknowledgment Number fields in the TCP
segment header keep track of the bytes.
The TCP standard does not require that each system start numbering
bytes with any specific number; each system chooses the number it
will use as a starting point. To keep track of the data stream
correctly, each end of the connection must know the other end's
initial number. The two ends of the connection synchronize
byte-numbering systems by
exchanging SYN segments during the handshake. The Sequence Number
field in the SYN segment contains the Initial Sequence
Number (ISN), which is the starting point for
the byte-numbering system. For security reasons
the ISN should be a random number.
Each byte of data is numbered sequentially from the ISN, so the first
real byte of data sent has a Sequence Number of ISN+1. The Sequence
Number in the header of a data segment identifies the sequential
position in the data stream of the first data byte in the segment.
For example, if the first byte in the data stream was sequence number
1 (ISN=0) and 4000 bytes of data have already been transferred, then
the first byte of data in the current segment is byte 4001, and the
Sequence Number would be 4001.
The Acknowledgment Segment (ACK) performs
two functions: positive acknowledgment and
flow control. The acknowledgment tells the sender
how much data has been received and how much more the receiver can
accept. The Acknowledgment Number is the sequence number of the next
byte the receiver expects to receive. The standard does not require
an individual acknowledgment for every packet. The acknowledgment
number is a positive acknowledgment of all bytes up to that number.
For example, if the first byte sent was numbered 1 and 2000 bytes
have been successfully received, the Acknowledgment Number would be
2001.
The Window field contains the
window, or the number of bytes the remote end is
able to accept. If the receiver is capable of accepting 6000 more
bytes, the window would be 6000. The window indicates to the sender
that it can continue sending segments as long as the total number of
bytes that it sends is smaller than the window of bytes that the
receiver can accept. The receiver controls the flow of bytes from the
sender by changing the size of the window. A zero window tells the
sender to cease transmission until it receives a non-zero window
value.
Figure 1-11 shows a TCP data stream that starts with
an Initial Sequence Number of 0. The receiving system has received
and acknowledged 2000 bytes, so the current Acknowledgment Number is
2001. The receiver also has enough buffer space for another 6000
bytes, so it has advertised a window of 6000. The sender is currently
sending a segment of 1000 bytes starting with Sequence Number 4001.
The sender has received no acknowledgment for the bytes from 2001 on,
but continues sending data as long as it is within the window. If the
sender fills the window and receives no acknowledgment of the data
previously sent, it will, after an appropriate timeout, send the data
again starting from the first unacknowledged byte.
Figure 1-11. TCP data stream
In Figure 1-11 re-transmission would start from byte
2001 if no further acknowledgments are received. This procedure
ensures that data is reliably received at the far end of the network.
TCP is also responsible for delivering data received from IP to the
correct application. The application that the data is bound for is
identified by a 16-bit number called the port
number.
The Source
Port
and Destination
Port are contained in the first word of the
segment header. Correctly passing data to and from the Application
Layer is an important part of what the Transport Layer services do.