服务器非正常退出情况

  正常情况是啥?一方发送FIN,另一方相应,四次挥手,断开连接。但是就像生活一样,服务器也总有意外,以下是《Unix网络编程》中提到的服务器的四种常见的意外情况。客户端在服务器端出现意外情况下是什么状况,又该该如何处理呢?

  首先给出整个网络的基本流程图。客户端从标准输入读入数据,发往服务器端,服务器接收到数据在发往客户端,正常情况下客户端将数据写标准输出,如此循环。其实就是个简单的echo服务器模型,《Unix网络编程》整本书都以此模型作为基础,下面将讨论服务器出错情况下,客户端的情况。

  

1. 服务器端进程终止:比如kill掉某一个服务端子进程(处理和该客户端连接的子进程,此时父进程和客户端程序之间已经没有了联系)

  服务器端子进程崩溃,会发送FIN到客户端,客户端相应ACK到服务器端,服务器端进入FIN_WAIT2状态,客户端进入CLOSE_WAIT状态,也就是四次挥手释放连接的前一部分完成。等待着客户端发送FIN,也就是调用close函数完成第二部分的连接释放。客户端此时恰恰阻塞在fget调用上,我们再在客户端终端输入一段文字,write发往客户端之后进入read阻塞状态,此时会收到服务端的FIN,read返回值为0(表示EOF),此时会打印出“服务器过早终止”,然后客户端程序退出。另一方面,write到服务端的数据因为没有对应的服务端子进程,因此会返回客户端RST,只是RST在客户端已经无法接收到而已———客户端程序已经关闭。

  这个例子有个问题,当FIN到达套接字时,程序正阻塞于fget系统调用,因此未能及时感知服务端子进程发送的终止信号。这也是后面引入IO复用的目的之一:一旦服务端子进程被杀死,客户端能立刻感知到。

2. SIGPIPE信号

  如果客户不理会read函数读写出现的错误,反而写入更多的数据呢?比如收到RST信号时候继续写入数据,此时内核会向进程发出EPIPE的错误。

3. 服务端主机崩溃:可以关机来模拟

  在这种情况下,服务端并不向客户端发出任何东西,客户端并不知道服务端主机崩溃。

  此时我们在客户端发送一行文字到服务端,然后在read调用,打开tcpdump观察,会发现文字进入TCP的重传阶段,时间长达9分钟(来自:Unix网络编程),最后终于放弃,最后发送给客户端一个“网络/主机不可达的错误”。

4. 主机崩溃后重启:重启主机来模拟

  客户端同样不知道服务端的主机崩溃并模拟的情况,此时发送一行文字到服务端,服务端由于已经丢失了之前的描述符,因此会回应RST,客户端此时正阻塞在read调用上,因此会返回ECONNRST错误。

5. 服务器主机关机,比如ubuntu的shutdown命令,情况同1

6. 拔掉网线的情况,情况同3.

7. 拔掉网线再插上。分两种情况:

   1)如果在客户端发送数据到服务器的过程中网线一直都是断开没有插上,则会向客户端返回网络不可达,情况同6.

  2)网线重新插上,此时会正常通信.

  客户端如何尽快感知服务端

 

时间: 2024-08-29 03:55:00

服务器非正常退出情况的相关文章

Vim中的swp文件,在vim非正常退出时,再次编辑会出问题

vim中的swp即swap文件,在编辑文件时产生,它是隐藏文件,如果原文件名是data,那么swp文件名就是.data.swp.如果文件正常退出,则此文件自动删除.以下两种情况不会删除swp文件: Vim非正常退出,这种情况下,除非手动删除swp文件(也可以在vim提示时删除),否则它会一直存在. 多个程序同时编辑一个文件. 可以通过选项禁止产生swp文件 set noswapfile

vim编辑时非正常退出处理方法

当我们在linux系统用vim编辑一个文件时,由于断电或其他的原因,比如用的ssh连接的端口,网络中断而关闭等.当再次编辑这个文件时会有提示: "filname.swp" already exists![O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit: 当再次按确认键,可进入编辑模式,每次进入都会问你一遍,比较麻烦,为了解决这个问题,我们很有必要讨论一下为什么会产生这个吧 因为当vim编辑一个文件时系统会自动产生一个相同文件作为备份,

Matlab 读取excel文件提示服务器出现意外情况或无法读取问题解决

1.问题描述: 该错误通常发生在应用函数读取excel文件(后缀xls或xlsx)时. 应用xlsread函数读取提示服务器出现意外情况: 应用importdata读取时提示can‘t open file: 其他格式如txt文档则可以正常读取. 2.问题解决 该问题与Matlab无关,为Excel端出现了问题.解决方案如下: 步骤:Excel选项——加载项——Com加载项 :去掉VisualStudion相关勾选. 去掉勾选的时候还可能出现“无法更改 中注册的office 加载项的连接状态”的提

在应用非正常退出时利用StateSaver来保存我们的数据

我们知道Ubuntu手机平台是一个单任务的系统.一个用户可以开启很多个应用,但是只有前台的应用是可以正在运行的应用.很多被推到后台的应用被驻存到内存中.如果有很多这样的被驻存的应用的话,内存迟早会被用完的.操作系统可以选择一些应用被杀死从而保证系统的正常运行.为了能够保证应用在退出时的状态,在Ubuntu系统上,我们设计了StateSaver这样的一个接口.它可以用来帮我们保存应用在非正常退出的状态,以便在应用重新启动后恢复以前的状态. 参照文章的设计,我们设计了如下的代码: import Qt

查看Linux服务器内存使用情况

一个服务器,最重要的资源之一就是内存,内存够不够用,是直接关系到系统性能的关键所在. 本文介绍如何查看Linux服务器内存使用情况, 1.free命令 free -m [[email protected] ~]# free -m            total       used       free     shared    buffers     cachedMem:          1526        182       1344          0         16  

Linux服务器用iotop命令分析服务器磁盘IO情况

Linux下的IO统计工具如iostat, nmon等大多数是只能统计到per设备的读写情况, 如果你想知道每个进程是如何使用IO的就比较麻烦.如果会systemtap, 或者blktrace这些事情难不到大家, 但是没专用工具总不是很舒服的. 幸运的是Linux 2.6.20内核以后提供了基于每个进程的IO记账功能,所以就有了类似iotop这样方便的工具.可以通过iotop工具进行分析,查看哪个进程占有读写比较高. 官网地址: http://guichaz.free.fr/iotop/ Iot

通过Nethogs查看服务器网卡流量情况

在日常运维工作中,会碰到服务器带宽飙升致使网站异常情况.作为运维人员,我们要能非常清楚地了解到服务器网卡的流量情况,观察到网卡的流量是由哪些程序在占用着. 今天介绍一款linux下查看服务器网卡流量占用情况的工具:Nethogs,来自github上的开源工具.它不依赖内核中的模块.当我们的服务器网络异常时,可以通过运行nethogs程序来检测是那个程序占用了大量带宽.节省了查找时间. Nethogs安装: 方法一:在epel源中可以直接yum安装[[email protected] src]#

mysql服务器内存使用情况总结

活动链接(动态)使用的内存数量如下所示: per_connection_memory = read_buffer_size //memory for sequential table scans +read_rnd_buffer_size // memory for buffering reads +sort_buffer_size // memory ofr in mem sorts +thread_stack //per connection memory +join_buffer_size

服务器资源使用情况统计--脚本

[[email protected] sjx]# cat per-html.sh #!/bin/bash perf () { # #    Size        Used        Avail        Use% # echo '<table border="0">' echo '<thead align="right">' echo -e "<tr>\n\t<th colspan='"5&qu