当前位置: 首页 > news >正文

通过Wireshark抓包分析,体验HTTP请求的一次完整交互过程

目录

一、关于Wireshark

1.1、 什么是Wireshark

1.2、下载及安装

二、HTTP介绍

2.1、HTTP请求过程介绍

2.2 、TCP协议基础知识

2.2.1、概念介绍

2.2.2、TCP协议的工作原理

2.2.3、三次握手建立连接

 2.3.4、四次挥手断开连接

2.3、Wireshark抓包分析过程

2.3.1、三次握手

2.3.2、发送请求

2.3.3、服务器响应

2.3.4、四次挥手


一、关于Wireshark

1.1、 什么是Wireshark

Wireshark(前身 Ethereal)是一个网络包分析工具。该工具主要是用来捕获网络数据包,并自动解析数据包,为用户显示数据包的详细信息,供用户对数据包进行分析。

它可以运行在 Windows 和 Linux 操作系统上。可以使用该工具捕获并分析各类协议数据包,本文将讲解该工具的安装及基本使用方法。

1.2、下载及安装


Kali Linux 系统自带 Wireshark 工具,而 Windows 系统中默认没有安装该工具。因此,本节讲解如何在 Windows 系统中安装 Wireshark 工具。

  1. 打开网址 http://www.wireshark.org,进入 Wireshark 官网,如图所示。

  2. 选择合适的平台进行下载

  3. 一直下一步安装即可,安装完打开Wireshark,如下:

二、HTTP介绍

HTTP(HyperText Transfer Protocol,超文本传输协议)是用于传输超文本信息的协议,它是互联网上应用最为广泛的一种网络协议。了解完整的HTTP请求过程有助于我们更深层次的去分析问题(尤其是网络安全问题),同时也更能清楚为什么现在网站很少再用HTTP了,而改为使用更为安全的HTTPS协议。

2.1、HTTP请求过程介绍

HTTP连接本质就是使用TCP协议建立起的可靠连接进行请求发送与请求响应。HTTP请求过程大致可以分为五个步骤(见上图),每个步骤细节如下:

  1. DNS解析:当客户端(如浏览器)尝试访问一个网站时,它首先会尝试从本地缓存中查找域名对应的IP地址。如果本地缓存中没有找到,客户端会发送DNS查询请求到本地的DNS服务器。
  2.  建立TCP连接:客户端(如浏览器)向服务器发起连接请求,通常使用TCP/IP协议建立一个到服务器的TCP连接。这个过程称为三次握手(Three-way handshake),确保连接的可靠性。
  3. 客户端发送请求:客户端向服务器发送HTTP请求消息。
  4.  服务端响应请求:服务器接收到请求后,会检查请求头和请求体,然后根据请求方法(如GET、POST)和资源路径来决定如何响应。
  5. 释放TCP连接:请求完成后,客户端和服务器可以关闭连接。

2.2 、TCP协议基础知识

2.2.1、概念介绍

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP是互联网核心协议之一,位于OSI模型的传输层,负责在互联网上的计算机之间提供可靠的数据传输服务

2.2.2、TCP协议的工作原理

TCP连接的建立与断开,正常过程至少需要客户端与服务端来回发送7个包(请求)才能完成。其中客户端发送4个(1、3、4、7),服务端发送3个(2,5,6),具体原理参照下图。

传输控制依赖首部包含的6个标志:

  • URG:紧急指针
  • ACK:确认序号是否有效
  • PSH:接收方应尽快将这个报文段交给应用层
  • RST:重建连接
  • SYN:同步序号用来发起一个连接
  • FIN:发送端完成发送任务

2.2.3、三次握手建立连接

TCP建立连接的过程,包括客户端和服务器总共发送3个包,此过程称为三次握手

  • 第一次握手:客户端发送一个带有SYN标志的TCP段,请求与服务器建立连接。

  • 第二次握手:服务器接收到SYN请求后,发送一个带有SYN和ACK标志的TCP段作为响应。

  • 第三次握手:客户端接收到服务器的SYN+ACK响应后,发送一个带有ACK标志的TCP段,完成连接建立。

三次握手完成后便建立了TCP连接,便可进行数据传输,TCP负责将数据分割为多个段(Segment),并按顺序发送。

 2.3.4、四次挥手断开连接

