Java抓包分析四(基于jnetpcap进行抓包)——分析Http请求数据包

article/2025/11/7 4:31:00

在上篇文章中Java抓包分析三(基于jnetpcap进行抓包)——抓取Http请求数据包,我们讲解了TCP三次握手的过程和如何抓取Http数据包,但是我们并没有进行一个数据分析,接下来这篇文章我们将要开始对Http抓取的数据报进行深入的分析。

文章目录

  • 1.预备知识
    • 1.1.OSI七层网络模型
    • 1.2.TCP/IP四层网络模型
  • 2.分析wireshark抓取的Http数据包
    • 2.1.Frame(物理层)
    • 2.2.Ethernet II(链路层)
    • 2.3.Internet Protocol Version 4(网络层)
    • 2.4.Transmission Control Protocol(传输层)
    • 2.5.Hypertext Transfer Protocol(应用层)
  • 3.分析jnetpcap抓取的Http数据包
    • 3.1.提取Ethernet II(链路层)数据包
    • 3.2.提取Internet Protocol Version 4(网络层)数据包
    • 3.3.提取Transmission Control Protocol(传输层)数据包
    • 3.4.提取Hypertext Transfer Protocol(应用层)数据包
    • 3.5.查看提取Http数据包效果

1.预备知识

1.1.OSI七层网络模型

在OSI七层网络模型中,将整个网络分成了七层(物数网传会表应),由于OSI是一种理论模型,这里我们不在展开讨论,仅作了解。

  1. OSI引入了服务、接口、协议、分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型;
  2. OSI先有模型,后有协议,先有标准,后进行实践;而TCP/IP则相反,先有协议和应用再提出了模型,且是参照的OSI模型;
  3. OSI是一种理论下的模型,而TCP/IP已被广泛使用,成为网络互联事实上的标准。
