TCP的重置报文段,就是TCP发送了RST包到对端。
RST标志位在什么地方呢?我们通过TCP协议头部来看下(图片来自: TCP头部详解_却道天凉_好个秋的博客-CSDN博客_tcp头部)
很明显,RST与我们熟悉的SYN、ACK和FIN标志位同属一个级别。
但是日常工作中,我们对RST的使用不是很熟悉,本文就来介绍下哪些会产生RST的场景。
1.RST标志位场景 1.1 针对不存在的端口的连接请求这个场景很容易理解,如果我们telnet一个并不存在的端口,那么会被快速响应一个RST复位报文段
1.2 异常中止一个连接常规的中止连接的方式都是发送FIN标志位,这被称为有序释放。(因为FIN是在所有排队数据都已经发送后才被发送出去的,所以这种情况不会出现数据丢失)。
但是如果对端发送了一个RST标志位,那么这种被称为异常释放。(这种情况下,在排队的数据有可能会丢失,RST标志位会被立即发送出去)。
1.3 半开连接如果在未告知另一端的情况下,关闭或终止连接,那么认为该TCP连接处于半开状态。
如:A连接B,B服务器突然断电重启,那么此时对于A而言,它所在的连接就是一个半开连接(假定没有探活机制的情况下,A并不知道B已经宕机了)。
此时A再通过该TCP连接向服务端发送信息,由于B刚重启完,进程内没有任何该连接的情况,则此时会直接回复一个RST报文,终端连接。
2.Connection reset异常这个异常应该是日常比较常见的异常。
导致该异常的原因是:服务器端由于某种原因关闭了连接,而客户端依然在读写,此时服务器收到请求后,就会直接恢复RST,客户端就会收到java.net.SocketException: Connection reset
3.Connection reset by peer异常该异常与2中异常相似,一般都是服务端由于某种原因关闭了连接。但是区别在于:
* 服务器返回RST后,如果此时客户端正在从socket输出流中读数据则会提示:Connection reset;
* 服务器返回RST后,如果此时客户端正在从socket输入流中写数据则会提示:Connection reset by peer;
扩展:【TCP/IP详解】TCP重置报文段及RST常见场景分析_五虎山主的博客-CSDN博客_tcp重置包 带有C代码实战的重置报文段场景
异常记录——Connection reset_慕课手记 https请求出现connection reset的处理方案