TCP首部字段有6个是flags,每个标志位有特殊的含义,它们可以单独存在,也可以同时存在。对于接收方,不同的标志位代表不同的意思,需要做正确的处理

Flags

可以在点击以太网报文结构查看各协议层协议首部字段及其含义

TCP协议首部格式

上图标注的红圈里有6个标志位,每个标志位占用一个比特

URG

紧急指针有效标识。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)

ACK

确认序号有效标识。只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效

PSH

标识接收方应该尽快将这个报文段交给应用层。接收到PSH = 1的TCP报文段,应尽快的交付接收应用进程,而不再等待整个缓存都填满了后再向上交付

RST

重建连接标识。当RST=1时,表明TCP连接中出现严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立连接

SYN

同步序号标识,用来发起一个连接。SYN=1表示这是一个连接请求或连接接受请求

FIN

发端完成发送任务标识。用来释放一个连接。FIN=1表明此报文段的发送端的数据已经发送完毕,并要求释放连接

RST

RST

Reset,复位标志,用于非正常地关闭连接。它是TCP协议首部里的一个标志位。发送RST包关闭连接时,直接丢弃缓冲区的包发送RST包(这个和发FIN包不同)。而接收端收到RST包后,也不必发送ACK包来确认

如何触发

正常地关闭连接用FIN标志位,但FIN标志位不能用来处理异常情况

举例

客户端和服务器TCP连接正常,突然服务器掉电重启,与客户端的TCP连接状态由于掉电而完全消失。之后,客户端发给服务器任何消息,都会触发服务器发RST作为回应。服务器之所以发RST,是因为连接不存在,通过Reset状态位,间接告诉客户端异常情况的存在。如果Reset顺利到达客户端,客户端意识到异常发生了,会立马释放该TCP连接所占用的内存资源(状态、数据)、以及端口号,且不会回复ACK

连接未监听的端口

连接一个未监听的端口,则被连接方会发送一个RST。也就是说主机传输层TCP程序接收到一个SYN包,而这个SYN包目的端口并没有socket监听,那么主机的协议栈会直接回复一个RST

目的主机或网络路径中的防火墙拦截

如果目的主机或者网络路径中显式的设置了对数据包的拦截

使用iptables对主机的防火墙添加了一条规则,对于目的端口是60000的TCP报文,丢弃并回复RST

socket接收缓冲区Recv-Q中的数据未完全被应用程序读取时关闭该socket

接收到的数据缓存在缓冲区Recv-Q,它们等待被上层应用取走,如果缓冲区Recv-Q有数据未被应用取走,而此时调用了socket.close()方法强行关闭TCP连接,那么TCP协议程序发送的就不是FIN,而是RST

向已关闭的socket发送数据

顾名思义,主机传输层TCP协议程序接收到一条TCP数据报,而目的端口并没有socket监听,那么主机的协议栈会直接回复一个RST

向已关闭的连接发送FIN

主机传输层TCP协议程序接收到一条FIN,而目的端口并没有socket监听,那么主机的协议栈会直接回复一个RST

向已经消逝的连接中发送数据

和上面的举例相同

请求超时后收到回复

主机创建socket,设置SO_RCVTIMEOUT选项为100ms,向对端发送SYN,过了100ms后才收到ACK+SYN,那么主机的协议栈会直接回复一个RST

SO_LINGER

socket设置SO_LINGER选项,socket调用close()函数时,会直接丢弃缓冲区Send_Q未发完的数据,并发送RST

Linux下启用TIME_WAIT快速回收

修改/etc/sysctl.conf中内核参数:
net.ipv4.tcp_tw_recycle = 1
当收到的SYN包的timestamp比上次的小时,就会发RST

TCP socket在任何状态下,只要收到RST包,即可进入CLOSED初始状态,不会有任何回应。至于是否通知上层应用,要根据应用程序是阻塞模式还是非阻塞模式:

阻塞模型下,内核无法主动通知应用层出错,只有应用层主动调用read()或者write()这样的IO系统调用时,内核才会利用出错来通知应用层对端RST

非阻塞模型下,select或者epoll会返回sockfd可读,应用层对其进行读取时,read()会报错RST

总结

  • FIN是客户端或服务器正常关闭tcp连接发的包,发送缓冲区Send-Q数据发完才会发FIN

  • RST是客户端或服务器异常关闭tcp连接发的包,通常都是主机收到不存在的tcp通道的tcp报文,主机“被迫”回复RST告知对方tcp连接异常,收到RST的一方就会关闭这个socket,释放所有socket信息,且不会回复ACK