OSI使用协议
应用层(Application)HTTP、TFTP, FTP, NFS, WAIS、SMTP
表示层(PresentationTelnet, Rlogin, SNMP, Gopher
会话层(Session)SMTP, DNS
传输层(Transport)TCP, UDP
网络层(Network)IP, ICMP, ARP, RARP, AKP, UUCP
数据链路层(Data Link)FDDI, Ethernet, Arpanet, PDN, SLIP, PPP
物理层(Physical)IEEE 802.1A, IEEE 802.2到IEEE 802.11

1.2.TCP/IP四层网络模型

在.TCP/IP中,TCP/IP把物理层和数据链路层统一为数据链路层,把会话层、表示层、应用层统一为应用层。
在这里插入图片描述

2.分析wireshark抓取的Http数据包

通过wireshar抓包时,我们看到如下这些信息:Frame、Ethernet 、Internet Protocol、Transmission Control Protocol、Hypertext Transfer Protocol这里我们将展开进行分析他们究竟时什么。
在这里插入图片描述

字段含义
Frame物理层的数据帧概况
Ethernet II数据链路层以太网帧头部信息,一般包含源(本机)、目的地(服务器)物理地址(MAC)
Internet Protocol Version 4IPV4 互联网层IP包头部信息,一般包含源(本机)、目的地(服务器)IP地址。
Transmission Control Protocol传输层的数据段头部信息,此处是TCP、UDP协议,一般包含源(本机)、目的地(服务器)端口和连接状态。
Hypertext Transfer Protocol应用层的信息,如HTTP协议
如下篇幅较长,你要是没耐心,建议就直接跳过,但是需要记得住这几个点
从Ethernet II(链路层)中知道MAC地址
从Internet Protocol Version 4(网络层)知道IP地址
从Transmission Control Protocol(传输层)知道端口(TCP端口寻址自己去补课了,我这里不废话了)
从Hypertext Transfer Protocol(应用层)知道传输数据

2.1.Frame(物理层)

虽然处于最底层,却是整个开放系统的基础。物理层为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境。如果您想要用尽量少的词来记住这个第一层,那就是“信号和介质”。

2.2.Ethernet II(链路层)

通过我们使用wireshark珠宝,查看链路层,我们能看到三个特别直观的信息

  1. type:协议类型
  2. destination:目的地,也就是对方服务器MAC地址
  3. source:发起地,也就是你自己的MAC地址

在这里插入图片描述
(如果你知道MAC地址是啥,下面这堆废话你就跳过吧)
MAC 地址的英语是 Media Access Control Address,直译为媒体存取控制位址,也称为局域网地址(LAN Address)、以太网地址(Ethernet Address)或物理地址(Physical Address),它是一个用来确认网络设备位置的位址。

物理地址是一种标识符,用来标记网络中的每个设备。同现实生活中收发快递一样,网络内传输的所有数据包都会包含发送方和接收方的物理地址。

由于数据包中都会包含发送方和接收方的物理地址,数据包从起始地发送到目的地,为了能够正确地将数据包发送出去,就必须要求 MAC 地址具有唯一性。因此 MAC 地址都是由生产厂家在生产时固化在网络硬件中,是硬件预留的地址。

硬件的 MAC 地址是厂家按照一定的规则,进行设置所产生的,因此,MAC 地址拥有自己的格式。

MAC 地址采用十六进制数表示,共 6 个字节(48 位),长度为 48bit(字节)。整个地址可以分为前 24 位和后 24 位,代表不同的含义。
前 24 位称为组织唯一标识符(Organizationally Unique Identifier,OUI),是由 IEEE 的注册管理机构给不同厂家分配的代码,区分了不同的厂家。
后 24 位是由厂家自己分配的,称为扩展标识符。同一个厂家生产的网卡中 MAC 地址后 24 位是不同的。

2.3.Internet Protocol Version 4(网络层)

在网络层,我们可以看到,如下这堆信息,其他的可能看不懂,但是下面这个IP地址应该能看懂了
在这里插入图片描述
首先看下IPV4的一个数据包图(当然如果你不记得了,建议跳过,反正我也不想深入研究),这里涉及很多知识和网络的太多了,这里就不展开了,总之,我们在这里需要知道就是通信的IP地址。
在这里插入图片描述

2.4.Transmission Control Protocol(传输层)

在这里插入图片描述
这里东西太多了,我也不想说,放一个TCP数据包给你们瞅瞅,爱看就看,不爱看就拉到。三次握手,四次挥手这里都不废话了,看我以往的博客就行了,这里,我们就抓住一个重点,我们需要解析一个很重要的东西,那就是端口号,为什么是端口号嗯?不想说了,给你们看看软考架构师的一个考题,你们应该就知道了
在这里插入图片描述

2.5.Hypertext Transfer Protocol(应用层)

应用就很直观了,废话我就不多说了
在这里插入图片描述

3.分析jnetpcap抓取的Http数据包

3.1.提取Ethernet II(链路层)数据包

通过我们上述的分析,我们知道链路层有三个很重要的信息,那就是使用什么协议?目的地MAC地址多少?源MAC地址?
核心代码提取MAC地址

if(!packet.hasHeader(Ethernet.ID)) {return null;
}
Ethernet ethernet = packet.getHeader(new Ethernet())
int type = ethernet.typeEnum().getId();
String typeDes = ethernet.typeEnum().getDescription();
//需要注意,这里获取到的Mac地址不是16进制的,我们需要将其转化成16进制
byte[] sources = ethernet.source();
byte[] destinations = ethernet.destination();

byte[]MAC地址转字符串MAC地址

/*** @Description:将Mac地址的数组形式转换为字符串形式 (适用于线程安全的情况下)* @param* @author:hutao* @mail:hutao_2017@aliyun.com* @date:2021年9月9日*/public static String macBytesToString(byte[] macBytes) {StringBuilder builder = new StringBuilder();for (int i = 0; i < macBytes.length; i++) {String hexString = Integer.toHexString(0xFF & macBytes[i]);if(hexString.length()<2) {hexString = "0"+hexString;}builder.append(':').append(hexString);}return builder.substring(1);}

3.2.提取Internet Protocol Version 4(网络层)数据包

核心代码提取IP地址

if(!packet.hasHeader(Ip4.ID)) {return null;
}
Ip4 ip4 = packet.getHeader(new Ip4());
//这里获取的IP地址同样是byte[],而不是我们熟悉的十进制
byte[] sources = ip4.source();
byte[] destinations = ip4.destination();

将字节数组地址转为IP地址

import java.net.InetAddress;InetAddress sourceAddress = InetAddress.getByAddress(ip4.source();
String ipaddr= sourceAddress.getHostAddress();

3.3.提取Transmission Control Protocol(传输层)数据包

核心代码提取TCP端口号

if(!packet.hasHeader(Tcp.ID)) {return null;
}
Tcp tcp = packet.getHeader(new Tcp());
int sourcePort = tcp.source();
int destinationPort =tcp.destination();

3.4.提取Hypertext Transfer Protocol(应用层)数据包

	if(!packet.hasHeader(Http.ID)) {return null;}Http http = packet.getHeader(new Http());//获取当前http请求中存在的请求头参数String[] fieldArray = http.fieldArray();Map<String,String> fieldMap = new HashMap<>();for (String temp : fieldArray) {fieldMap.put(temp.toUpperCase(), temp);}//http请求头参数Map<String,String> httpParams = new ConcurrentHashMap<>();//获取http定义的请求头参数Request[] valuesKeys = Request.values();for (Request value : valuesKeys) {//使用hash进行匹配,将双重for变成一重forif(fieldMap.containsKey(value.name().toUpperCase().replace("_","-"))) {httpParams.put(value.toString(),http.fieldValue(value));}}//获取http中请求的传输报文if(http.hasPayload()) {try {byte[] payload = http.getPayload();String result = new String(payload,"UTF-8");} catch (Exception e) {e.printStackTrace();}}

3.5.查看提取Http数据包效果

请求接口准备,准备一个服务接口,这里示例的接口,将请求参数作为param参数返回给调用者。通过之前我们的分析,我们将会抓取到两个Http数据包,一个我们想服务接口发起的,一个是服务接口向我们发起的。
在这里插入图片描述
我们向服务接口发起的请求数据包提取结果
在这里插入图片描述
服务器向我们发起请求
在这里插入图片描述
至此使用Jnetpcap对http进行请求抓包过程完毕。通过这四篇文章,相信大家也能按照某个协议进行数据抓取和解析了。

完整代码,需要的滴滴滴,不需要积分
https://download.csdn.net/download/m0_37892044/67616418
在这里插入图片描述


http://chatgpt.dhexx.cn/article/LIMrYvAi.shtml

相关文章

【HTTP】Fiddler(二) - 使用Fiddler做抓包分析

上文( http://blog.csdn.net/ohmygirl/article/details/17846199 )中已经介绍了Fiddler的原理和软件界面。本文主要针对Fiddler的抓包处理。 Fiddler抓取HTTP请求。 抓包是Fiddler的最基本的应用,以本博客为例,启动Fiddler之后,在浏览器中输入http://blog.csdn.net/ohmygi…

MySQL索引优化实战EXPLAIN解析

先来介绍一下具体的业务场景 当用户登录后&#xff0c;需要查看能够学习的课程&#xff0c;不同的用户看到的课程是不同的&#xff0c;课程存在权限&#xff0c;权限是被下面lesson_user_permissions表控制的&#xff0c;其中sys_user_id 和 lesson_id 作为联合主键 另外还有一…

MySQL索引优化面试题

mysql索引优化熊大注意我们是以innodb为例 创建表sql如下: CREATE TABLE user (id bigint(11) NOT NULL AUTO_INCREMENT COMMENT 主键,age int(10) NOT NULL COMMENT 年龄,name varchar(100) NOT NULL COMMENT 姓名,card_no varchar(64) CHARACTER SET utf8 COLLATE utf8_gen…

【MySQL】深入理解MySQL索引优化器工作原理

本文导读 本文将解读MySQL数据库查询优化器&#xff08;CBO&#xff09;的工作原理。简单介绍了MySQL Server的组成&#xff0c;MySQL优化器选择索引额原理以及SQL成本分析&#xff0c;最后通过 select 查询总结整个查询过程。 一、MySQL 优化器是如何选择索引的 下面我们来…

MySQL索引优化与查询优化

1. 索引失效案例 1 全值匹配 2 最佳左前缀法则 3 主键插入顺序 如果 这个数据页已经满了,我们需要把当前 页面分裂 成两个页面&#xff0c;把本页中的一些记录移动到新创建的这个页中。页面分裂和记录移位意味着&#xff1a;性能损耗 &#xff01;所以如果我们想尽量避免这样…

mysql索引优化系列(一)

一、不常见的索引失效场景 1、举例 还是之前的member会员记录表&#xff0c;往里面插入十万条数据 drop procedure if exists insert_emp; CREATE PROCEDURE insert_emp () BEGINDECLAREi INT;SET i 1;WHILE( i < 100000 ) DOINSERT INTO member ( NAME, age, address, …

MySQL索引优化一

MySQL索引 索引是什么 索引是一种排好序的数据结构&#xff0c;目的是提高查找效率一般来说&#xff0c;索引本身也占内存&#xff0c;因此索引以文件的形式存储在磁盘上平常我们所说的索引一般都是BTree。当然还有hash索引等等 索引优劣势 优势&#xff1a;提高检索效率&a…

MYSQL索引详解和优化

索引的定义 我们在看书的时候&#xff0c;都知道有目录&#xff0c;我们可以通过目录快速的找到书中的内容&#xff0c;而书中的目录就是充当书的索引。在数据库中的索引也是一样的。 索引的定义&#xff1a; 索引是帮助存储引擎快速获取数据的一种数据结构&#xff0c;即数据…

一文彻底搞懂Mysql索引优化

专属小彩蛋&#xff1a;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff08;前言 - 床长人工智能教程&#xff09; 目录 一、索引介绍 二、性能分析 三、查询优化 四、排序优化…

MYSQL通过索引进行优化

MYSQL通过索引进行优化 一&#xff1a;什么是索引&#xff1a; 在关系数据库中&#xff0c;索引是一种与表有关的数据库结构&#xff0c;它可以使对应于表的 SQL 语句执行得更快。索引的作用相当于图书的目录&#xff0c;可以根据目录中的页码快速找到所需的内容。 对于数据…

MySQL索引优化(超详细)

Mysql索引优化 1 索引介绍 1.1 什么时MySQL的索引 ​ MySQL官方对于索引的定义:索引是帮助MySQL高效获取数据的数据结构。 ​ MySQL在存储数据之外&#xff0c;数据库系统中还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种引用(指向)表中的数据&#xff…

MySQL索引(二)索引优化方案有哪些

在上一篇文章中&#xff0c;我们介绍了MySQL中常见的索引类型以及每种索引的各自特点&#xff0c;那么这篇文章带你来与我一起看一下聚集索引与二级索引的关系&#xff0c;最后在附上常见的索引优化方案。首先我们还是看一下聚集索引和二级索引的区别 MySQL索引&#xff08;一…

【MySQL】索引优化原则

前面几篇博文谈到索引使用场景和explain命令帮助我们分析索引的执行情况&#xff0c;今天进入正题&#xff0c;来谈谈索引优化的原则。 1、全值匹配 查询语句尽量使用全值匹配。 2、左前缀原则 如果一个索引是组合索引&#xff0c;索引了多列&#xff0c;要遵循左前缀原则…

MySQL:索引优化、查询优化

一、哪些情况适合创建索引 1、字段的数值有唯一性的限制&#xff1b; 业务上具有唯一特性的字段&#xff0c;即使是组合字段&#xff0c;也必须建成唯一索引&#xff1b; 说明&#xff1a;创建唯一索引会影响添加的速度&#xff08;在添加的时候会维护索引&#xff09;&…

Mysql-索引优化

一、索引基本知识 1、索引的优点 很大程度上减少服务器扫描的数据量很大程度上避免服务器排序和临时表将随机IO变成顺序IO 2、索引的用处 使用索引列可以快速查找Where条件的行数据 mysql> explain select * from emp where empno 7469; ----------------------------…

MySQL索引优化总结

前言&#xff1a;相信大家都知道索引可以大大提高MySQL的检索速度&#xff0c;但是真正在平时工作中写SQL&#xff0c;真的会考虑到这条SQL如何能够用上索引提升执行效率&#xff1f;本篇博客详细的介绍了索引优化的20个原则&#xff0c;只要在工作中能够随时应用到&#xff0c…

【MySQL】深入理解MySQL索引优化器原理(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

mysql 索引优化

一、mysql索引建立原则 二、通过 EXPLAIN 分析 SQL 执行计划 可以知道以下内容&#xff1a; 假设现在我们使用 EXPLAIN 命令查看当前 SQL 是否使用了索引&#xff0c;先通过 SQL EXPLAIN 导出相应的执行计划如下&#xff1a; 下面对图示中的每一个字段进行一个说明&#x…

【MySQL】MySQL索引优化——从原理分析到实践对比

目录 使用TRACE分析MySQL优化 开启TRACE TRACE 结果集 ORDER BY & GROUP BY 优化 优化方式 分页优化 不同场景的优化方式 JOIN关联优化 算法介绍 优化方式 COUNT优化 优化方式 使用TRACE分析MySQL优化 某些情况下&#xff0c;MySQL是否走索引是不确定的[,,_,,…

MySQL索引常见面试题(2022版)

目录 为什么要建立索引&#xff1f; 哪些情况适合建立索引&#xff1f; 哪些情况下不适合建索引&#xff1f; 为什么索引是使用B树&#xff1f;&#xff08;重点&#xff09; 索引分为那几类&#xff1f; 什么是聚簇索引&#xff1f;&#xff08;重点&#xff09; 使用聚…