TCP断开连接的过程,包括客户端和服务器总共发送4个包,此过程称为四次挥手

  • 第一次挥手:客户端发送一个带有FIN标志的TCP段,请求断开连接;

  • 第二次挥手:服务器接收到FIN请求后,发送一个带有ACK标志的TCP段作为响应;

  • 第三次挥手:服务器发送一个带有FIN标志的TCP段,请求断开连接;

  • 第四次挥手:客户端接收到服务器的FIN请求后,发送一个带有ACK标志的TCP段,完成连接断开。

2.3、Wireshark抓包分析过程

①打开Wireshark工具,选择以太网

因为此时捕获的是本地网络,所以会有很多信息,先不管

②打开cmd窗口,以此执行 ping www.baidu.com,然后执行curl www.baidu.com

到这里,我们执行的这两条命令,Wireshark也已经捕获到了,

为避免其他无用的数据包影响分析,可在显示过滤器(display filter)输入过滤条件ip.addr== ip.addr==157.0.148.3 (来自ping返回的百度ip),过滤与百度发生交互的数据包:

上半部分是ping命令的数据包,不管,下面的是curl命令的数据包,我们以此来分析TCP连接的三次握手和四次挥手。

2.3.1、三次握手

前三个包完成了三次握手,建立了连接。

  • 第一个包是「第一次握手」:我(192.168.1.52)向百度(157.0.148.3)发送一个 SYN ,表示这是一个「建立连接的请求」;

  • 第二个包是「第二次握手」:百度(157.0.148.3)响应我(192.168.1.52)一个 SYN+ACK ,表示这是一个「接受连接的应答」;

  • 第三个包是「第三次握手」:我(192.168.1.52)向百度(157.0.148.3)发送一个 ACK ,表示这一个「确认请求」。

发送完确认请求后,我开启到百度的单向连接通道,百度收到我的确认请求后,就开启到我这边的单向连接通道,两边通道都开启以后,就可以通信了。

2.3.2、发送请求

第一个HTTP协议包(序号103)执行了HTTP 的GET请求。

客户端向服务器发送HTTP请求消息。请求消息通常包括以下部分:

  • 请求行:包含请求方法(如GET、POST)、请求的资源路径、HTTP版本。

  • 请求头:包含客户端信息、请求参数等,例如User-Agent、Accept、Cookie等。

  • 请求体:对于某些请求方法(如POST),可能包含额外的数据,用于向服务器发送信息。

点开请求行,看里面的三个字段,下图所示:

  • Request Method:请求方法,这里的请求方法是GET;

  • Request URI:请求的URI,没指定默认是/,因为我们只请求了域名www.baidu.com,并没指定要获取的资源,所以是默认的/

  • Request Version:请求的版本,因为用的是HTTP协议,所以这里显示HTTP协议的版本。

再看下面的几个请求头:

  • Host:目标主机;

  • User-Agent:用户代理,也就是浏览器的类型。由于我们没用浏览器,所以这里显示的是命令curl,版本为8.9.1;

  • Accept:浏览器可接受的MIME(Multipurpose Internet Mail Extensions)类型。

    浏览器通常使用 MIME 类型(而不是文件扩展名)来确定如何处理URL,因此 We b服务器在响应头中添加正确的 MIME 类型非常重要。如果配置不正确,浏览器可能会无法解析文件内容,网站将无法正常工作,并且下载的文件也会被错误处理。

2.3.3、服务器响应

第二个HTTP协议包(序号106)执行了HTTP响应。

 

  • 状态行:包含版本和响应状态码、状态信息;

  • 响应头:包含响应的服务器的资源信息,一行一个响应头;

  • 响应空行:用来间隔/区分响应头和响应体;

  • 响应体:服务器响应的内容,通常是一个HTML页面的代码或者给客户端的数据,上图中可以看到本次响应的内容是一个文件数据(File Data)。

点开状态行,可以看到里面有三个字段:

  • Response Version:响应版本,因为使用的是HTTP协议,所以这里显示了HTTP的版本;

  • Status Code:响应状态码,这里的 200 表示请求成功;

  • Response Phrase:响应状态码的提示信息。

