TCP连接中的RST包

#技术 #网络 #TCP

TCP协议的三次握手建立、与四次关闭,实际都是在一些特定包的沟通基础上完成的。 如下图示,为TCP的数据包的包头格式,数据包的类型也在此基础上确定。 tcp

其中的标志位,就标示此数据包的类型,对于SYN、ACK、PSH、URG、FIN这五类包,这儿不细说,本文主要 关注的是RST包。

在TCP协议中RST表示复位,用来处理异常的关闭连接,在TCP的设计中它是非常重要的。发送RST包关闭连接时,不必等缓冲区的包都发出去,可直接就丢弃缓存区的数据包 转而发送RST包。而接收端收到RST包后,也不必发送ACK包来确认, 直接对连接进行关闭处理。

RST包通常会在以下几种情况中出现。

###被请求端不存在相应的端口

这类情况,主要是指客户端通过connect连接服务端时,服务端所在host在接收到请求后发现本机没有对应的port侦听,此时就会发送一个RST包至客户机。

###请求超时

这类情况通常是指请求的数据在设置的超时时间之后,再得以返回,这种情况下,请求的客户可能会发送RST包至服务器。

###已经关闭的连接上收到数据

这类情况主要出现在连接的关闭过程,当请求关闭连接的一方在两个MSL后,仍然收到服务机发送来的最后一个FIN,说明其最后发送出的ACK丢包, 服务机又重发了FIN包,而此时客户机已经不处于TIME_OUT状态,连接已经彻底不存在,再收到服务机发送来的FIN,就会直接回复一个RST包,让服务机直接关闭连接,抛弃 缓冲区的所有数据。

###接收缓冲区还存在数据时,关闭连接

在请求方请求数据,未处理完缓冲区中的所有数据,就请求关闭连接时,请求方不会如预期的发送FIN包,进入4路关闭逻辑,而是可能会直接发送一个RST包强制完成连接的关闭。