数据包"/>
Java抓包分析四(基于jnetpcap进行抓包)——分析Http请求数据包
在上篇文章中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是一种理论模型,这里我们不在展开讨论,仅作了解。
- OSI引入了服务、接口、协议、分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型;
- OSI先有模型,后有协议,先有标准,后进行实践;而TCP/IP则相反,先有协议和应用再提出了模型,且是参照的OSI模型;
- OSI是一种理论下的模型,而TCP/IP已被广泛使用,成为网络互联事实上的标准。
OSI | 使用协议 |
---|---|
应用层(Application) | HTTP、TFTP, FTP, NFS, WAIS、SMTP |
表示层(Presentation | Telnet, 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 4 | IPV4 互联网层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珠宝,查看链路层,我们能看到三个特别直观的信息
- type:协议类型
- destination:目的地,也就是对方服务器MAC地址
- 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进行请求抓包过程完毕。通过这四篇文章,相信大家也能按照某个协议进行数据抓取和解析了。
完整代码,需要的滴滴滴,不需要积分
更多推荐
Java抓包分析四(基于jnetpcap进行抓包)——分析Http请求数据包
发布评论