最近因为工作需要,研究了下如何使用tcpdump和wireshark分析业务流量。如果要使用tcpdump分析具体的HTTP请求耗时,需捕获网络数据包并分析时间戳信息,重点关注TCP连接的建立、HTTP请求发送到响应接收的全过程。
以下是具体步骤和技巧:
sudo tcpdump -i eth0 port 80 -s 0 -w http.pcap
sudo tcpdump -i eth0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
使用BPF过滤捕获HTTP方法(如GET/POST)。
示例:GET请求的十六进制值为0x47455420。
tcpdump -r http.pcap 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0'
计算SYN到SYN-ACK的间隔,反映网络延迟。
分析ACK确认时间:若ACK延迟高,可能网络拥塞或服务器处理慢。
过滤重传包: tcpdump -r http.pcap 'tcp[tcpflags] & tcp-ack != 0'
,重传多表明网络不稳定。
计算请求响应时间差
tcpdump -r http.pcap -tttt 'port 80' | grep -E 'GET|HTTP/1.1 200'
tcpdump -i eth0 -l -tttt port 80 | awk '
/GET/ { gsub(/[.:]/," "); start=$0 }
/HTTP\/1.1 200/ { gsub(/[.:]/," "); end=$0; print "耗时:", end - start "秒" }
'
实时输出每个请求的耗时(需调整时间格式解析)。
find /path -name "*.pcap" -mtime +1 -delete
。sudo tcpdump -i wlan0 -s 0 -w target.pcap '((tcp port 80 or tcp port 443) and host 192.168.3.77)'
#!/usr/bin/env python3
from scapy.all import rdpcap, TCP, IP
import sys
def analyze_pcap(pcap_file):
packets = rdpcap(pcap_file)
flows = {}
total_rx = 0
total_tx = 0
for pkt in packets:
if not (IP in pkt and TCP in pkt):
continue
src = pkt[IP].src
dst = pkt[IP].dst
sport = pkt[TCP].sport
dport = pkt[TCP].dport
# 创建唯一连接标识 (忽略端口顺序)
flow_id = tuple(sorted([(src, sport), (dst, dport)]))
# 流量统计
is_tx = src == "192.168.3.77" # 根据图片的 IP
flow = flows.setdefault(flow_id, {
"src_ip": src,
"dst_ip": dst,
"ports": (sport, dport),
"tx_bytes": 0,
"rx_bytes": 0,
"start": float(pkt.time),
"end": float(pkt.time)
})
pkt_size = len(pkt)
if is_tx:
flow["tx_bytes"] += pkt_size
total_tx += pkt_size
else:
flow["rx_bytes"] += pkt_size
total_rx += pkt_size
flow["start"] = min(flow["start"], float(pkt.time))
flow["end"] = max(flow["end"], float(pkt.time))
# 输出报表
print(f"\n 总流量分析 (目标IP: 192.168.3.77)")
print(f" 上传流量: {total_tx/1024:.2f} KB")
print(f" 下载流量: {total_rx/1024:.2f} KB")
print("\n 具体连接流量明细:")
for flow_id, data in flows.items():
duration = data["end"] - data["start"]
print(f"\n▶ 连接: {data['src_ip']}:{data['ports'][0]} -> {data['dst_ip']}:{data['ports'][1]}")
print(f" 持续时间: {duration:.3f} 秒")
print(f" 上传: {data['tx_bytes']} 字节")
print(f" 下载: {data['rx_bytes']} 字节")
print(f" 总流量: {data['tx_bytes'] + data['rx_bytes']} 字节")
if duration > 0:
print(f" 平均速率: {(data['tx_bytes'] + data['rx_bytes'])/duration/1024:.2f} KB/s")
if __name__ == "__main__":
if len(sys.argv) != 2:
print("用法: python3 traffic_analyzer.py " )
sys.exit(1)
analyze_pcap(sys.argv[1])
# 运行捕获程序 (Ctrl+C 停止)
sudo tcpdump -i wlan0 -s 0 -w my_request.pcap 'tcp and host 192.168.3.77'
python3 traffic_analyzer.py my_request.pcap
总流量分析 (目标IP: 192.168.3.77)
上传流量: 32.15 KB
下载流量: 125.48 KB
具体连接流量明细:
▶ 连接: 192.168.3.77:54562 -> 93.888.216.38:443
持续时间: 1.253 秒
上传: 32876 字节
下载: 128456 字节
总流量: 161332 字节
平均速率: 125.72 KB/s
pip install scapy
按需调整捕获命令中的过滤条件:
sudo tcpdump -i wlan0 'host example.com and tcp port 80'
sudo tcpdump -i wlan0 'tcp portrange 8000-9000'
192.168.3.77
发出的数据192.168.3.77
的数据该方案通过精确流量捕获和自动化分析,可帮助您定位具体请求的流量消耗和性能瓶颈。对于HTTPS流量,虽然无法解密内容,但仍可精确统计流量大小和时间特征。