最后看下几个响应头:


 

  • Accept-Ranges: 告知客户端资源是否支持范围请求。当前取值bytes表明资源支持范围请求,可以使用Range头进行请求。

  • Cache-Control: 控制缓存行为,包括是否缓存、缓存的有效期、缓存策略等。

  • Connection: 服务器是否需要保持连接。

    keep-alive表示服务器希望在发送响应后不立即关闭连接,而是保持连接状态以供后续请求复用。这种设置可以提高服务器的响应效率,减少TCP连接的建立和断开的开销,特别是在处理大量并发请求的场景下。

  • Content-Length: 响应内容的字节数,本例是2381字节。

  • Content-Type: 响应内容的类型和编码方式,text/html。

  • Date: 指示响应消息生成的时间。

  • Etag: 资源的实体标签(Entity Tag),用于缓存控制和验证。

  • Last-Modified: 资源的最后修改时间

  • Pragma: 历史遗留的HTTP头,它最初用于缓存控制,但现在已不推荐使用。取值no-cache表明不使用缓存。

  • Server: 服务器的名称或版本。

  • Set-Cookie: 用于设置客户端的Cookie

当打开响应体,会发现它的内容是明文的,对于机密通信来说HTTP通信很容易产生信息泄露。另外,以上介绍的整个交互过程中并不验证通信方的身份,第三方可以冒充他人身份参与通信。后续会发图文详解,带你搞清楚HTTPS协议的工作机制。

2.3.4、四次挥手

最后四个包通过四次挥手断开了连接。

  • 第一个包是「第一次挥手」:我(192.168.1.52)向百度(157.0.148.3)发送一个「FIN+ACK」,表示这是一个「释放连接」的请求;

  • 第二个包是「第二次挥手」:百度(157.0.148.3)向我(192.168.1.52)响应一个「ACK」,表示这是一个「确认请求」,我收到后,就会释放我到百度的单向连接;

  • 第三个包是「第三次挥手」:百度(157.0.148.3)向我(192.168.1.52)发送一个「FIN+ACK」,表示这是一个「释放连接」的请求;

  • 第四个包是「第四次挥手」:我(192.168.1.52)向百度(36.155.132.76)响应一个「ACK」,表示这是一个「确认请求」,百度收到后,就会释放到我这边的单向连接。

 双向的连接都释放后,TCP连接就关闭了(对于本例来说就是百度响应结束),此次通信结束。

http://www.lryc.cn/news/476336.html

相关文章:

  • Requestium:Python中的Web自动化新贵
  • 2024版红娘金媒10.3婚恋相亲系统源码小程序(亲测)
  • k8s-实战——ES集群部署
  • 无人机的就业前景怎么样?
  • 【学习】软件测试中V模型、W模型、螺旋模型三者介绍
  • Kafka存储机制大揭秘:从日志结构到清理策略的全面解析
  • 显卡服务器和普通服务器之间的区别有哪些?
  • 国产科技里程碑:自主算力走向世界,“表格编程”横空出世
  • 人工智能如何改变未来生活:从医疗到日常的全面升级
  • 第112届全国糖酒会(3月成都)正式官宣!
  • NFT Insider #154:The Sandbox Alpha 4 第四周开启,NBA Topshot NFT 销量激增至新高
  • 【Canal 中间件】Canal 实现 MySQL 增量数据的异步缓存更新
  • 独立开发的个人品牌打造:个人IP与独立开发的结合
  • 每天一题:洛谷P2002 消息扩散
  • 【深度学习】用LSTM写诗,生成式的方式写诗系列之一
  • HomeAssistant自定义组件学习-【二】
  • 如何看待AI技术的应用前景?
  • Unity中的屏幕坐标系
  • 标题点击可跳转网页
  • 易语言模拟真人动态生成鼠标滑动路径
  • Linux:生态与软件安装
  • R 语言与其他编程语言的区别
  • RC低通滤波器Bode图分析(传递函数零极点)
  • 基于深度学习的网络入侵检测
  • 《构建一个具备从后端数据库获取数据并再前端显示的内容页面:前后端实现解析》
  • Rust 力扣 - 59. 螺旋矩阵 II
  • 2.4w字 —TS入门教程
  • java: 未结束的字符文字 报错及解决:将编码全部改为UTF-8或者GBK
  • Android平台RTSP转RTMP推送之采集麦克风音频转发
  • 认证鉴权框架之—sa-token