TCP协议的RST标志位相关推荐

  1. TCP协议的RST标志

    下文中的内容多数来自[参考]中的文章,这边进行一个整理和总结,后续会慢慢增加出现各个 RST 包的测试代码,便于理解. TCP的 "断开连接" 标志 RST 标志 Reset,复位 ...

  2. 笔记:TCP协议(PSH标志)

    PSH标志位 单词PUSH,意思是"推". 接收缓冲区和发送缓冲区 进程A发送数据时,并不是直接发送,而是先写到自己的发送缓冲区.接收进程B接收到TCP报文时,会先将数据放入接收缓 ...

  3. TCP协议之RST与FIN

    FIN 如下图所示,FIN表示正常关闭连接,没有数据丢失,缓冲区所有数据包都发送完成才会发送FIN包,这与RST不同. RST RST表示复位,用来异常的关闭连接,在TCP的设计中它是不可或缺的.发送 ...

  4. TCP协议(标志位URG、PSH,定时器,连接的建立和断开)

    目录 ●TCP段格式 ●TCP定时器 ●TCP三次握手和四次挥手 ●TCP段格式 6位标志位有紧急标志URG.推送标志PSH.确认标志ACK.复位标志RST.链接同步标志SYN以及结束标志FIN. ○ ...

  5. TCP标志位 FIN和RST的区别

    大家都知道TCP释放连接需要四次挥手, 主动释放端会发送FIN包,并且因为TCP是双工的, 关闭一个方向上的数据流,从而TCP连接处于半关闭状态,这也是为什么需要"四次"挥手的原因 ...

  6. TCP标志位 RST作用、原理、攻击

    TCP报头的标志位 TCP报头中一共有六个标志位:URG/ACK/PSH/RST/SYN/FIN.  SYN TCP三次握手中,如果A是发起端,则A就对服务器发一个SYN报文.表示建立连接. ACK ...

  7. TCP协议中的URG和PSH位

    相关背景知识 http://blog.csdn.net/double_happiness/article/details/74025156 在探讨TCP协议中的URG和PSH控制位时,我们先来简单的复 ...

  8. 计算机网络 | 传输层 :UDP与TCP协议详解

    传输层 UDP UDP的协议格式 UDP的特点 基于UDP的应用层知名协议 UDP如何实现可靠传输 TCP TCP的协议格式 TCP的特点 连接管理机制 三次握手 四次挥手 保活机制 问题补充 可靠传 ...

  9. 关于TCP协议的几个问题

    本文来说下关于TCP协议的几个问题. 文章目录 传输层 TCP/UDP DNS DNS 讲解 DNS 样例 TCP TCP 头部讲解 TCP 三次握手 TCP 数据传输大致流程 TCP 状态查询 TC ...

  10. Linux网络-UDP/TCP协议详解

    Linux网络-UDP/TCP协议详解 零.前言 一.UDP协议 二.TCP协议 1.应答机制 2.序号机制 3.超时重传机制 4.连接管理机制 三次握手 四次挥手 5.理解CLOSE_WAIT状态 ...

最新文章

  1. 科大星云诗社动态20210329
  2. [BUUCTF-pwn]——ciscn_2019_n_8
  3. x265-创建encdata
  4. ssm旅游管理系统项目介绍_基于jsp的网络相册管理系统的设计与实现
  5. java中的正则操作总结
  6. 【EduCoder答案】时域采样定理
  7. 二叉树期权定价与BSM期权定价
  8. win10如何查看开机启动项
  9. 疯狂的世界,疯狂的人!
  10. 价值投资如何判断市场是否高估
  11. 【Ubuntu升级报错】“the following signatures couldn’t be verified because the public key is not available”
  12. AARRR模型的使用注意事项【防坑提醒】
  13. 枸杞“黑金”,养生效果就选它
  14. pycharm运行Project Interpreter是空的怎么办?
  15. 历代华为P系列主要参数对比,更新于2021年7月
  16. 苹果iOS系统最新市占率统计:iOS 11份额达到52%
  17. Android 仿京东淘宝 商品详情页 商品图片效果
  18. HDU 1506 解题报告 Largest Rectangle in a Histogram (单调栈)
  19. HashMap是什么
  20. 怎么卸载光速头条_我用这三招,整理了桌面并且屏蔽了广告弹窗

热门文章

  1. Airflow PythonOperator、BashOperator以及Xcom使用
  2. 新猿木子李:0基础学python培训教程 Python操作Redis
  3. MySQL具体解释(5)-----------函数超全总结
  4. 深入理解操作系统实验——bomb lab(作弊方法2)
  5. mmo mysql_一次MMO游戏服务器性能压测记录
  6. 浙江大学 找出直系亲属(java)
  7. matlab-线性代数 det 各阶主子式、余子式、代数余子式
  8. Windows——打印机错误(操作无法完成(错误 0x000006ba)。本地打印机后台处理程序服务没有运行。请重新启动打印机后台处理程序或重新启动计算机。)解决方案
  9. OnlyOffice快速入门
  10. 性能和稳定性测试报告模板