TCP协议的RST标志位
“TCP首部字段有6个是flags,每个标志位有特殊的含义,它们可以单独存在,也可以同时存在。对于接收方,不同的标志位代表不同的意思,需要做正确的处理”
可以在链接https://support.huawei.com/hedex/hdx.do?docid=EDOC1000105967查看各协议层协议首部字段及其含义
TCP协议首部格式
上图标注的红圈里有6个标志位,每个标志位占用一个比特
紧急指针有效标识。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)
ACK
确认序号有效标识。只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效
PSH
标识接收方应该尽快将这个报文段交给应用层。接收到PSH = 1的TCP报文段,应尽快的交付接收应用进程,而不再等待整个缓存都填满了后再向上交付
RST
重建连接标识。当RST=1时,表明TCP连接中出现严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立连接
SYN
同步序号标识,用来发起一个连接。SYN=1表示这是一个连接请求或连接接受请求
FIN
发端完成发送任务标识。用来释放一个连接。FIN=1表明此报文段的发送端的数据已经发送完毕,并要求释放连接
RST,Reset,复位标志,用于非正常地关闭连接。它是TCP协议首部里的一个标志位。发送RST包关闭连接时,直接丢弃缓冲区的包发送RST包(这个和发FIN包不同)。而接收端收到RST包后,也不必发送ACK包来确认
正常地关闭连接用FIN标志位,但FIN标志位不能用来处理异常情况
举例
连接未监听的端口
目的主机或网络路径中的防火墙拦截
socket接收缓冲区Recv-Q中的数据未完全被应用程序读取时关闭该socket
向已关闭的socket发送数据
向已关闭的连接发送FIN
主机传输层TCP协议程序接收到一条FIN,而目的端口并没有socket监听,那么主机的协议栈会直接回复一个RST
-
向已经消逝的连接中发送数据
请求超时后收到回复
SO_LINGER
Linux下启用TIME_WAIT快速回收
修改/etc/sysctl.conf中内核参数:
net.ipv4.tcp_tw_recycle = 1
-
FIN是客户端或服务器正常关闭tcp连接发的包,发送缓冲区Send-Q数据发完才会发FIN -
RST是客户端或服务器异常关闭tcp连接发的包,通常都是主机收到不存在的tcp通道的tcp报文,主机“被迫”回复RST告知对方tcp连接异常,收到RST的一方就会关闭这个socket,释放所有socket信息,且不会回复ACK