The Window Flag
The
Window size is
considered to be one of the most important flags
within the TCP header. This field is used by the
receiver to indicate to the sender the amount of
data that it is able to accept. Regardless of who
the sender or receiver is, the field will always
exist and be used.
You
will notice that the largest portion of this page is
dedicated to the Window
size field. The reason behind this is because this
field is of great importance. The
Window size
field is the key to efficient data transfers and
flow control. It trully is amazing once you start to
realise how important this flag is and how many
functions it contains.
The
Window size
field uses 'bytes' as a metric. So in our example
above, the number 64,240 is equal to 64,240 bytes,
or 62.7 kb (64,240/1024).
The
62.7 kbytes reflects the amount of data the receiver
is able to accept, before transmitting to the sender
(the server) a new Window value. When the amount of
data transmitted is equal to the current Window
value, the sender will expect a new Window value
from the receiver, along with an acknowledgement for
the Window just received.
The
above process is required in order to maintain
flawless data transmission and high efficiency. We
should however note that the Window size field
selected is not in any case just a random value, but
one calculated using special formulas like the one
in our example below:
In this
example, Host A is
connected to a Web server via a 10 Mbit link.
According to our formula, to calculate the best
Window value we need the following information:
Bandwidth and
Delay. We are
aware of the link's
bandwidth:
10,000,000 bits (10 Mbits), and we can easily
find out the delay by issuing a 'ping' from
Host A to the
Web server which
gives us an average Round Trip Time response (RTT)
of 10 milliseconds
or 0.01 seconds.
We are
then able to use this information to calculate the
most efficient Window
size (WS):
WS =
10,000,000 x
0.01 =>
WS =
100,000 bits or
(100,000/8)/1024 = 12,5
kbytes
For 10
Mbps bandwidth and a round-trip delay of 0.01 sec,
this gives a window size of about 12 kb or nine
1460-byte segments:
This
should yield maximum throughput on a 10 Mbps LAN,
even if the delay is as high as 10 ms because most
LANs have round-trip delay of less than a few
milliseconds. When bandwidth is lower, more delay
can be tolerated for the same fixed window size, so
a window size of 12 kb works well at lower speeds,
too.
Windowing
- A Form of Flow Control
Apart
from the Windowing concept being a key factor for
efficient data transmission, it is also a form of
flow control, where a host (the receiver) is able to
indicate to the other (the sender) how much data it
can accept and then wait for further instructions.
The
fact is that in almost all cases, the default value
of 62 kbytes is used as a Window size. In addition,
even though a Window size of 62 kbytes might have
been selected by the receiver, the link is
constantly monitored for packet losses and delays
during the data transfer by both hosts, resulting in
small increases or decreases of the original Window
size in order to optimise the bandwidth utilisation
and data throughput.
This
automatic self-correcting mechanisim ensures that
the two hosts will try to make use of the pipe
linking them in the best possible way, but do keep
in mind that this is not a guarantee that they will
always succeed. This is generally the reason why a
user is able to manually modify the Window size
until the best value is found and this, as we
explained, depends greatly on the link between the
hosts and its delay.
In the
case where the Window
size falls to zero, the remote TCP can send no more
data. It must wait until buffer space becomes
available and it receives a packet announcing a
non-zero Window size.
Lastly,
for those who deal with Cisco routers, you might be
interested to know that you are able to configure
the Window size
on Cisco routers running the Cisco IOS v9 and
greater. Routers with versions 12.2(8)T and above
support Window Scaling, a feature that's
automatically enabled for Window sizes above 65,535,
with a maximum value of 1,073,741,823 bytes!
Window
Scalling will be dealt with in greater depth on the
following page.
On the
Server Side: Larger Window Size = More Memory
Most
network administrators who have worked with very
busy web servers would recall the massive amounts of
memory they require. Since we now understand the
concept of a 'Window size', we are able to quickly
analyse how it affects busy web servers that have
thousands of clients connecting to them and
requesting data.
When a
client connects to a web server, the server is
required to reserve a small amount of memory (RAM)
aside for the client's session. The amount of
required memory is the same amount as the window
size and, as we have seen, this value depends on the
bandwidth and delay between the client and server.
To give
you an idea how the window size affects the server's
requirements in memory, let's take an example:
If you
had a web server that served
10,000 clients
on a local area network (LAN) running at
100 Mbits with a
0.1 second round
trip delay and wanted maximum performance/efficiency
for your file transfers, according to our formula,
you would need to allocate a window of
1.25 MB for each
client, or 12 Gigs
of memory for all your clients! Assuming of course
that all 10,000 clients are connected to your web
server simultaneously.
To
support large file transfers in both directions
(server to client and vice versa), your server would
need: [(100,000,000
x 0.1)
10,000 x 2] =
over 24 Gigs of
memory just for the socket buffers!
So you
can see how important it is for clients not to use
oversized window values! In fact, the current TCP
standard requires that the receiver must be capable
of accepting a full window's worth of data at all
times. If the receiver over-subscribes its buffer
space, it may have to drop an incoming packet. The
sender will discover this packet loss and invoke TCP
congestion control mechanisms even though the
network is not congested.
It is
clear that receivers should not over-subscribe
buffer space (window size) if they wish to maintain
high performance and avoid packet loss.
Checksum
Flag
The TCP
Checksum field
was created to ensure that the data contained in the
TCP segment reaches the correct destination and is
error-free. For those network gurus who are
wondering how TCP would ensure the segment arrives
to the correct destination (IP Address), you will be
happy to know that there is a little bit more
information used than just the TCP header to
calculate the checksum and, naturally, it would
include a portion of the IP Header.
This
'extra' piece of information is called the
pseudo-header and we will shortly analyse its
contents but, for now, let's view a visual
representation of the sections used to calculate the
TCP checksum:
The above
diagram shows you the
pseudo header, followed by the
TCP header and
the data
this segment contains. However, once again, be sure
to remember that the pseudo header is included in
the Checksum
calculation to ensure the segment has arrived at the
correct receiver.
Let's now
take a look how the receiver is able to verify it is
the right receiver for the segment it just received
by analysing the pseudo
header.
The Pseudo
Header
The pseudo
header is a combination of 5 different fields, used
during the calculation of the TCP checksum. It is
important to note (and remember!) that the
pseudo header is not
transmitted to the receiver, but is simply involved
in the checksum calculation.
Here are
the 5 fields as they are defined by the TCP RFC: |