| 庫 | 語言 | 特點 | 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 |
<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();
}
}
單個 pcap 包可能只有 HTTP 請求/響應的一部分 (TCP 分段)。生產環境需使用 TCP 流重組:
TcpStreamReassembler (實驗性)。TcpReassembly。tshark -r in.pcap -Y http -T fields -e http.request.full_uri -e http.response.code > out.txt 後用 Java 讀取文本。# 導出所有 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
org.apache.http:httpcore 的 HttpRequestParser),而非手寫字符串分割。