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是一種理論模型,這里我們不在展開討論,僅作了解。
| 應用層(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珠寶,查看鏈路層,我們能看到三個特別直觀的信息
(如果你知道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地址
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
總結
以上是生活随笔為你收集整理的Java抓包分析四(基于jnetpcap进行抓包)——分析Http请求数据包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 名帖04 李阳冰 篆书《城隍庙碑》
- 下一篇: 女生找工作,非常有用,好好 收藏,以后肯