What's wrong with Berkeley Unix
University of California at Berkeley has been funded by
DARPA to modify the Unix system in a number of ways. Included in
these modifications is support for the Internet protocols. In
earlier versions (e.g. BSD 4.2) there was good support for the
basic Internet protocols (TCP, IP, SMTP, ARP) which allowed it to
perform nicely on IP ethernets and smaller Internets. There were
deficiencies, however, when it was connected to complicated
networks. Most of these problems have been resolved under the
newest release (BSD 4.3). Since it is the springboard from which
many vendors have launched Unix implementations (either by porting
the existing code or by using it as a model), many implementations
(e.g. Ultrix) are still based on BSD 4.2. Therefore, many
implementations still exist with the BSD 4.2 problems. As time
goes on, when BSD 4.3 trickles through vendors as new release,
many of the problems will be resolved. Following is a list of some
problem scenarios and their handling under each of these releases.
- ICMP redirects
-
Under the Internet model, all a system needs to know to
get anywhere in the Internet is its own address, the
address of where it wants to go, and how to reach a
gateway which knows about the Internet. It doesn't
have to be the best gateway. If the system is on a
network with multiple gateways, and a host sends a
packet for delivery to a gateway which feels another
directly connected gateway is more appropriate, the
gateway sends the sender a message. This message is an
ICMP redirect, which politely says "I'll deliver this
message for you, but you really ought to use that gateway
over there to reach this host". BSD 4.2 ignores
these messages. This creates more stress on the gateways
and the local network, since for every packet
sent, the gateway sends a packet to the originator.
BSD 4.3 uses the redirect to update its routing tables,
will use the route until it times out, then revert to
the use of the route it thinks is should use. The
whole process then repeats, but it is far better than
one per packet.
- Trailers
-
An application (like FTP) sends a string of octets to
TCP which breaks it into chunks, and adds a TCP header.
TCP then sends blocks of data to IP which adds its own
headers and ships the packets over the network. All
this prepending of the data with headers causes memory
moves in both the sending and the receiving machines.
Someone got the bright idea that if packets were long
and they stuck the headers on the end (they became
trailers), the receiving machine could put the packet
on the beginning of a page boundary and if the trailer
was OK merely delete it and transfer control of the
page with no memory moves involved. The problem is
that trailers were never standardized and most gateways
don't know to look for the routing information at the
end of the block. When trailers are used, the machine
typically works fine on the local network (no gateways
involved) and for short blocks through gateways (on
which trailers aren't used). So TELNET and FTP's of
very short files work just fine and FTP's of long files
seem to hang. On BSD 4.2 trailers are a boot option
and one should make sure they are off when using the
Internet. BSD 4.3 negotiates trailers, so it uses them
on its local net and doesn't use them when going across
the network.
- Retransmissions
-
TCP fires off blocks to its partner at the far end of
the connection. If it doesn't receive an acknowledgement
in a reasonable amount of time it retransmits the
blocks. The determination of what is reasonable is
done by TCP's retransmission algorithm. There is no
correct algorithm but some are better than others,
where better is measured by the number of retransmissions
done unnecessarily. BSD 4.2 had a retransmission
algorithm which retransmitted quickly and often. This
is exactly what you would want if you had a bunch of
machines on an ethernet (a low delay network of large
bandwidth). If you have a network of relatively longer
delay and scarce bandwidth (e.g. 56kb lines), it tends
to retransmit too aggressively. Therefore, it makes
the networks and gateways pass more traffic than is
really necessary for a given conversation. Retransmission
algorithms do adapt to the delay of the network
after a few packets, but 4.2's adapts slowly in delay
situations. BSD 4.3 does a lot better and tries to do
the best for both worlds. It fires off a few
retransmissions really quickly assuming it is on a low
delay network, and then backs off very quickly. It
also allows the delay to be about 4 minutes before it
gives up and declares the connection broken.