UNIX网络编程中RST分节总结

定义: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的实现都是忽略新的SYNspa

 

2.若是杀掉服务器端处理客户端的子进程,进程退出后,关闭它打开的全部文件描述符,此时,当服务器TCP接收到来自此客户端的数据时,因为先前打开的那个套接字接口的进程已终止,因此以RST响应。

常常遇到的问题:.net

若是不判断read , write函数的返回值,就不知道服务器是否响应了RST, 此时客户端若是向接收了RST的套接口进行写操做时,内核给该进程发一个SIGPIPE信号。此信号的缺省行为就是终止进程,因此,进程必须捕获它以避免不情愿地被终止。unix

进程不管是捕获了该信号并从其信号处理程序返回,仍是不理会该信号,写操做都返回EPIPE错误。htm

 

3.服务器主机崩溃后重启

若是服务器主机与客户端创建链接后崩溃,若是此时,客户端向服务器发送数据,而服务器已经崩溃不能响应客户端ACK,客户TCP将持续重传数据分节,试图从服务器上接收一个ACK,若是服务器一直崩溃客户端会发现服务器已经崩溃或目的地不可达,但可能须要比较长的时间; 若是服务器在客户端发现崩溃前重启,服务器的TCP丢失了崩溃前的全部链接信息,因此服务器TCP对接收的客户数据分节以RST响应。

参考资料:http://blog.chinaunix.net/uid-24410388-id-3947704.html        

             http://blog.csdn.net/seu_lyr/article/details/8596122

相关文章
相关标签/搜索