5.14 Crashing of Server Host
This scenario will test to see what happens when
the server host crashes. To simulate this, we must run the client
and server on different hosts. We then start the server, start the
client, type in a line to the client to verify that the connection
is up, disconnect the server host from the network, and type in
another line at the client. This also covers the scenario of the
server host being unreachable when the client sends data (i.e.,
some intermediate router goes down after the connection has been
established).
The following steps take place:
-
When the server
host crashes, nothing is sent out on the existing network
connections. That is, we are assuming the host crashes and is not
shut down by an operator (which we will cover in Section
5.16).
-
We
type a line of input to the client, it is written by
writen (Figure 5.5), and is
sent by the client TCP as a data segment. The client then blocks in
the call to readline, waiting for the echoed reply.
-
If we
watch the network with tcpdump, we will see the client TCP
continually retransmitting the data segment, trying to receive an
ACK from the server. Section 25.11 of TCPv2 shows a typical pattern
for TCP retransmissions: Berkeley-derived implementations
retransmit the data segment 12 times, waiting for around 9 minutes
before giving up. When the client TCP finally gives up (assuming
the server host has not been rebooted during this time, or if the
server host has not crashed but was unreachable on the network,
assuming the host was still unreachable), an error is returned to
the client process. Since the client is blocked in the call to
readline, it returns an error. Assuming the server host
crashed and there were no responses at all to the client's data
segments, the error is ETIMEDOUT. But if some intermediate
router determined that the server host was unreachable and
responded with an ICMP "destination unreachable' message, the error
is either EHOSTUNREACH or ENETUNREACH.
Although our client discovers (eventually) that
the peer is down or unreachable, there are times when we want to
detect this quicker than having to wait nine minutes. The solution
is to place a timeout on the call to readline, which we
will discuss in Section 14.2.
The scenario that we just discussed detects that
the server host has crashed only when we send data to that host. If
we want to detect the crashing of the server host even if we are
not actively sending it data, another technique is required. We
will discuss the SO_KEEPALIVE socket option in Section
7.5.
|