首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 解析 Wireshark pcap 文件提取 HTTP 頭:庫選型與代碼示例

     編輯:程式設計綜合問答

庫選型對比

庫語言特點Maven/Gradle 坐標
jNetPcap Java (JNI 封裝 libpcap) 功能全、性能高、需安裝本地 libpcap/WinPcap org.jnetpcap:jnetpcap:1.4.r1425 (需手動安裝到本地倉庫)
Pcap4J 純 Java (無本地依賴) 跨平台、API 現代、社區活躍、推薦 org.pcap4j:pcap4j-core:1.8.2
Netty + Netty-incubator-transport-native-epoll Java 高性能網絡框架,可解析 pcap 作為測試數據源 io.netty:netty-all:4.1.x

Pcap4J 完整示例:提取 HTTP Request Headers

<dependency>
    <groupId>org.pcap4j</groupId>
    <artifactId>pcap4j-core</artifactId>
    <version>1.8.2</version>
</dependency>

import org.pcap4j.core.*;
import org.pcap4j.packet.*;
import org.pcap4j.packet.namednumber.*;
import java.io.IOException;
import java.util.List;

public class PcapHttpParser {
    public static void main(String[] args) throws PcapNativeException, IOException {
        String file = "http_traffic.pcap";
        PcapHandle handle = Pcaps.openOffline(file);

        handle.loop(-1, packet -> {
            // 1. 解析以太網 -> IP -> TCP
            TcpPacket tcp = packet.get(TcpPacket.class);
            if (tcp == null) return;

            // 2. 過濾 HTTP 端口 (80, 8080, 8000 等)
            int srcPort = tcp.getHeader().getSrcPort().valueAsInt();
            int dstPort = tcp.getHeader().getDstPort().valueAsInt();
            if (!(dstPort == 80 || dstPort == 8080 || srcPort == 80 || srcPort == 8080)) return;

            // 3. 獲取 TCP Payload
            byte[] payload = tcp.getPayload() != null ? tcp.getPayload().getRawData() : new byte[0];
            if (payload.length == 0) return;

            // 4. 簡易 HTTP 解析 (實際建議用 HttpParser 庫)
            String http = new String(payload, StandardCharsets.US_ASCII);
            if (http.startsWith("GET ") || http.startsWith("POST ") || http.startsWith("HTTP/")) {
                System.out.println("=== HTTP Packet ===");
                System.out.println("Src: " + packet.get(IpV4Packet.class).getHeader().getSrcAddr());
                System.out.println("Dst: " + packet.get(IpV4Packet.class).getHeader().getDstAddr());
                // 只打印頭部
                String headers = http.split("\\r?\\n\\r?\\n")[0];
                System.out.println(headers);
            }
        });
        handle.close();
    }
}

進階:處理 TCP 流重組

單個 pcap 包可能只有 HTTP 請求/響應的一部分 (TCP 分段)。生產環境需使用 TCP 流重組:

  • Pcap4J 提供 TcpStreamReassembler (實驗性)。
  • 或使用 jNetPcap 內建 TcpReassembly。
  • 或將 pcap 轉換為文本 tshark -r in.pcap -Y http -T fields -e http.request.full_uri -e http.response.code > out.txt 後用 Java 讀取文本。

tshark 命令行快速導出 (無需寫代碼)

# 導出所有 HTTP 請求 URL、方法、狀態碼
tshark -r capture.pcap -Y "http.request" -T fields \
  -e frame.time -e ip.src -e ip.dst -e http.request.method -e http.request.full_uri -e http.host \
  -E header=y -E separator=, -E quote=d -E occurrence=f > http_requests.csv

# 導出 HTTP 響應頭 Content-Type、Content-Length
tshark -r capture.pcap -Y "http.response" -T fields \
  -e frame.time -e ip.src -e ip.dst -e http.response.code -e http.content_type -e http.content_length \
  -E header=y -E separator=, > http_responses.csv

總結

  1. 推薦 Pcap4J 純 Java 跨平台解析 pcap。
  2. HTTP 解析建議接入成熟解析器 (如 org.apache.http:httpcore 的 HttpRequestParser),而非手寫字符串分割。
  3. 大數據量/生產環境優先用 tshark 導出 CSV/JSON,Java 僅做後續業務處理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved