前言
最近因為工作需要,研究了下如何使用tcpdump和wireshark分析業務流量。如果要使用tcpdump分析具體的HTTP請求耗時,需捕獲網絡數據包并分析時間戳信息,重點關注TCP連接的建立、HTTP請求發送到響應接收的全過程。
以下是具體步驟和技巧:
🛠 1. 基礎抓包命令
捕獲HTTP流量
sudo tcpdump -i eth0 port 80 -s 0 -w http.pcap
- -i eth0:指定網卡(如any捕獲所有接口)。
- port 80:過濾HTTP流量(HTTPS用port 443)。
- -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。
? 2. 關鍵耗時分析點
TCP三次握手耗時
- 觀察點:SYN → SYN-ACK → ACK 的時間差。
- 過濾命令:
tcpdump -r http.pcap 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0'
計算SYN到SYN-ACK的間隔,反映網絡延遲。
HTTP請求到響應耗時
- 請求發送:捕獲GET/POST數據包的時間戳(T1)。
- 響應接收:捕獲HTTP/1.1 200響應頭的時間戳(T2)。
- 總耗時:T2 - T1 即HTTP請求處理時間。
- 技巧:用-A以ASCII顯示內容,快速定位請求/響應邊界。
TCP傳輸耗時
分析ACK確認時間:若ACK延遲高,可能網絡擁塞或服務器處理慢。
過濾重傳包: tcpdump -r http.pcap 'tcp[tcpflags] & tcp-ack != 0'
,重傳多表明網絡不穩定。
🔍 3. 使用Wireshark深度分析
- 導入抓包文件:Wireshark http.pcap。
- 跟蹤TCP流:
- 右鍵數據包 → Follow → TCP Stream,關聯請求/響應。
- 查看時間軸(Time列),計算各階段耗時(握手、首字節、傳輸)。
- 統計工具:
- Statistics → Flow Graph:可視化連接時序。
- Statistics → TCP Stream Graph:分析往返時間(RTT)和吞吐量。
? 4. 命令行高級分析
計算請求響應時間差
tcpdump -r http.pcap -tttt 'port 80' | grep -E 'GET|HTTP/1.1 200'
- -tttt:顯示完整時間戳(年-月-日 時:分:秒.微秒)。
- 手動計算相鄰GET和200 OK的時間差。
自動化統計(示例)
tcpdump -i eth0 -l -tttt port 80 | awk '/GET/ { gsub(/[.:]/," "); start=$0 }/HTTP\/1.1 200/ { gsub(/[.:]/," "); end=$0; print "耗時:", end - start "秒" }
'
實時輸出每個請求的耗時(需調整時間格式解析)。
?? 5. 生產環境注意事項
- 性能影響:
- 使用-c 1000限制包數量,避免磁盤溢出。
- 過濾精確條件(如特定IP/端口),減少數據量。
- 安全與隱私:
- 避免抓取敏感數據:-s 256只捕獲頭部。
- 定期清理抓包文件:
find /path -name "*.pcap" -mtime +1 -delete
。
💎 總結流程
- 精準抓包:指定接口、端口和過濾規則。
- 定位關鍵節點:握手、請求發送、響應接收的時間戳。
- 工具分析:
- Wireshark:可視化時序和流量統計。
- 命令行:結合grep/awk快速計算耗時。
- 優化策略:針對高延遲環節(如握手慢、重傳多)深入排查。
tcpdump實戰
🛠? 1. 捕獲特定請求的流量
sudo tcpdump -i wlan0 -s 0 -w target.pcap '((tcp port 80 or tcp port 443) and host 192.168.3.77)'
📊 2. 自動化分析腳本 (Python)
#!/usr/bin/env python3
from scapy.all import rdpcap, TCP, IP
import sysdef analyze_pcap(pcap_file):packets = rdpcap(pcap_file)flows = {}total_rx = 0total_tx = 0for pkt in packets:if not (IP in pkt and TCP in pkt): continuesrc = pkt[IP].srcdst = pkt[IP].dstsport = pkt[TCP].sportdport = pkt[TCP].dport# 創建唯一連接標識 (忽略端口順序)flow_id = tuple(sorted([(src, sport), (dst, dport)]))# 流量統計is_tx = src == "192.168.3.77" # 根據圖片的 IPflow = 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_sizetotal_tx += pkt_sizeelse:flow["rx_bytes"] += pkt_sizetotal_rx += pkt_sizeflow["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 <PCAP_FILE>")sys.exit(1)analyze_pcap(sys.argv[1])
?? 3. 使用流程
- 捕獲流量:
# 運行捕獲程序 (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
📝 4. 結果解讀示例
📊 總流量分析 (目標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'
- 流量方向說明:
- TX (上傳): 從
192.168.3.77
發出的數據 - RX (下載): 發送到
192.168.3.77
的數據
該方案通過精確流量捕獲和自動化分析,可幫助您定位具體請求的流量消耗和性能瓶頸。對于HTTPS流量,雖然無法解密內容,但仍可精確統計流量大小和時間特征。