产生RST的几个原因

1、请求超时

有89、27两台主机。主机89向主机27发送了一个SYN,表示希望连接8888端口,主机27回应了主机89一个SYN表示可以连接。但是主机89莫名其妙的发送了一个RST表示我不想连接你了。经过排查发现,在主机89上的程序在建立了socket之后,用setsockopt的SO_RCVTIMEO选项设置了recv 的超时时间为100ms。而抓包结果表示,从主机89发出SYN到接收SYN的时间多达110ms。因此主机89上的程序认为接收超时,所以发送了RST拒绝进一步发送数据。

2、只要TCP栈的读缓冲里还有未读取(read)数据,则调用close时会直接向对端发送RST。比如客户端一次发送100个字节,但是服务器read设置最多读取90个,read一次后就不再read,所以还有10个在缓冲区,服务器执行close,服务器会发送RST

如果客户端第一次发送100个字节,服务器read最多读取100个,read一次把数据全部读出来了,然后客户端再发送100个字节,但是服务器没有read,执行close,执行的是四次挥手

推断:有两个接收缓冲区,一个是应用层层面,一个是传输层层面,使用read会把数据从传输层层面搬运到应用层层面,只有应用层层面有数据然后close才会发送RST

3、端口未打开

主机241向主机114发送一个SYN请求,表示想要连接主机114的40000端口,但是主机114上根本没有打开40000这个端口,于是就向主机241发送了一个RST

4、server端调用close()或者调用shutdown()关闭读之后,client端write

当server端close套接字的时候,假设此时server端的接收缓冲区没有数据了。则close发送的是FIN,client端如果收到FIN之后,调用read函数,是返回0的,因为FIN的接收,表明client端以后再无数据可以接收,因为对方发来FIN,就表明对方不再发送数据了。然后client发送应答ack报文,表明收到FIN报文,server收到ack报文之后,就进去了FIN_WAIT_2阶段,根据tcp协议,向一个 FIN_WAIT2 状态的服务 TCP(已 ACK 响应 FIN 分节)写入数据不成问题,所以此时我们可以在client端调用write函数,写入client端的发送缓冲区,由tcp连接,发送到server的接收缓冲区。但是此时,由于server端已经关闭了socket(Socket.close()方法的语义和TCP的“FIN”标志语义不一样:发送TCP的“FIN”标志表示我不再发送数据了,而Socket.close()表示我不再发送也不接受数据了),所以此时的接收缓冲区的内容都被抛弃,同时server端返回RST。收到RST的client端,如果调用read函数,读取,是返回ECONNRESET错误的

client接收到RST后会出现两种情况:

1、client端调用了read函数,知道server端发送了RST,但是我们的client对这个RST错误,不采取处理,继续调用write,write()会返回 epipe 错误,内核将向客户进程发送 SIGPIPE 信号,该信号默认会使进程终止(此时该前台进程未进行 core dump)。所以,向一个 FIN_WAIT2 状态的服务 TCP(已 ACK 响应 FIN 分节)写入数据不成问题,但是写一个已接收了 RST 的 Socket 则是一个错误。

2、client收到RST段后无法立刻通知应用层(比如来不及调用read函数),只把这个状态保存在TCP协议层。如果client再次调用write发数据给server,write()会返回 epipe 错误,由于TCP协议层已经处于RST状态了,因此不会将数据发出,而是发一个SIGPIPE信号给应用层,SIGPIPE信号的缺省处理动作是终止程序。

server端调用shutdown()关闭读通道,client端还继续向server端发送数据,此时server端会发送一个RST给client端

5、keepalive数据包可达对方,但是对方端口号不存在

6、使用SO_LINGER规定close()行为是发送RST,而不是发送FIN。

7、服务器端和客户端建立好连接,服务器断网重启,端口号不变,此时客户端没有检测到服务器重启仍向服务器发送数据,则收到服务器发来的RST;同样的,客户端断网,重新连接网络,但是没有连接服务器,此时服务器没有检测到客户端断网重连仍向客户端发送数据,则收到客户端发来的RST

8、进程奔溃(比如Qt编写的上位机由于内存释放导致进程异常退出),会发送RST

9、客户端或服务器 FIN_WAIT_2 超时,发送RST

------以上有很多条(比如3、4、5、7)符合一个规律(收到RST):数据发到对方,对方连着网络(即IP存在),但是端口不存在或者其他信息被清除了,则发送方会收到对方发来的RST

------其他情况属于主动发送RST

RST介绍

1. 发送RST包关闭连接时,不必等缓冲区的包都发出去,直接就丢弃缓冲区中的包,发送RST。

2. 而接收端收到RST包后,也不必发送ACK包来确认。接收端收到RST知道发送端是异常关闭

