最近开发中遇到以下:需要客户端建立一个链接,然后服务器端持有这个链接,当有时间变换(如任务的状态改变),需要后端将事件推送给任务对应的责任人。因为博主之前也研究过WebSocket,开发了个简单的聊天室,但是这次这次应用到实际,我就在想TCP的这个长连接在不发生异常的情况下可以维持多久?在思考这个问题时,我就在想Http建立的TCP短连接,是什么时候断开连接的?基于这个问题,我就写了个简单的测试用例,通过tcpdump来抓包,对长连接和短连接进行对比分析。

​ 下面我们来简单的介绍下长连接和短连接的概念。

​ 首先是TCP,三次握手建立连接,四次挥手释放连接,示意图如下:

​ 短连接就如上图所示,数据传输完成后,一般由客户端发起释放连接的信号,也可以看到,短连接是进行一次请求,请求结束后断开连接,那就回到上面令博主疑惑的问题了,建立连接我们都知道,Http请求到达服务器,就会立刻建立TCP连接,那是什么时候断开的呢?是服务器return了结果后立刻结束么,还是别的情况,别急,后面我们会来给大家讲解。

​ 长连接,和短连接最简单最直接的区别就是,他是为了服务器和客户端间的一个频繁的交互,之前的浏览器端定时的ajax轮询会消耗大量的资源,现在已经很少有人使用了;另一个,长连接比短连接更大的一个优势就是,服务器端可以维护和客户端建立的这个TCP通信的channel,这样就可以让服务器主动的给客户端发送数据,也等同于实现了全双工通信,这个也是相比ajax轮询更大的一个优势,可以实现事件的实时通知。

基于上面所讲的,我们来分析下长连接和短连接的优缺点:

  1. 长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接;
  2. 长连接如果不主动关闭,这个连接会长久的存在,并且如果长连接滥用,或者不加任何限制,会导致连接数过多,会对服务器的产生较大的压力,因此长连接在使用时要慎用,做好评估和限制;
  3. 短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。

​ 下面,我们就开始使用tcpdump来进行抓包来分析上面让我们疑惑的两个问题,首先,我们启动服务端,长连接就是我们使用的WebSocket,短连接就是一个简单的无业务逻辑的一个接口,

​ 在电脑上启动tcpdump,命令如下,其中-w指定抓到的包的输入路径,如果没有-w的话,会将包输出到shell窗口:

sudo tcpdump -i lo0 -w /tmp/tcpdump/1.pcap port 8080

tcpdump命令的详解大家可以参考这篇博客:https://www.jianshu.com/p/b281964a8459

​ 本文为了更好的分析,将日志输出到文件,并使用wireshark软件进行分析,数据包如下:

​ 从中我们可以看到,红框中的为TCP连接建立的过程,红色箭头是创建WebSocket的请求,后面我们可以看到,数据反而发送就是TCP和WebSocket协议了,后面客户端和服务端之间的数据发送就无须建立TCP连接了,这和我们预料的是一致。

​ 但是困扰我们的一个问题:长连接在不发生异常的情况下可以维持多久?经过博主的测试,4个小时是没有任何问题的,具体多久就没有继续测试啦。。。而且,这个连接的保持应该有客户端来进行,可以定时的检查连接的状态,如果链接断开,可以重新建立连接,这样可以保证连接的畅通,事件可以及时的有服务端推送到客户端。

​ 下面我们来分析短连接,大家也也在思考一下困扰我们的问题:TCP短连接是什么时候断开的?结果可能和你预期的不太一样,下面我们一起来看下:

​ 接口代码如下:

@GetMapping("/create")
public String onCreate(){log.info("---------1111");return "OK";
}

​ 下面就是直接在浏览器上输入url,按下回车键,并请求五次,每次的时间间隔为3s左右,wireshark分析得到的数据包如下:


由上图我们可以看到,第一次调用接口时,创建了TCP连接,但是之后的每隔三秒的再次调用,是没有重新创建TCP连接的,而是使用了之前已经创建好的连接,最后,在经过一段时间后,TCP断开连接,因为wireshark中没有时间,我们截取原始的数据包来展示TCP断开连接的时间,

上图是一次Http请求的所有报文,也是一次TCP连接的建立和断开,从中我们可以看到,连接的建立和数据的发送很快就结束了,但是连接的断开时在数据发送结束差不多45s开始的,由客户端发送,ack 116,服务器端真正断开连接是在约一分钟后。

​ 是不是和你预料的结果不太一致呢?但是为什么会导致这个结果呢,大家看下面这张截图:

之前,在http/1.0中,一个服务器发送完http响应后,会断开TCP连接。但是这样每次请求都会重新建立和断开TCP连接,开销太大。所以虽然标准中没有设定,某些服务器对Connection:keep-alive的Header进行了支持。意思是说,完成这个HTTP请求后,不要断开HTTP请求使用的TCP连接。这样的好处是连接可以被重复使用,之后发送HTTP请求的时候就不用再重新建立TCP连接了。这也符合我们刚才截图中的结果,这样,如果我们频繁的请求,Http短连接也是可以满足需求的,可见在我们开发中,有很多问题都有人为我们考虑到了。

​ 我们可以做一个实验,修改请求头中的Connection,值改为close,这就需要我们在postMan中调用,结果如下图所示:

可以看到,连接的建立和断开非常的快,这也符合我们最开始的设想。

