定义:RST表示复位,RST=1表示TCP中出现严重错误(因为主机崩溃或其它缘由),必须释放链接。RST=1还可用来拒绝一个非法的报文段或拒绝打开一个链接。发送RST后不会再有正常的四分组终止序列(Unix网络编程so_linger选项)。html
有三个条件能够产生RST:
*SYN到达某端口但此端口上没有正在监听的服务器(针对TCP而言,UDP则返回端口不可达ICMP错误)。
*TCP想取消一个已有链接(使用套接字SO_LINGER选项)。
*TCP接收了一个根本不存在的链接上的分节。编程
1. Connect 函数返回错误ECONNREFUSED:服务器
若是对客户的SYN的响应是RST,则代表该服务器主机在咱们指定的端口上没有进程在等待与之链接(例如服务器进程也许没有启动),这称为硬错(hard error),客户一接收到RST,立刻就返回错误ECONNREFUSED.网络
TCP为监听套接口维护两个队列。两个队列之和不超过listen函数第二个参数backlog。函数
当一个客户SYN到达时,若两个队列都是满的,TCP就忽略此分节,且不发送RST.这个由于:这种状况是暂时的,客户TCP将重发SYN,指望不久就能在队列中找到空闲条目。要是TCP服务器发送了一个RST,客户connect函数将当即发送一个错误,强制应用进程处理这种状况,而不是让TCP正常的重传机制来处理。还有,客户区别不了这两种状况:做为SYN的响应,意为“此端口上没有服务器”的RST和意为“有服务器在此端口上但其队列满”的RST.ui
Posix.1g容许如下两种处理方法:忽略新的SYN,或为此SYN响应一个RST.历史上,全部源自Berkeley的实现都是忽略新的SYN。spa
2.若是杀掉服务器端处理客户端的子进程,进程退出后,关闭它打开的全部文件描述符,此时,当服务器TCP接收到来自此客户端的数据时,因为先前打开的那个套接字接口的进程已终止,因此以RST响应。
常常遇到的问题:.net
若是不判断read , write函数的返回值,就不知道服务器是否响应了RST, 此时客户端若是向接收了RST的套接口进行写操做时,内核给该进程发一个SIGPIPE信号。此信号的缺省行为就是终止进程,因此,进程必须捕获它以避免不情愿地被终止。unix
进程不管是捕获了该信号并从其信号处理程序返回,仍是不理会该信号,写操做都返回EPIPE错误。htm
3.服务器主机崩溃后重启
若是服务器主机与客户端创建链接后崩溃,若是此时,客户端向服务器发送数据,而服务器已经崩溃不能响应客户端ACK,客户TCP将持续重传数据分节,试图从服务器上接收一个ACK,若是服务器一直崩溃客户端会发现服务器已经崩溃或目的地不可达,但可能须要比较长的时间; 若是服务器在客户端发现崩溃前重启,服务器的TCP丢失了崩溃前的全部链接信息,因此服务器TCP对接收的客户数据分节以RST响应。