TCP ------ RST的产生的更多相关文章

  1. TCP 中出现RST的情况

    http://www.360doc.com/content/13/0702/10/1073512_297069771.shtml 原 几种TCP连接中出现RST的情况 发表于1年前(2013-05-0 ...

  2. 几种TCP连接中出现RST的情况(转载)

    TCP RST 网络 linux 目录[-] 1 端口未打开 2 请求超时 3 提前关闭 4 在一个已关闭的socket上收到数据 总结 参考文献: 应该没有人会质疑,现在是一个网络时代了.应该不少程 ...

  3. 转发 通过NAT和防火墙特性和TCP穿透的测评(翻译)

    转自 http://blog.csdn.net/sjin_1314/article/details/18178329 原文:Characterization and Measurement of TC ...

  4. TCP SYN扫描学习笔记

    1.TCP SYN包扫描主机状态的原理:tcp协议规定,当目标主机收到一个tcp syn 包时,若目标主机处于开放状态,会返回给源主机一个tcp ack 包(目的端口开放),或者向源主机发送一个tcp ...

  5. 实验 Attacks on TCP/IP Protocols

    ------- 转载请注明出处,博客园-lasgalen-http://www.cnblogs.com/lasgalen/p/4555648.html ------- 1 实验目的 进行这个实验的目的 ...

  6. TCP/IP网络协议攻击

    kali视频学习请看 http://www.cnblogs.com/lidong20179210/p/8909569.html 这部分涉及: ARP缓存欺骗攻击 ICMP重定向攻击 SYN FLOOD ...

  7. Multipath TCP and load balancers

    Load balancers play a very important role in today’s Internet. Most Internet services are provided b ...

  8. Systemtap examples, Network - 4 Monitoring TCP Packets

    http://blog.163.com/digoal@126/blog/static/16387704020131014104256627/   例子来自tcpdumplike.stp脚本, 当tcp ...

  9. 负载均衡服务TCP端口健康检查成功,为什么在后端业务日志中出现网络连接异常信息?

    负载均衡服务TCP端口健康检查成功,为什么在后端业务日志中出现网络连接异常信息? 原文: https://help.aliyun.com/document_detail/127193.html?spm ...

随机推荐

  1. go学习笔记-面向对象(Methods, Interfaces)

    面向对象(Methods, Interfaces) Method method是附属在一个给定的类型上的,他的语法和函数的声明语法几乎一样,只是在func后面增加了一个receiver(也就是meth ...

  2. ES6--Set之再理解

    Set 其实2016年就看过阮大神的ECMAScript 6 入门,当时看了Set之后,大致看懂了,但事实上根本没有理解Set到底是什么,所以更记不住,平时做项目大多用到的还是ES5的传统写法,以至于 ...

  3. python2.7入门---循环语句(for&嵌套循环)

        咱们直接先来看for循环.Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串.然后再来看一下它的语法结构: for iterating_var in sequence: ...

  4. kylin实战系列(一)

    kylin实战系列(一) 把之前kylin的实践小结一下,以备以后查看.

  5. 发布npm包 登录报错 E409 Conflict

    1.到官网注册个账号,并且验证完邮箱:https://www.npmjs.com/ 2.打开cmd命令行 登录:$npm login 根据提示 一步步完成登录. 3.新建一个项目文件夹: npmtes ...

  6. Qt Qwdget 汽车仪表知识点拆解2 图像放大

    先贴上效果图,注意,没有写逻辑,都是乱动的 这里讲下 这个小汽车的进入过程,其实这个说白了就没有技术含量了,本来应该趁着这个机会学习一下Qt的动画机制,不过随机一想,这个自己写也累不到那里去 下面说下 ...

  7. 一丶人生苦短,我用python【第一篇】

    1 解释器 解释器(英语:Interpreter),又译为直译器,是一种电脑程序,能够把高级编程语言一行一行直接转译运行.解释器不会一次把整个程序转译出来,只像一位"中间人",每次 ...

  8. Leetcode代码补全——二叉树

    在刷leetcode的过程中发现,在原网页输入答案是不需要自己构筑树和链表的,虽然便于直接思考算法,但是久而久之类似过于依赖编辑器,反而不知道如何创建树和链表,因此总结了该网页省略的部分,以其中题为例 ...

  9. xadmin站点管理面样样式控制

    xadmin可以使用的页面样式控制基本与Django原生的admin一直. list_display 控制列表展示的字段 search_fields 控制可以通过搜索框搜索的字段名称,xadmin使用 ...

  10. python基础篇 05字典

    本节主要内容:1. 字典的简单介绍2. 字典增删改查和其他操作3. 字典的嵌套 一. 字典的简单介绍:字典(dict)是python中唯一的一个映射类型.他是以{ }括起来的键值对组成. 在dict中 ...