讲到这里,大家对长连接和短连接应该都很明白了,迷惑我们的两个问题也都很清楚了,希望本文能对大家有所帮助,如果有什么疑问,欢迎评论留言交流。

最后,原创不易,喜欢的话请点赞支持,谢谢。

通过tcpdump+wireshark来抓包分析TCP长连接和短连接的区别相关推荐

  1. 【大白话系列】图解TCP三次握手【使用wireshark工具抓包分析TCP三次交互流程】

    文章目录 1.首先准备好抓包工具wireshark 2.准备一段简单的socket程序 3.打开wireshark工具进行抓包 4.举例了解一下TCP报文段中的ACK和Seq的含义 5.流程分析 6. ...

  2. Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析

    Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析 一.介绍计算机网络体系结构 1.计算机的网络体系结构 在抓包分析TCP建立链接之前首先了解下计算机的网络通信的模型,我相信学习过计 ...

  3. 用wireshark抓包分析TCP协议的三次握手连接、四次握手断开

    用wireshark抓包分析TCP协议的三次握手连接.四次握手断开 一.TCP三次握手图解 二.TCP得四次挥手过程 三.用Fiddler抓包,分析验证一个HTTPS网站的TCP连接过程 一.TCP三 ...

  4. Wireshark抓包分析TCP连接、发送数据与断开过程

    准备工具: 1. 两台连接到同个局域网的电脑,或者虚拟机; 2. 在其中一台电脑安装Wireshark; 3. 在两台电脑上面都有TCP&UDP测试工具软件 TCP连接建立过程(三次握手): ...

  5. Wireshark数据抓包分析(网络协议篇)第1章网络协议抓包概述

    Wireshark数据抓包分析(网络协议篇)第1章网络协议抓包概述 网络协议是用于不同计算机之间进行网络通信的.网络协议是网络上所有设备(如网络服务器.计算机.交换机.路由器等)之间通信规则的集合,它 ...

  6. 接口协议之抓包分析 TCP 协议

    TCP 协议是在传输层中,一种面向连接的.可靠的.基于字节流的传输层通信协议. 环境准备 对接口测试工具进行分类,可以如下几类: 网络嗅探工具:tcpdump,wireshark 代理工具:fiddl ...

  7. Wireshark数据抓包分析——网络协议篇

    Wireshark数据抓包分析--网络协议篇 Wireshark是目前最受欢迎的抓包工具.它可以运行在Windows.Linux及MAC OS X操作系统中,并提供了友好的图形界面.同时,Wiresh ...

  8. 安卓模拟器BlueStacks+TCPdump对APP抓包分析

    2019独角兽企业重金招聘Python工程师标准>>> 安卓模拟器BlueStacks+TCPdump对APP抓包分析 博客分类: 抓包 最近要搞安卓APP抓包分析,在网上找了一些方 ...

  9. 实验十四:Wireshark数据抓包分析之ARP协议

    实验十四:Wireshark数据抓包分析之ARP协议 目录 一.实验目的及要求 二.实验原理 1.什么是ARP 2.ARP工作流程 3.ARP缓存表 三.实验环境 四.实验步骤及内容 实验步骤一 1. ...

  10. Wireshark数据抓包分析(网络协议篇)1.2安装Wireshark

    Wireshark数据抓包分析(网络协议篇)1.2安装Wireshark Wireshark(前称Ethereal)是一个网络包分析工具.该工具主要是用来捕获网络包,并显示包的详细情况.本节将分别介绍 ...

最新文章

  1. 6.2 IP子网划分
  2. Linux 下使用命令行查看 內核版本 | 系統版本 | cpu 位數 | 內存使用
  3. c++对象长度之静态数据成员(3)
  4. QT的QTextStream类的使用
  5. iOS 应用的生命周期
  6. 安装SQL2000 提示 以前的某个程序安装已在安装计算机上创建挂起的文件
  7. Java lambda expression
  8. 周鸿祎IOT发布会思考
  9. easyui控件事件监听委托给jquery事件监听,keyup取最新值问题
  10. 【codevs1074】食物链
  11. mysql的介绍和安装
  12. OpenCV-python学习笔记(三)——histograms直方图
  13. Windows下同步工具FastCopy
  14. 医咖会免费SPSS教程学习笔记—非参数检验之两相关样本
  15. 进程同步与互斥——吸烟者问题源码实现(cigarette smoker’s problem)
  16. 通灵学院|游戏设计研习9:游戏社群★(1500字)
  17. 医院预约挂号系统-系统结构
  18. SpringBoot 实现Excel文件解析
  19. php添加表格行列,excel表格怎么插行和列?
  20. 【保存】新装Win10后Edge、OneDrive无法登录微软账号解决办法

热门文章

  1. 微信朋友圈点赞生成器
  2. U盘写保护修复(亲测可用)
  3. Ubuntu下搭建Hadoop分布式集群
  4. java流分类_什么是流分类-JAVA中什么是流?流经常按照哪几种方式分类,每种方式又将流各分? 爱问知识人...
  5. leetcode 1336解题思路
  6. 操作系统 哲学家进餐问题
  7. 【博主推荐】HTML浪漫表白求爱(附源码)
  8. R语言-缺失值判断以及处理
  9. 循环群、对称群、陪集和拉格朗日定理、正规子群和商群
  10. 【黑盒测试用例设计方法5】正交试验法及其示例