Crashing of Server Host:
Next scenario is 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 server, start the client, type in a line to the client to
verifyIT2351-NPM/ U-2/ 13 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 (some
immediate router is down after the connection has been established).
The following steps take place.
1. 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 the operator
2. We type a line of input to the client, it is
written by writen 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 retransmit the data segment, trying to receive
ACK from the server. Berkley derived implementations transmit the date segments
12 times, waiting around 9 minutes before giving up. When the client finally
gives up, 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
had crashed and there were no responses
at all to the client‘s data segments, the error is ETIMEDOUT. But if
some intermediate router determine that the server was unreachable and
responded with ICMP destination unreachable
message, then error is either EHOSTUNREACH or
To detect that the server is unreachable even
before 9 minutes, place a time out call to readline. To find the crash of
server even if client is not sending data actively, another technique is used
which used SO_KEEPALIVE socket option
Shutdown of Server
Unix system is shutdown, the init process normally sends the SIGTERM signal to
all processes ( this signal can be caught), waits some fixed amount of time
(often between 5 and 20 seconds), and then sends SIGKILL signal (which we
cannot catch) to any process still running. This gives all running processes a
short amount of time to clean up and terminate.
If we do
not catch SIGTERM and terminate, our server will be terminated by SIGKILL
process terminates, all the open descriptors are closed, and we then follow the
same sequence of stepsdiscussed under ―termination of server process‖.
We need to select the select or poll function in the client to have
the client detect the termination of the server process as soon it occurs.