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

在上篇文章中Java抓包分析三(基于jnetpcap进行抓包)——抓取Http请求数据包,我们讲解了TCP三次握手的过程和如何抓取Http数据包,但是我们并没有进行一个数据分析,接下来这篇文章我们将要开始对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变成一重for
			if(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
在这里插入图片描述

  • 19
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 29
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值