RST为重置报文段,它会导致TCP连接的快速拆迁,且不需要ack进行确认。

1.针对不存在的端口的连请求

客户端:

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <netinet/tcp.h>
#define MAXLINE 4096 int main()
{
int sockfd,ret;
struct sockaddr_in servaddr;
char sendbuf[32740]={0}; sockfd=socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(8888);
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); ret=connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
printf("ret=%d\n",ret);
write(sockfd,sendbuf,sizeof(sendbuf)+1); getchar();
close(sockfd);
return 0;
}

编译并运行,此时没有服务端在8888端口进行监听,tcpdump抓包看。

07:19:32.643476 IP 127.0.0.1.49028 > 127.0.0.1.ddi-tcp-1: Flags [S], seq 1270070893, win 65495, options [mss 65495,sackOK,TS val 3883769366 ecr 0,nop,wscale 7], length 0
07:19:32.643491 IP 127.0.0.1.ddi-tcp-1 > 127.0.0.1.49028: Flags [R.], seq 0, ack 1270070894, win 0, length 0

客户端发起连接,但受到一个RST包。

2.请求超时

因为客户端可以设置接收数据的超时时间,当客户端调用connect函数发送SYN时,由于客户端收到服务端的SYN/ACK的时间超过了客户端设置的等待时间,造成接收超时。当服务端的SYN/ACK到达时,客户端回应RST。

3.提前关闭

服务端:

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#define MAXLINE 4096 int main()
{
int listenfd,acceptfd,n;
socklen_t clilen;
char recvbuf[100]={0};
struct sockaddr_in cliaddr,servaddr; listenfd=socket(AF_INET,SOCK_STREAM,0);
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(8888);
servaddr.sin_addr.s_addr = INADDR_ANY; bind(listenfd,(struct sockaddr *)&servaddr,sizeof(struct sockaddr_in));
listen(listenfd,5); clilen=sizeof(cliaddr);
acceptfd=accept(listenfd,(struct sockaddr *)&cliaddr,&clilen); n=recv(acceptfd,recvbuf,sizeof(recvbuf)-1,0);
printf("n=%d\n",n); getchar();
close(acceptfd);
close(listenfd);
return 0;
}

客户端:

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <netinet/tcp.h>
#define MAXLINE 4096 int main()
{
int sockfd,ret;
struct sockaddr_in servaddr;
char sendbuf[1000]={0}; sockfd=socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(8888);
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); ret=connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
printf("ret=%d\n",ret); write(sockfd,sendbuf,sizeof(sendbuf)+1); getchar();
close(sockfd);
return 0;
}

先启动服务端,再启动客户端。客户端每次发送1001个字节,而服务端只接收了99个字节,还有剩下的字节在接收缓冲区里面。此时先关闭服务端,用tcpdump抓包查看。

16:28:06.149336 IP 127.0.0.1.49192 > 127.0.0.1.ddi-tcp-1: Flags [S], seq 3096824100, win 65495, options [mss 65495,sackOK,TS val 3916682872 ecr 0,nop,wscale 7], length 0
16:28:06.149354 IP 127.0.0.1.ddi-tcp-1 > 127.0.0.1.49192: Flags [S.], seq 1491431840, ack 3096824101, win 65483, options [mss 65495,sackOK,TS val 3916682872 ecr 3916682872,nop,wscale 7], length 0
16:28:06.149372 IP 127.0.0.1.49192 > 127.0.0.1.ddi-tcp-1: Flags [.], ack 1, win 512, options [nop,nop,TS val 3916682872 ecr 3916682872], length 0
16:28:06.149461 IP 127.0.0.1.49192 > 127.0.0.1.ddi-tcp-1: Flags [P.], seq 1:1002, ack 1, win 512, options [nop,nop,TS val 3916682872 ecr 3916682872], length 1001
16:28:06.149491 IP 127.0.0.1.ddi-tcp-1 > 127.0.0.1.49192: Flags [.], ack 1002, win 528, options [nop,nop,TS val 3916682872 ecr 3916682872], length 0
16:28:07.699933 IP 127.0.0.1.ddi-tcp-1 > 127.0.0.1.49192: Flags [R.], seq 1, ack 1002, win 528, options [nop,nop,TS val 3916684423 ecr 3916682872], length 0

服务端没有将数据全部接收完成,然后就关闭了,所以服务端产生了一个RST。

4.在一个已关闭的socket上发到数据

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#define MAXLINE 4096 int main()
{
int listenfd,acceptfd,n;
socklen_t clilen;
char recvbuf[100]={0};
struct sockaddr_in cliaddr,servaddr; listenfd=socket(AF_INET,SOCK_STREAM,0);
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(8888);
servaddr.sin_addr.s_addr = INADDR_ANY; bind(listenfd,(struct sockaddr *)&servaddr,sizeof(struct sockaddr_in));
listen(listenfd,5); clilen=sizeof(cliaddr);
acceptfd=accept(listenfd,(struct sockaddr *)&cliaddr,&clilen); getchar();
close(acceptfd);
close(listenfd);
return 0;
}

服务端:

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <netinet/tcp.h>
#define MAXLINE 4096 int main()
{
int sockfd,ret;
struct sockaddr_in servaddr;
char sendbuf[1000]={0}; sockfd=socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(8888);
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); ret=connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
printf("ret=%d\n",ret); getchar();
write(sockfd,sendbuf,sizeof(sendbuf)+1); getchar();
close(sockfd);
return 0;
}

先打开服务端,在打开客户端。然后关闭服务端,在客户端按下回车键键,用tcpdump抓包查看结果。

16:44:16.226353 IP 127.0.0.1.49194 > 127.0.0.1.ddi-tcp-1: Flags [S], seq 3249455833, win 65495, options [mss 65495,sackOK,TS val 3917652949 ecr 0,nop,wscale 7], length 0
16:44:16.226370 IP 127.0.0.1.ddi-tcp-1 > 127.0.0.1.49194: Flags [S.], seq 1092997986, ack 3249455834, win 65483, options [mss 65495,sackOK,TS val 3917652949 ecr 3917652949,nop,wscale 7], length 0
16:44:16.226387 IP 127.0.0.1.49194 > 127.0.0.1.ddi-tcp-1: Flags [.], ack 1, win 512, options [nop,nop,TS val 3917652949 ecr 3917652949], length 0
16:44:18.402946 IP 127.0.0.1.ddi-tcp-1 > 127.0.0.1.49194: Flags [F.], seq 1, ack 1, win 512, options [nop,nop,TS val 3917655126 ecr 3917652949], length 0
16:44:18.403887 IP 127.0.0.1.49194 > 127.0.0.1.ddi-tcp-1: Flags [.], ack 2, win 512, options [nop,nop,TS val 3917655127 ecr 3917655126], length 0
16:44:20.376861 IP 127.0.0.1.49194 > 127.0.0.1.ddi-tcp-1: Flags [P.], seq 1:1002, ack 2, win 512, options [nop,nop,TS val 3917657100 ecr 3917655126], length 1001
16:44:20.376874 IP 127.0.0.1.ddi-tcp-1 > 127.0.0.1.49194: Flags [R], seq 1092997988, win 0, length 0

客户端和服务端建立连接之后,服务端就关闭了。此时客户端再向服务端发送数据,此时服务端返回RST。

