当前位置: 首页 > news >正文

Linux流量分析:tcpdump wireshark

前言

最近因为工作需要,研究了下如何使用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深度分析

  1. 导入抓包文件:Wireshark http.pcap。
  2. 跟踪TCP流:
  • 右键数据包 → Follow → TCP Stream,关联请求/响应。
  • 查看时间轴(Time列),计算各阶段耗时(握手、首字节、传输)。
  1. 统计工具:
  • 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. 生产环境注意事项

  1. 性能影响:
  • 使用-c 1000限制包数量,避免磁盘溢出。
  • 过滤精确条件(如特定IP/端口),减少数据量。
  1. 安全与隐私:
  • 避免抓取敏感数据:-s 256只捕获头部。
  • 定期清理抓包文件:find /path -name "*.pcap" -mtime +1 -delete

💎 总结流程

  1. 精准抓包:指定接口、端口和过滤规则。
  2. 定位关键节点:握手、请求发送、响应接收的时间戳。
  3. 工具分析:
  • Wireshark:可视化时序和流量统计。
  • 命令行:结合grep/awk快速计算耗时。
  1. 优化策略:针对高延迟环节(如握手慢、重传多)深入排查。

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. 使用流程

  1. 捕获流量:
# 运行捕获程序 (Ctrl+C 停止)
sudo tcpdump -i wlan0 -s 0 -w my_request.pcap 'tcp and host 192.168.3.77'
  1. 执行分析:
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

⚠️ 重要说明

  1. 安装依赖:
pip install scapy
  1. 自定义过滤:

按需调整捕获命令中的过滤条件:

指定域名
sudo tcpdump -i wlan0 'host example.com and tcp port 80'
指定端口范围
sudo tcpdump -i wlan0 'tcp portrange 8000-9000'
  1. 流量方向说明:
  • TX (上传): 从 192.168.3.77 发出的数据
  • RX (下载): 发送到 192.168.3.77 的数据

该方案通过精确流量捕获和自动化分析,可帮助您定位具体请求的流量消耗和性能瓶颈。对于HTTPS流量,虽然无法解密内容,但仍可精确统计流量大小和时间特征。

http://www.lryc.cn/news/584325.html

相关文章:

  • EchoSight-Pro发布说明
  • 【网络】Linux 内核优化实战 - net.ipv4.tcp_fin_timeout
  • Android Coil 3 data加载图的Bitmap或ByteArray数据类型,Kotlin
  • 设计总监年中复盘:用Adobe XD内容识别布局,告别“手动调距”
  • 大模型在膀胱癌诊疗全流程预测及应用研究报告
  • HarmonyOS AI辅助编程工具(CodeGenie)UI生成
  • RabbitMQ 高级特性之消息分发
  • web 系统对接飞书三方登录完整步骤实战使用示例
  • 网络安全(初级)(1)
  • AI+低代码双引擎驱动:重构智能业务系统的产品逻辑
  • Fiddler中文版全面评测:功能亮点、使用场景与中文网资源整合指南
  • 深入理解机器学习
  • CPU调度调度算法
  • 链表算法之【合并两个有序链表】
  • Web后端开发工程师AI协作指南
  • 【java面试day4】redis缓存-数据持久化
  • AI赋能生活:深度解析与技术洞察
  • 【论文阅读】Decoupled Knowledge Distillation
  • Spring Boot 整合 RabbitMQ
  • 大语言模型驱动智能语音应答:技术演进与架构革新
  • Java Reference类及其实现类深度解析:原理、源码与性能优化实践
  • 聊一聊 Linux 上对函数进行 Hook 的两种方式
  • 使用EasyExcel动态合并单元格(模板方法)
  • Centos 7下使用C++使用Rdkafka库实现生产者消费者
  • Houdini 分布式解算效率瓶颈突破:渲染 101 云集群实战指南
  • 编程实践:单例模式(懒汉模式+饿汉模式)
  • 面试技术问题总结一
  • android TabLayout 标题栏切换 事件拦截
  • 【Linux系统】冯诺依曼体系结构 | 初识操作系统
  • Redis数据安全性分析