TCP ------ RST的产生
产生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的产生的更多相关文章
- TCP 中出现RST的情况
http://www.360doc.com/content/13/0702/10/1073512_297069771.shtml 原 几种TCP连接中出现RST的情况 发表于1年前(2013-05-0 ...
- 几种TCP连接中出现RST的情况(转载)
TCP RST 网络 linux 目录[-] 1 端口未打开 2 请求超时 3 提前关闭 4 在一个已关闭的socket上收到数据 总结 参考文献: 应该没有人会质疑,现在是一个网络时代了.应该不少程 ...
- 转发 通过NAT和防火墙特性和TCP穿透的测评(翻译)
转自 http://blog.csdn.net/sjin_1314/article/details/18178329 原文:Characterization and Measurement of TC ...
- TCP SYN扫描学习笔记
1.TCP SYN包扫描主机状态的原理:tcp协议规定,当目标主机收到一个tcp syn 包时,若目标主机处于开放状态,会返回给源主机一个tcp ack 包(目的端口开放),或者向源主机发送一个tcp ...
- 实验 Attacks on TCP/IP Protocols
------- 转载请注明出处,博客园-lasgalen-http://www.cnblogs.com/lasgalen/p/4555648.html ------- 1 实验目的 进行这个实验的目的 ...
- TCP/IP网络协议攻击
kali视频学习请看 http://www.cnblogs.com/lidong20179210/p/8909569.html 这部分涉及: ARP缓存欺骗攻击 ICMP重定向攻击 SYN FLOOD ...
- Multipath TCP and load balancers
Load balancers play a very important role in today’s Internet. Most Internet services are provided b ...
- Systemtap examples, Network - 4 Monitoring TCP Packets
http://blog.163.com/digoal@126/blog/static/16387704020131014104256627/ 例子来自tcpdumplike.stp脚本, 当tcp ...
- 负载均衡服务TCP端口健康检查成功,为什么在后端业务日志中出现网络连接异常信息?
负载均衡服务TCP端口健康检查成功,为什么在后端业务日志中出现网络连接异常信息? 原文: https://help.aliyun.com/document_detail/127193.html?spm ...
随机推荐
- IO复用——epoll系列系统调用
1.内核事件表 epoll是Linux特有的I/O复用函数.epoll把用户关心的文件描述上的事件放在内核里的一个事件表中,并用一个额外的文件描述符来标识该内核事件表.这个额外文件描述符使用函数epo ...
- go学习笔记-程序测试
程序测试 测试是一个可重复的过程,它验证某个东西是否按预期工作.一般通过 go test 进行测试,步骤如下 首先,是我们的文件名.Go 要求所有的测试都在以 _test.go 结尾的文件中.这使得我 ...
- C# 控制台应用程序输出颜色字体
最佳解决方案的代码: static void Main(string[] args) { Console.ForegroundColor = ConsoleColor.Green; Console.W ...
- Code First Migrations更新数据库结构(数据迁移) 【转】
注意:一旦正常后,每次数据库有变化,做如下两步: 1. Enable-Migrations 2.update-database 背景 code first起初当修改model后,要持久化至数据库中时, ...
- 2016年JD工作遇到的问题:1-5,搭建环境和熟悉项目过程中的坑
1.更新不需要权限的项目A,却提示没有权限. 先从Git上更新项目A的代码,提示没有权限. 然后从Git上更新其它项目B的代码,正常. 再更新项目A的代码,正常了. 奇葩问题! 2.Eclipse中, ...
- [转载]Java类打包成JAR文件
原文传送门:http://www.2cto.com/kf/201204/129495.html 使用的工具及环境: MyEclipse 7.5 Java Enterprise.JDK1.6.0 打包J ...
- SharePoint显示错误信息
在SharePoint项目中,一般如果发生错误,SharePoint会弹出它自定义的报错页面,一般就显示"Something went wrong",如果光是看这一句话, ...
- C++学习002-C++代码中插入汇编语句
在C++中我们有时会遇到使用汇编语言的情况,这时可以在前面加上关键字“_asm”宏. 如下示例 编写环境 :vs2015 int main() { __asm mov al, 0x20; __asm ...
- 剑指offer-链表中倒数第K个结点14
题目描述 输入一个链表,输出该链表中倒数第k个结点. class Solution: def FindKthToTail(self, head, k): # write code here res=[ ...
- LeetCode - 67. Add Binary(4ms)
Given two binary strings, return their sum (also a binary string). The input strings are both non-em ...