实战:tcp链接rst场景tcpdump分析的更多相关文章

  1. 【Cocos游戏实战】功夫小子第七课之游戏主功能场景逻辑功能和暂停功能场景的分析和实现

    CSDN的markdown编辑器是吃屎了么! !.什么玩意.!写了一半写不了东西还全没了,搞个毛线! 本节课的视频教程地址是:第七课在此 假设本教程有帮助到您,希望您能点击进去观看一下,并且如今注冊成 ...

  2. Ripple 20:Treck TCP/IP协议漏洞技术分析

    本文由“合天智汇”公众号首发,作者:b1ngo Ripple 20:Treck TCP/IP协议漏洞技术分析 Ripple20是一系列影响数亿台设备的0day(19个),是JSOF研究实验室在Trec ...

  3. Java SPI机制实战详解及源码分析

    背景介绍 提起SPI机制,可能很多人不太熟悉,它是由JDK直接提供的,全称为:Service Provider Interface.而在平时的使用过程中也很少遇到,但如果你阅读一些框架的源码时,会发现 ...

  4. 管中窥豹-ssh链接过多的问题分析及复盘

    缘起 某一天,产品侧同事联系过来,反馈话单传输程序报错,现象如下: 实际上,该节点仅提供了一个sftp服务,供产品侧传输话单过来进行临时存储,由计费部门取走而已. 分析 于是找运维同事上服务器看了下情 ...

  5. 5. 堪比JMeter的.Net压测工具 - Crank 实战篇 - 接口以及场景压测

    目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...

  6. 工业物联网或系统集成中应用消息队列(ActiveMQ,C#的demo)的场景全面分析

    1.[连载]<C#通讯(串口和网络)框架的设计与实现> 2.[开源]C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 2.应用SuperIO(SIO)和开源跨平台物联网框 ...

  7. HDInsight-Hadoop实战(一)站点日志分析

    HDInsight-Hadoop实战(一)站点日志分析 简单介绍 在此演示样例中.你将使用分析站点日志文件的 HDInsight 查询来深入了解客户使用站点的方式.借助此分析.你可查看外部站点一天内对 ...

  8. TCP 选项RST

    1.RST介绍 RST表示reset复位,用于异常情况下关闭连接. 发送RST包关闭连接时,不必等缓冲区的包都发出去,直接就丢弃缓冲区中的包. 而接收端收到RST包后,也不必发送ACK包来确认. 2. ...

  9. JVM源码分析-类加载场景实例分析

    A类调用B类的静态方法,除了加载B类,但是B类的一个未被调用的方法间接使用到的C类却也被加载了,这个有意思的场景来自一个提问:方法中使用的类型为何在未调用时尝试加载?. 场景如下: public cl ...

随机推荐

  1. 洛谷 P1236 算24点

    题目描述 几十年前全世界就流行一种数字游戏,至今仍有人乐此不疲.在中国我们把这种游戏称为"算24点".您作为游戏者将得到4个1~9之间的自然数作为操作数,而您的任务是对这4个操作数 ...

  2. jsp中一行多条数据情况

    1.实现效果:点击新增会在之前文本框后一直新增文本框并且保留新增的图片 效果图: 2.jsp代码: <table class="Business_Table"> < ...

  3. mipi差分信号原理

    差分信号,什么是差分信号 一个差分信号是用一个数值来表示两个物理量之间的差异.从严格意义上来讲,所有电压信号都是差分的,因为一个电压只能是相对于另一个电压而言的.在某些系统里,系统’地’被用作电压基准 ...

  4. bat 截取字符串(for命令) 推荐收藏

    摘自:http://www.jb51.net/article/50354.htm 今天需要用批处理命令处理文件夹中的文件,需要用到bat中的for命令以及字符串截取的一些命令.在上面的链接中找到许多有 ...

  5. CrystalQuartz实现Quartz的window服务的远程管理

    1. 建一个空的ASP.NET WebSite,利用NuGet安装CrystalQuartz.Remote 包 我们可以看到,配置文件中多了如下节点: <crystalQuartz> &l ...

  6. ASP.NET给前端动态添加修改 CSS样式JS 标题 关键字(转载)

    原文地址:http://www.cnblogs.com/xbhp/p/6392225.html 有很多网站读者能换自己喜欢的样式,还有一些网站想多站点共享后端代码而只动前段样式,可以采用动态替换CSS ...

  7. 可视图linux--ubuntu的安装以及tool的安装

    1.下载ubuntu:http://cn.ubuntu.com/download/ 右键然后选择复制链接地址,然后将这个地址粘贴到迅雷,下载速度会比浏览器下载快. 2.创建虚拟机,安装ubuntu-- ...

  8. bzoj 1620: [Usaco2008 Nov]Time Management 时间管理【贪心】

    按s从大到小排序,逆推时间模拟工作 #include<iostream> #include<cstdio> #include<algorithm> using na ...

  9. 使用nginx和tomcat配置反向代理和动静分离

    背景 本人主修的编程语言是Java语言,因此最开始接触的Web开发也是JSP技术.使用Java开发的Web应用需要部署在专门的服务器程序上运行,比如Tomcat.但是一般很少会有人将Tomcat作为用 ...

  10. akka监控框架设计

    本博客介绍一种AOP.无侵入的akka监控方案,方便大家在生产使用akka的过程中对akka进行监控. 对于自身javaer来说,AOP三个字母基本就解释清楚了akka监控框架的原理.哈哈哈,不过我这 ...